適応型移動平均量的な戦略

作者: リン・ハーンチャオチャン, 日付: 2023-11-17 17:14:36
タグ:

概要

この戦略は移動平均値に基づい,パラメータを自動的に調整することができ,高時間枠で波動的な市場に適しています.価格が移動平均線を突破したとき,最適なパラメータの組み合わせを自動的に見つけ,取引信号を生成することができます.

戦略の論理

この戦略は,適応型移動平均を取引信号として使用する.まず,指定された期間 (開始) の単純な移動平均 (CMA) を計算する.次に,キャンドルスタイクボディとウィックによってどの組み合わせが最も少ない触触りをしているかを判断して,期間中のCMAパラメータをテストする.最後に,信号ラインとして最も少ない触りを有するCMAを使用する.

戦略は,CMAを周期プラス1 (CMA_P1) とマイナス1 (CMA_M1) でテストし,ボディとウィックによるタッチ数を数えます.CMAがCMA_P1とCMA_M1よりもタッチ数が少ない場合は,現在の期間を維持し,CMA_P1がタッチ数が少ない場合は,期間を1倍増やし,CMA_M1がタッチ数が少ない場合は,期間を1倍減らします.これは,シグナルラインとして比較的スムーズなCMAを見つけます.

価格がCMAを上向きに突破すると,購入信号が生成され,価格がCMAを下向きに突破すると,販売信号が生成されます.

利点分析

この適応型移動平均戦略には以下の利点があります.

  1. 移動平均期間を手動で選択する必要はありません. 戦略は異なる期間をテストし,最適を見つけます.

  2. 偽信号を減らす.固定期間のMAと比較して,適応型MAはより多くのノイズをフィルタリングし,多くの偽信号を減らすことができます.

  3. 市場変化に適応する.市場がレンジからトレンドに切り替えたとき,MA期間は自動的にシグナルを生成するために増加する.市場がトレンドからレンジに切り替えたとき,MA期間は自動的に減少する.したがって戦略は市場の変化に動的に適応することができます.

  4. この適応的な方法は,手動パラメータ最適化なしで,取引システムを全体的に簡素化することができます.

  5. このコンセプトは,適応ボリンジャー帯,適応KDなどの他の指標に適用できます.

リスク分析

この戦略には注意すべきリスクもあります.

  1. コールオプションリスク.市場がコールオプションパターンを持つ場合,キャンドルボディはMAラインを突破できず,誤った信号が生じる可能性があります.そのようなリスクを軽減するためにフィルター条件を追加する必要があります.

  2. 失敗したブレイクアウトリスク. MAブレイクアウトは常に継続しない,いくつかの失敗したブレイクアウトが起こる可能性があります.高い成功率を確保するためにブレイクアウト検証が必要です.

  3. トレンド逆転リスク. トレンドに入った後のトレンド逆転は,損失を引き起こす可能性があるため,タイミングで切り替える必要があります.損失を制御するためにストップロスを設定する必要があります.

  4. パラメータ最適化リスク.適応調整されたパラメータはローカル最適化に陥り,冗長なMAを引き起こす可能性があります.この問題を避けるためにモデル評価方法が導入する必要があります.

  5. オーバーフィッティングリスク. 過剰なパラメータ調整はオーバーフィッティングにつながり,モデルの一般化能力を失う可能性があります. バックテスト結果だけに頼らず,異なる市場環境での長期的検証が必要です.

改善 の 方向

この適応型MMA戦略を改善するためのいくつかの方向性:

  1. トレンドブレイク認証を連続ブレイクで追加して偽ブレイクをフィルターします.

  2. ストップ・ロスの戦略を増やし,価格がMAの反対側へ戻るとストップ・ロスをします.

  3. コールオプションが表示されたときに間違った信号を避けるためにオプションフィルターを追加します.

  4. パラメーターの調整を制限し,オーバーフィッティングを防ぐためにIC,LIC,SICなどの評価メトリックを導入します.

  5. アダプティブ・ゴールデン・クロス・ストラテジー,アダプティブ・ボリンジャー・バンドなどの指標に拡大します

  6. 調整されたMA,指数的なMAなどを使って MAの計算を最適化します.

概要

この戦略は,最適なパラメータを見つけるためにMA期間を適応的に調整することによって取引信号を生成します.固定パラメータと比較して,多くの誤った信号を削減し,市場の変化に適応することができます. しかし,潜在的なリスクにも注意し,安定した利益のためにライブ取引に適用する前に検証とウォークフォワード最適化を行います.

[/トランス]


/*backtest
start: 2022-11-10 00:00:00
end: 2023-11-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © fondDealer96636

//@version=5

strategy('Automatic Moving Average', overlay=true, max_bars_back=201, pyramiding=0, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000)

// input
start = 20
lookback = input(20, "Sensitivity", tooltip="Low (High Sensitivity), High (Low Sensitivity).\n\nAdjust according to timeframe and asset.")
smoothing = input(3, "Smoothing")
source = input(close, "Source")
startYear = input(2020, "Start year")
resp = 1

in_date_range = time >= timestamp(syminfo.timezone, startYear, 1, 1, 0, 0)

// global
var ix = -1
var mal = array.new_int(0)


// functions
avg(source, len) =>
    sum = 0.0
    for i = 0 to len-1
        sum += source[i]
    sum/len

bull = close > open

wick_touch(x) =>
    bull ? ((close <= x and x <= high) or (low <= x and x <= open)) : ((open <= x and x <= high) or (low <= x and x <= close))

body_touch(x) =>
    bull ? (open < x and x < close) : (close < x and x < open)

touches(t) =>
    touches = 0
    for i = 0 to lookback-1
        touches += t[i] ? 1 : 0
    touches


// local
ix := ix+1
prev_mal = ix >= 1 ? array.get(mal, ix-1) : start

cma = avg(source, prev_mal)
cma_p1 = avg(source, prev_mal+1)
cma_m1 = avg(source, prev_mal-1)

d = touches(wick_touch(cma))
d_p1 = touches(wick_touch(cma_p1))
d_m1 = touches(wick_touch(cma_m1))

d_b = touches(body_touch(cma))
d_p1_b = touches(body_touch(cma_p1))
d_m1_b = touches(body_touch(cma_m1))

any_body_touch = d_b > 0 or d_p1_b > 0 or d_m1_b > 0
no_wick_touch = d <= 0 and d_p1 <= 0 and d_m1 <= 0
wick_maximized = d >= d_p1 and d >= d_m1 ? prev_mal : (d_p1 >= d and d_p1 >= d_m1 ? prev_mal+resp : (d_m1 >= d and d_m1 >= d_p1 ? prev_mal-resp : na))

up = cma > cma[1]
down = cma < cma[1]
against_trend = (up and close < cma) or (down and close > cma)

new_mal = no_wick_touch or against_trend ? prev_mal-resp : (any_body_touch ? prev_mal+resp : wick_maximized)
next_mal = na(new_mal) ? prev_mal : new_mal

array.push(mal, next_mal < 2 ? 2 : (next_mal > 200 ? 200 : next_mal))


// graph
scma = ta.ema(cma, smoothing)

uptrend = scma > scma[1]
downtrend = scma < scma[1]

plot(scma, "Automatic MA", color=uptrend ? color.green : color.red)

uptrending = close > scma and uptrend
downtrending = close < scma and downtrend

defy = not uptrending and not downtrending
defy_cross = defy and body_touch(scma)

barcolor(uptrending ? color.lime : (downtrending ? color.red : (defy_cross ? color.black : color.white)))


// strategy
change_to_uptrend = uptrending and downtrend[1]
change_to_downtrend = downtrending and uptrend[1]

long = in_date_range and change_to_uptrend
short = in_date_range and change_to_downtrend

if long
    strategy.entry("Long", strategy.long)
if short
    strategy.entry("Short", strategy.short)


もっと