相対力指数に基づく定量取引戦略


作成日: 2024-01-22 10:13:23 最終変更日: 2024-01-22 10:13:23
コピー: 7 クリック数: 831
1
フォロー
1617
フォロワー

相対力指数に基づく定量取引戦略

概要

動動振動戦略は,ランダムな動動指標と相対的に強い指標を組み合わせた量的な取引戦略である.この戦略は,ランダムな動指標を使用して,市場の過買過売領域を判断し,急速なRSI指標のフィルタリング信号と組み合わせて,実体フィルタリングによりより信頼性の高い取引信号選択を実現する.

戦略原則

ランダムな動力の指標

ランダム運動指数 (SMI) は,量化取引でよく使用される技術指標で,動力指数と振動指数の優位性を組み合わせている.

具体的には,SMIの計算式は次のとおりです.

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

このうち,HHは過去N日の最高値で,LLは過去N日の最低値である.

このように,SMIは動力のトレンド判断と振動の逆転判断を組み合わせている.SMIが80を超えるとオーバーバイで,20を下るとオーバーセールである.戦略は,オーバーバイオーバーセール領域で取引信号を発する.

RSIが急上昇する

相対強弱指数 (RSI) は,よく使われる超買超売指標である.この戦略は,周期7の急速なRSIを使用して,短期間の超買超売状況を判断する.

急速RSIが20を下回ると超売り,80を超えると超買いである. 戦略は,超買い超売り領域で取引シグナルを発する.

エントリーフィルター

この戦略には,K線実体サイズを計算して,部分信号をフィルターする実体フィルターも追加されている. K線実体が特定の値を超えるとのみ取引信号を発信する.

信号の信頼性を向上させるため,偽信号をフィルタリングできます.

戦略的優位性

多指標組合せ

この戦略は,ランダムな運動指標,急速なRSI指標,実体フィルターの3つの部分を組み合わせている.複数の指標を組み合わせることで,信号の正確性を向上させ,戦略の安定性を強化することができる.

過剰購入と過剰販売

ランダムな動きの指標と急速なRSI指標は,市場の超買超売状態を正確に判断できます. 戦略は,超買超売領域でポジションを開き,低値の買い,高値の売りという取引原則に従います.

双方向取引

戦略は,多頭と空頭の両方向の取引を行い,市場での取引機会を最大限に捉えることができます.

リスク管理

物理的なフィルタが加えられ,ほとんどのノイズをフィルタリングし,震動の際には閉じ込められることを防ぎます.

戦略リスク

多空切替のリスク

策略は双方向取引であり,多空頭が頻繁に切替されるのが潜在的リスクポイントである.適切なポジション開設ロジックは,このリスクを低減することができる.

リスクとリスク

指標が信号を発する時には,短期間に大量にフォロートレーダーが集まる可能性があり,市場の逆転リスクを引き起こす.指標のパラメータを最適化することで,このリスクを軽減することができる.

市場におけるシステムリスク

極端な状況では,すべてのモデルが失敗する可能性があります.これは,合理的な停止設定によって,このようなリスクを制御する必要があります.

戦略の最適化

パラメータ最適化

SMI周期,RSI周期,実体フィルター値などの異なるパラメータの組み合わせをテストすることで,戦略の収益率を向上させるための最適なパラメータを見つけることができます.

ダイナミック・ストップ

ATRまたは波動率に基づいたダイナミック・ストップ・メカニズムを確立することで,個々の株と全体のリスクをより良くコントロールできます.

機械学習

機械学習アルゴリズムを導入し,モデルによって指標値の将来の動きを予測する.これは,指標の転換点を事前に判断し,戦略の前向き性を強化する.

要約する

全体として,この戦略は,ランダムな動態指標,急速な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()