二重移動平均反転追跡戦略に基づく


作成日: 2024-02-20 17:08:43 最終変更日: 2024-02-20 17:08:43
コピー: 1 クリック数: 527
1
フォロー
1617
フォロワー

二重移動平均反転追跡戦略に基づく

概要

双均線反転トラッキング戦略は,移動平均の交差を取引信号として利用する量化取引戦略である.この戦略は,MACD指標の快慢均線差値とその信号ライン,および取引量の多空比率判断を組み合わせて,取引信号を形成し,市場反転の機会を捕捉する.

戦略原則

この戦略は,主に快線と慢線の関係を判断し,快線が慢線を貫くときに多信号を生成し,快線の下の慢線を貫くときに空白信号を生成する.さらに,MACD差値の多空状態,差値と信号線の関係,取引量の多空状態などの総合判断市場多空状態.

具体的には,戦略は,MACD差値の大きさと方向,差値と信号線の交差,差値と信号線の方向が一致または逆である場合などを判断する.これらの状況は,市場のsubidabubb急落反弹特性を反映する.さらに,取引量の多空分布は,判断の補助指標としても使用されます.

差値とシグナルラインが市場逆転の信号を示していると判断し,取引量が市場逆転の確認に対応すると,取引戦略が生じます.

戦略的優位性

  • 市場転換点を判断する双均線交差を活用し,爬虫類理論の根拠は堅固である
  • 交通量判断を組み合わせて,偽突破を避ける
  • MACD指標は,反発特性を識別する
  • パラメータ 部分制御 戦略の柔軟性

リスクと解決策

  • 双等線交差はウィップソー問題を引き起こします.

    • 平均線を調整し,Thresholdを拡大する
  • 取引額が完全にフィルターされず

    • OBVなどの副指標と組み合わせて,実際の取引量トレンドを判断する
  • subsectionの調整の深さと強さを判断できない

    • ストップを増加し,重要なサポート値を評価する

最適化の方向

  • ルール判断の代わりに 機械学習モデルを使う

    • 戦略の粗悪性を高め,過適合を減らす
  • ストップダメージ・ストップスキルを追加する

    • 利益の一部を閉じ込め,リスクを減らす
  • 感情の指標と ニュースの分析を組み合わせたものです

    • モデル判断の精度向上
  • 他の品種や市場への移植

    • テスト戦略の拡張性

要約する

双均線反転追跡戦略は,均線指標,MACD指標,取引量指標を総合的に考慮し,その反転信号を捕捉し,適切な反転点を選択してポジションを構築する.戦略の最適化スペースは大きく,機械学習と風制御手段によって戦略の安定性と収益率をさらに強化することができる.

ストラテジーソースコード
/*backtest
start: 2024-01-20 00:00:00
end: 2024-02-19 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("3 10 Oscillator Profile Flagging", shorttitle="3 10 Oscillator Profile Flagging", overlay=true)

signalBiasValue = input(title="Signal Bias", defval=0.26)
macdBiasValue = input(title="MACD Bias", defval=0.8)
shortLookBack = input( title="Short LookBack", defval=3)
longLookBack = input( title="Long LookBack", defval=10)

fast_ma = ta.sma(close, 3)
slow_ma = ta.sma(close, 10)
macd = fast_ma - slow_ma
signal = ta.sma(macd, 16)
hline(0, "Zero Line", color = color.black)

buyVolume = volume*((close-low)/(high-low))
sellVolume = volume*((high-close)/(high-low))
buyVolSlope = buyVolume - buyVolume[1]
sellVolSlope = sellVolume - sellVolume[1]
signalSlope = ( signal - signal[1] )
macdSlope = ( macd - macd[1] )
//plot(macdSlope, color=color.red, title="Total Volume")
//plot(signalSlope, color=color.green, title="Total Volume")
intrabarRange = high - low

getLookBackSlope(lookBack) => signal - signal[lookBack]
getBuyerVolBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if buyVolume[i] > sellVolume[i]
            j += 1
    j

getSellerVolBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if sellVolume[i] > buyVolume[i]
            j += 1
    j

getVolBias(lookBack) =>
    float b = 0
    float s = 0
    for i = 1 to lookBack
        b += buyVolume[i]
        s += sellVolume[i]
    b > s

getSignalBuyerBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] > signalBiasValue
            j += 1
    j

getSignalSellerBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < ( 0 - signalBiasValue )
            j += 1
    j

getSignalNoBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < signalBiasValue and signal[i] > ( 0 - signalBiasValue )
            j += 1
    j

getPriceRising(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if close[i] > close[i + 1]
            j += 1
    j


getPriceFalling(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if close[i] < close[i + 1] 
            j += 1
    j

getRangeNarrowing(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if intrabarRange[i] < intrabarRange[i + 1] 
            j+= 1
    j

getRangeBroadening(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if intrabarRange[i] > intrabarRange[i + 1] 
            j+= 1
    j

bool isNegativeSignalReversal = signalSlope < 0 and signalSlope[1] > 0
bool isNegativeMacdReversal = macdSlope < 0 and macdSlope[1] > 0

bool isPositiveSignalReversal = signalSlope > 0 and signalSlope[1] < 0
bool isPositiveMacdReversal = macdSlope > 0 and macdSlope[1] < 0

bool hasBearInversion = signalSlope > 0 and macdSlope < 0
bool hasBullInversion = signalSlope < 0 and macdSlope > 0

bool hasSignalBias = math.abs(signal) >= signalBiasValue
bool hasNoSignalBias = signal < signalBiasValue and signal > ( 0 - signalBiasValue )

bool hasSignalBuyerBias = hasSignalBias and signal > 0
bool hasSignalSellerBias = hasSignalBias and signal < 0

bool hasPositiveMACDBias = macd > macdBiasValue
bool hasNegativeMACDBias = macd < ( 0 - macdBiasValue )

bool hasBullAntiPattern = ta.crossunder(macd, signal)
bool hasBearAntiPattern = ta.crossover(macd, signal)

bool hasSignificantBuyerVolBias = buyVolume > ( sellVolume * 1.5 )
bool hasSignificantSellerVolBias = sellVolume > ( buyVolume * 1.5 )

// 7.48 Profit 52.5% 
if ( hasSignificantBuyerVolBias and getPriceRising(shortLookBack) == shortLookBack  and getBuyerVolBias(shortLookBack) == shortLookBack and hasPositiveMACDBias and hasBullInversion)
    strategy.entry("Short1", strategy.short)
strategy.exit("TPS", "Short1", limit=strategy.position_avg_price - 0.75, stop=strategy.position_avg_price + 0.5)

// 32.53 Profit 47.91%
if ( getPriceFalling(shortLookBack) and (getVolBias(shortLookBack) == false) and signalSlope < 0 and hasSignalSellerBias)
    strategy.entry("Long1", strategy.long)
strategy.exit("TPS", "Long1", limit=strategy.position_avg_price + 0.75, stop=strategy.position_avg_price - 0.5)