二次フィット取引シグナル戦略


作成日: 2023-09-23 15:40:57 最終変更日: 2023-09-23 15:40:57
コピー: 2 クリック数: 627
1
フォロー
1617
フォロワー

概要

この戦略は,二次曲線のマッチングK線高低点を利用して取引信号を形成する.実際の価格がマッチング曲線を突破すると,購入と販売の信号を生成する.この戦略は,数学モデルを使用して重要なサポートと抵抗を識別し,取引を突破しようとする.

戦略原則

戦略の主要要素と規則は以下の通りです.

  1. 合致高低点:二次曲線の最小二乗を用いてK線合致高低点。

  2. 買取信号:K線閉盘価格が上軌道曲線を突破すると買取信号が生じる.

  3. 売り込み信号:K線閉盘価格が下位曲線を破るときに売り込み信号が発生する.

  4. Nサイクル検証:突破が継続するNサイクルが有効になるために要求され,偽突破を避ける.

  5. 平仓シグナル:明確な平仓シグナルがないため,反測最適化により,保有時間を決定する.

この戦略は,数学的なモデルを使って重要な価格を識別し,突破時に入場しようとし,典型的な突破システムに属している.

優位分析

この戦略は,他の突破システムと比べると,以下の利点があります.

  1. 数学モデルを使って,主観的な判断よりも客観的な判断をする.

  2. 取引技術と統計モデルの融合により,新しい方法が開発されました.

  3. マルチサイクル検証を導入し,偽突破をフィルタリングする.

  4. ポジションを保持する最適な時間を見つけるための回帰最適化.

  5. 実現の難しさはあまりなく,柔軟に調整できます.

  6. モデルの更新は自動で,手作業によるメンテナンスも不要です.

  7. 異なる品種と周期のパラメータの健気性をテストできます.

  8. 機械学習を導入してさらに最適化と検証が可能である.

  9. 総じて,新鮮なものが多く,探求価値があります.

リスク分析

しかし,この戦略には次のリスクもあります.

  1. 適合効果は,パラメータ選択によって決定され,過度に最適化される可能性があります.

  2. 適合曲線が遅れているため,損失を完全に回避することはできません.

  3. 取引額を考慮しない場合,スコープされるリスクがあります.

  4. 統計アベरेजは長期にわたって安定して余分な利益を得ることが困難である.

  5. モデルが安定しているかどうかを確認するために,回帰周期は短い.

  6. 多種環境への適応は検証される.

  7. 固定ポジションは動的に調整できません.

  8. 利回り率は厳密に評価する必要があります.

最適化の方向

分析の結果,この戦略は以下の点で改善できる:

  1. 異なる市場環境でパラメータの強さをテストする.

  2. 取引量検証指標に加入する

  3. 信号の質を向上させるため,出場ロジックを最適化する.

  4. 動的ポジション管理モデルの構築

  5. 損失を制限する Stop Loss 戦略を導入する.

  6. 資金管理戦略の最適化

  7. 返信ウィンドウのスクロールを確認

  8. 多種種の安定収益性を評価する.

  9. 機械学習によるモデルの最適化

要約する

この戦略は,全体として,ある程度の革新性と実験的価値を有している.しかし,Statistical Arbitrageの長期の安定した利益は,まだ試験に直面している.戦略の安定性,リスク・収益状況の全面的な見直しが必要である.過度な適応を防止し,戦略が変動する市場において適応力を維持するために.

ストラテジーソースコード
/*backtest
start: 2023-08-23 00:00:00
end: 2023-09-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

strategy(title = " Strategy Quadratic Semaphore ",
         shorttitle = "SQS",
         overlay = true,
         precision = 8,
         calc_on_order_fills = true,
         calc_on_every_tick = true,
         backtest_fill_limits_assumption = 0,
         default_qty_type = strategy.fixed,
         default_qty_value = 2,
         initial_capital = 10000,
         pyramiding=5,
         currency = currency.USD,
         linktoseries = true)

//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

backTestSectionFrom = input(title = "═══════════════ From ═══════════════", defval = true, type = input.bool)

FromMonth         = input(defval = 1, title = "Month", minval = 1)
FromDay           = input(defval = 1, title = "Day", minval = 1)
FromYear          = input(defval = 2019, title = "Year", minval = 2014)

backTestSectionTo = input(title = "════════════════ To ════════════════", defval = true, type = input.bool)
ToMonth           = input(defval = 31, title = "Month", minval = 1)
ToDay             = input(defval = 12, title = "Day", minval = 1)
ToYear            = input(defval = 9999, title = "Year", minval = 2014)

Config            = input(title = "══════════════ Config ══════════════", defval = true, type = input.bool)
p = input(6)
length = input(30)
//
backTestPeriod() => (time > timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time < timestamp(ToYear, ToMonth, ToDay, 23, 59))
//
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

x1 = bar_index
x2 = sqrt(x1)
y = high
//
S11 = sum(x2,length) - sqrt(sum(x1,length)) / length  
S12 = sum(x1*x2,length) - (sum(x1,length) * sum(x2,length)) / length  
S22 = sum(sqrt(x2),length) - sqrt(sum(x2,length)) / length            
Sy1 = sum (y*x1,length) - (sum(y,length) * sum(x1,length)) / length   
Sy2 = sum (y*x2,length) - (sum(y,length) * sum(x2,length)) / length   
//
max1 = sma(x1,length) 
max2 = sma(x2,length)
may = sma(y,length)
b2 = ((Sy1 * S22) - (Sy2*S12))/(S22*S11 - sqrt(S12))
b3 = ((Sy2 * S11) - (Sy1 * S12))/(S22 * S11 - sqrt(S12))
b1 = may - b2*max1 - b3*max2
qr = b1 + b2*x1 + b3*x2
//
yl = low
//
Sy1l = sum(yl*x1,length) - (sum(yl,length) * sum(x1,length)) / length  
Sy2l = sum(yl*x2,length) - (sum(yl,length) * sum(x2,length)) / length  
//
mayl = sma(yl,length)
b2l = ((Sy1l * S22) - (Sy2l*S12))/(S22*S11 - sqrt(S12))
b3l = ((Sy2l * S11) - (Sy1l * S12))/(S22 * S11 - sqrt(S12))
b1l = mayl - b2l*max1 - b3l*max2
qrl = b1l + b2l*x1 + b3l*x2
//
period = round(p/2)+1
hh = qr[period]
ll = qrl[period]
countH = 0
countL = 0
buy=0
sell=0
//
for i = 1 to period-1
    if qr[i]<hh
        countH:=countH+1
    if qrl[i]>ll
        countL:=countL+1

for i = period+1 to p+1
    if qr[i]<hh
        countH:=countH+1
    if qrl[i]>ll
        countL:=countL+1

if countH==p
    pivotH = high[period]
    buy := 1
    
if countL==p
    pivotL = low[period]
    sell := 1
//    
plotshape(buy == 1 , text='💣', style=shape.arrowup, location=location.belowbar, color=#32CD32, textcolor=color.white, offset=0, transp=0,size=size.auto)
plotshape(sell == 1 , text='🔨', style=shape.arrowdown, location=location.abovebar, color=#FF0000, textcolor=color.white, offset=0, transp=0,size=size.auto)
//

if (backTestPeriod())
    strategy.entry("long", true, 1, when = buy == 1)
    strategy.entry("short", false, 1, when = sell == 1)