この戦略は,二次曲線のマッチングK線高低点を利用して取引信号を形成する.実際の価格がマッチング曲線を突破すると,購入と販売の信号を生成する.この戦略は,数学モデルを使用して重要なサポートと抵抗を識別し,取引を突破しようとする.
戦略の主要要素と規則は以下の通りです.
合致高低点:二次曲線の最小二乗を用いてK線合致高低点。
買取信号:K線閉盘価格が上軌道曲線を突破すると買取信号が生じる.
売り込み信号:K線閉盘価格が下位曲線を破るときに売り込み信号が発生する.
Nサイクル検証:突破が継続するNサイクルが有効になるために要求され,偽突破を避ける.
平仓シグナル:明確な平仓シグナルがないため,反測最適化により,保有時間を決定する.
この戦略は,数学的なモデルを使って重要な価格を識別し,突破時に入場しようとし,典型的な突破システムに属している.
この戦略は,他の突破システムと比べると,以下の利点があります.
数学モデルを使って,主観的な判断よりも客観的な判断をする.
取引技術と統計モデルの融合により,新しい方法が開発されました.
マルチサイクル検証を導入し,偽突破をフィルタリングする.
ポジションを保持する最適な時間を見つけるための回帰最適化.
実現の難しさはあまりなく,柔軟に調整できます.
モデルの更新は自動で,手作業によるメンテナンスも不要です.
異なる品種と周期のパラメータの健気性をテストできます.
機械学習を導入してさらに最適化と検証が可能である.
総じて,新鮮なものが多く,探求価値があります.
しかし,この戦略には次のリスクもあります.
適合効果は,パラメータ選択によって決定され,過度に最適化される可能性があります.
適合曲線が遅れているため,損失を完全に回避することはできません.
取引額を考慮しない場合,スコープされるリスクがあります.
統計アベरेजは長期にわたって安定して余分な利益を得ることが困難である.
モデルが安定しているかどうかを確認するために,回帰周期は短い.
多種環境への適応は検証される.
固定ポジションは動的に調整できません.
利回り率は厳密に評価する必要があります.
分析の結果,この戦略は以下の点で改善できる:
異なる市場環境でパラメータの強さをテストする.
取引量検証指標に加入する
信号の質を向上させるため,出場ロジックを最適化する.
動的ポジション管理モデルの構築
損失を制限する Stop Loss 戦略を導入する.
資金管理戦略の最適化
返信ウィンドウのスクロールを確認
多種種の安定収益性を評価する.
機械学習によるモデルの最適化
この戦略は,全体として,ある程度の革新性と実験的価値を有している.しかし,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)