ストカスティック・モメント・戦略

作者: リン・ハーンチャオチャン, 日付: 2024-01-22 10:13:23
タグ:

img

概要

ストーカスティック・モメントーム・ストラテジー (STOCHASTIC MOENTUM STRATEGY) は,ストーカスティック・モメントーム・インデックス (SMI) と相対強度指数 (RSI) を組み合わせた定量的な取引戦略である.SMIを使用して,市場における過買い・過売エリアを特定し,高速なRSIがシグナルフィルターとして機能する.より信頼性の高いシグナル選択のためにボディフィルターも実装する.

戦略の原則

ストカスティック・モメント・インデックス

ストカスティック・モメンタム・インデックス (SMI) は,モメンタム・インデックスと振動指標の強みを組み合わせた定量取引で使用される一般的な技術指標です.

具体的には,SMIは以下のように計算されます.

SMI = (近 - (HH + LL) /2)/(0.5*(HH - LL)) * 100

HH は過去 N 日間の最高価格,LL は最低価格です.

SMIは,トレンドフォローするモメント判断と振動の逆転判断の両方を組み込む.80を超える値は過買い,20以下の値は過売りとみなされる.SMIがこれらの過買いまたは過売りレベルに達したとき,戦略は取引信号を生成する.

急速なRSI

相対強度指数 (RSI) は,標準的な過買い/過売り指標である.この戦略は,短期的な過買い/過売り状況を判断するために,期間7の速いRSIを使用する.

20未満の値が過売れ,80を超える値が過買いとみなされる.これらの値が破られると信号が生成される.

ボディフィルター

この戦略は,特定の信号をフィルターするためにキャンドルスタイクボディサイズをチェックすることによってボディフィルターも実装する. 設定された値を超えたボディのみがトレードを誘発する.

これは誤った信号をフィルターで排除し 信頼性を高めます

利点

複数の指標の組み合わせ

このアプローチでは,SMI,高速RSI,ボディフィルタを3つの強力なシステムに組み合わせます.複数の統合信号を使用することで精度が向上し,安定性が向上します.

過剰購入/過剰販売の検出

SMI と 急速な RSI は,疲労したトレンドを検出するのに最適です.これらの過剰に拡張された領域からの平均逆転を取引することで,戦略は低価格で購入し高価格で販売します.

双方向取引

低値と短値の両方を購入する能力は 市場の条件に合わせて 機会を最大化します

リスク管理

身体フィルターは,低強度信号を拒絶することで, 鞭を避けます.

リスク

ショットソー

長い/短い切り替えが頻繁な場合 ショットソウのリスクが伴います 論理を最適化することで これを最小限に抑えることができます

混雑 し た 業種

信号は市場参加者をグループ化し,エントリー時に迅速な逆転を促す可能性があります.微調整パラメータは群れのリスクを減らすことができます.

ブラック・スワン

極端な出来事は全てのモデルを覆すことができます システム的なリスクを制御するために 知的ストップ損失が必要です

改良

パラメータ最適化

異なるSMI/RSI期間とボディフィルターの値をテストすることで,より高い収益性のための最適な値が明らかになる可能性があります.

動的停止

波動性に基づくまたはATRストップを組み込むことで,ポジションおよびポートフォリオリスクがより適切に含まれます.

機械学習

将来の指標レベルを予測するモデルは ターニングポイントを早期に特定し 予測力を高めることができます

結論

概要すると,SMI,急速なRSI,およびボディフィルターを統合することで,この戦略はかなり包括的なオーバーバイト/オーバーセールシステムを作成しました.マルチシグナルアプローチは正確性を向上させ,双方向取引能力とリスク制御はバランスに貢献します.継続的なパラメータとモデル最適化により,長期的に利益を得ることを約束しています.


/*backtest
start: 2023-12-22 00:00:00
end: 2024-01-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.1", shorttitle = "Stochastic str 1.1", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings 
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
usesmi = input(true, defval = true, title = "Use SMI Strategy")
usersi = input(true, defval = true, title = "Use RSI Strategy")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(5, "SMI Percent K Length")
b = input(3, "SMI Percent D Length")
limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
fromyear = input(2017, defval = 2017, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Fast RSI
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Stochastic Momentum Index
ll = lowest (low, a)
hh = highest (high, a)
diff = hh - ll
rdiff = close - (hh+ll)/2
avgrel = ema(ema(rdiff,b),b)
avgdiff = ema(ema(diff,b),b)
SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0
SMIsignal = ema(SMI,b)

//Lines
plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index")
plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line")
plot(limit, color = black, title = "Over Bought")
plot(-1 * limit, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false

//Signals
up1 = SMIsignal < -1 * limit and close < open and body and usesmi
dn1 = SMIsignal > limit and close > open and body and usesmi
up2 = fastrsi < 20 and close < open and body and usersi
dn2 = fastrsi > 80 and close > open and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

もっと