適応型移動平均定量戦略


作成日: 2023-11-17 17:14:36 最終変更日: 2023-11-17 17:14:36
コピー: 0 クリック数: 715
1
フォロー
1621
フォロワー

適応型移動平均定量戦略

概要

この戦略は,移動平均に基づいて,パラメータを自動的に調整し,高時間周期の波動的な市場に適用されます.それは,価格が移動平均を破るとき,取引シグナルを生成する最適なパラメータの組み合わせを自動的に見つけることができます.

戦略原則

この戦略は,自適性移動平均を取引信号として使用する.まず,指定周期の単純移動平均 (CMA) を計算する.それから,CMAの周りのパラメータの組み合わせをテストし,どの組み合わせのCMA線がK線実体と影線が最も少ない回数で触れたかを判断する.最後に,触れたCMA信号を最も少ない回数で線として使用する.

具体的には,CMA周期+1 (CMA_P1) と+1 (CMA_M1) の後のCMA線,統計実体線,影線が触れる回数をテストする.CMAの触れる回数がCMA_P1とCMA_M1より少ない場合は,現在のCMA周期を維持し,CMA_P1の触れる回数が少ない場合は,CMA周期+1 (CMA_M1) を加え,CMA周期+1 (CMA_M1) の触れる回数が少ない場合は,CMA周期+1 (CMA_M1) を減算する.

価格がCMAを下から上へと突破すると,買入シグナルが生成され,価格がCMAを上から下へと突破すると,売出シグナルが生成される.

優位分析

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

  1. 自動的に最適参数を見つける.移動平均の周期を人工的に選択する必要なく,戦略は自動的に異なる周期をテストして最適参数を見つける.

  2. 偽信号の減少. 固定周期の移動平均と比較して,自律的な移動平均は,多くの偽信号の減少のために,より多くのノイズをフィルムすることができます.

  3. 市場の変化に適応する.市場がトレンドからトレンドに進むと,移動平均周期は自動的に長くなってシグナルを生成する.市場がトレンドからトレンドに進むと,移動平均周期は自動的に短くなる.

  4. 取引システムの簡素化.この自主的な方法は,人工的に最適化パラメータを必要とせずに,取引システム全体を簡素化することができます.

  5. 拡張性がある.この戦略の考えは,他の指標に広めることができ,ブリン帯に適応する,KDに適応するなどの戦略を設計することができる.

リスク分析

この戦略にはいくつかのリスクがあります.

  1. 値オプションのリスク。市場が値オプションの動きに遭遇する時,实物線が移動平均を突破できないことが誤信号を引き起こす。このようなリスクを減らすためにフィルタリング条件を追加する必要がある。

  2. 突破失敗のリスク。移動平均の突破は必ずしもcontinuationにはならず,部分突破の失敗のリスクがある。したがって,突破の成功率を確保するために,突破検証を行う必要がある。

  3. トレンド反転リスク。 トレンド市場に入ってから反転する場合は,時宜に方向転換する必要がある.そうしないと損失を招く。 損失を制御するためにストップ・ローズ条件を設定することができる。

  4. パラメータ最適化のリスク。自己適応調整のパラメータは,局所最適化に落とし込み,明らかに冗長な移動平均を生成する可能性がある。この問題を回避するためにモデル評価方法の導入が必要。

  5. 過度最適化リスク。自適性調整パラメータは過度最適化され,モデルの汎用性を失う可能性がある。異なる市場環境で長期にわたる検証が必要であり,反測結果に過度依存することはできない。

最適化の方向

この自己適応型移動平均策の最適化には,

  1. トレンドブレイク検証メカニズムに追加し,連続したブレイクによって偽のブレイクをフィルターします.

  2. 価格が移動平均の反対側に戻ったときに止まるストップ戦略を追加します.

  3. オプションのフィルターを増やし,オプションの市場における誤ったシグナルを回避する.

  4. IC,LIC,SICなどのパラメータの調整を制限する評価指標を導入し,パラメータが過度に最適化されないようにする.

  5. 他の指標に拡張し,金叉死叉自適化戦略,ブリン帯自適化戦略などを設計する.

  6. 移動平均の計算方法を最適化し,加重移動平均,指数移動平均などの平滑移動平均を使用する.

要約する

この戦略は,自己適応して移動平均周期を調整し,最適のパラメータを探し,取引信号を生成する.固定パラメータと比較して,多くの偽信号を軽減し,市場の変化に適応することができる.しかし,我々は,いくつかの潜在的リスクにも注意する必要があります.実際の取引で安定した利益を得るためには,戦略の検証とウォークフォワードの最適化が必要である.

||

Overview

This strategy is based on moving average, can automatically adjust parameters, and is suitable for wavy markets at high timeframes. It can automatically find the optimal parameter combination and generate trading signals when price breaks through the moving average line.

Strategy Logic

This strategy uses an adaptive moving average as trading signal. First it calculates the simple moving average (CMA) of the specified period (start). Then it tests the CMA parameters around the period, judging which combination has the least touches by candlestick body and wick. Finally it uses the CMA with the least touches as the signal line.

Specifically, the strategy tests the CMA with period plus 1 (CMA_P1) and minus 1 (CMA_M1), counts the number of touches by body and wick. If CMA has less touches than CMA_P1 and CMA_M1, then keep the current period; if CMA_P1 has less touches, then increase the period by 1; if CMA_M1 has less touches, then decrease the period by 1. This finds a relatively smooth CMA as the signal line.

When price breaks through CMA upward, a buy signal is generated; when price breaks through CMA downward, a sell signal is generated.

Advantage Analysis

This adaptive moving average strategy has the following advantages:

  1. Automatically find optimal parameters. No need to manually select moving average period, the strategy will test different periods and find the optimum.

  2. Reduce false signals. Compared with fixed period MA, the adaptive MA can filter out more noise and reduce many false signals.

  3. Adapt to market changes. When market switches from range-bound to trending, the MA period will automatically increase to generate signals; when market switches from trending to range-bound, the MA period will automatically decrease. So the strategy can dynamically adapt to market changes.

  4. Simplify trading system. This adaptive method can simplify the whole trading system without manual parameter optimization.

  5. Good scalability. The concept can be applied to other indicators like adaptive Bollinger Bands, adaptive KD etc.

Risk Analysis

There are also some risks to note for this strategy:

  1. Call option risk. When market has a call option pattern, the candle body may fail to break the MA line, resulting in wrong signals. Filter conditions need to be added to reduce such risk.

  2. Failed breakout risk. MA breakout does not always continuation, some failed breakouts may occur. Breakout validation is needed to ensure high success rate.

  3. Trend reversal risk. Trend reversal after entering the trend needs to be switched timely, otherwise it may cause losses. Stop loss should be set to control the loss.

  4. Parameter optimization risk. Adaptive adjusted parameters may fall into local optimization, resulting in redundant MAs. Model evaluation methods need to be introduced to avoid this problem.

  5. Overfitting risk. Excessive parameter tuning may lead to overfitting and lose the model generalization ability. Prolonged verification in different market environments is needed, not just rely on backtest results.

Improvement Directions

Some directions to improve this adaptive MA strategy:

  1. Add trend breakout validation via consecutive breakouts to filter false breakouts.

  2. Increase stop loss strategy, stop loss when price moves back to the other side of MA.

  3. Add option filter to avoid wrong signals when call option appears.

  4. Introduce evaluation metrics like IC, LIC, SIC etc. to constrain parameter tuning and prevent overfitting.

  5. Expand to other indicators like adaptive golden cross strategy, adaptive Bollinger Bands etc.

  6. Optimize MA calculation by using weighted MA, exponential MA etc. to get smoother MA.

Summary

This strategy generates trading signals by adaptively adjusting the MA period to find optimal parameters. Compared with fixed parameters, it can reduce many false signals and adapt to market changes. But we also need to watch out for potential risks, and do verification and walk-forward optimization before applying it in live trading for steady profits.

[/trans]

ストラテジーソースコード
/*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)