アダプティブ・ムービング・メアディア戦略の傾向

作者: リン・ハーンチャオチャン開催日:2023年10月10日 (火) 15:21:45
タグ:

概要

この戦略は,トレンドフォローする戦略に属する高速移動平均値と遅い移動平均値のクロスオーバーに基づいて取引シグナルを生成する.移動平均値のパラメータを適応的に調整することで,最大利益を得るために市場のトレンドに動的に適応する.

戦略の論理

  1. 速度のMAのデフォルト長さは21で,ゆっくりとしたMAのデフォルト長さは34です.

  2. 速いMAが遅いMAを横切ると 上向きの傾向を示し,買い信号を生成します.

  3. 速いMAがゆっくりしたMAを下回ると,下落傾向を示し,セールシグナルを生成します.

  4. 移動平均値の長さを自動的に調整することで,戦略は利益を追跡するために市場動向に動的に適応します.

利点分析

  1. 戦略は単純で明快で 分かりやすく実行できます

  2. 市場動向を効果的に追跡し 大きな利益を得る可能性があります

  3. 動的パラメータ調整は 市場の状況の変化に適応します

  4. 調整可能なMAアルゴリズムは戦略の柔軟性を高めます

  5. 柔軟な買い物・販売の論理設定

リスク分析

  1. 頻繁に取引すると 取引コストが上がります

  2. 流動性のある市場では,最適のエントリーとアウトプットが欠けている可能性があります.

  3. 不適切な MA パラメーターと調整周波数最適化は 戦略の失敗を引き起こします

  4. 損失を制限するために厳格なストップ損失が必要です.

  5. トレンドの逆転は 大きな浮動損失につながります

オプティマイゼーションの方向性

  1. 傾向の変化をより良く検出するために MA パラメータを最適化します.

  2. ストップロスのロジックを追加して単一のトレード損失を制御します.

  3. トレンド逆転損失を避けるためにトレンド判断指標を追加します.

  4. 管理管理調整戦略をより賢く自動化するために強化する.

  5. マシン学習を用いたパラメータ最適化モジュールを追加します

概要

戦略の論理はシンプルで明確で,MAsのクロスオーバーをベースに迅速かつ遅いトレードを生成する.トレンドを効果的に捉えるが,リスクもある.戦略をより堅牢にするために,パラメータの継続的な最適化,ストップロスの論理が必要である.全体として,戦略は改善の可能性が高く,研究と適用に値する.


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

//
// @version=4
// © Ehsan Haghpanah, (ehsanha)
// Algorithmic Trading Research
//
// eha Moving Averages Strategy, 
// A simple strategy based on crossing Moving Averages of 
// different lengths (a fast moving average and slow one)
//

strategy(title = "eha Moving Averages Strategy", shorttitle = "eha MA Strategy", overlay = true)

// 
// -- strategy parameter(s)
// moving averages parameter(s)
var _fastMA_len  = input(title = "Fast MA Length",  defval = 21,    type = input.integer, minval = 1, step = 1)
var _slowMA_len  = input(title = "Slow MA Length",  defval = 34,    type = input.integer, minval = 1, step = 1)
var _ma_algo_id  = input(title = "MA Algorithm",    defval = "SMA", options = ["SMA", "EMA", "WMA"])
// backtesting date and time range parameter(s)
var _startYear   = input(defval = 2020, title = "Start Year",  type = input.integer, minval = 1976)
var _startMonth  = input(defval = 1,    title = "Start Month", type = input.integer, minval = 1, maxval = 12)
var _startDay    = input(defval = 1,    title = "Start Day",   type = input.integer, minval = 1, maxval = 31)
var _closeYear   = input(defval = 2020, title = "Close Year",  type = input.integer, minval = 1984)
var _closeMonth  = input(defval = 9,    title = "Close Month", type = input.integer, minval = 1, maxval = 12)
var _closeDay    = input(defval = 1,    title = "Close Day",   type = input.integer, minval = 1, maxval = 31)

//
// -- function(s) and calculation(s)
// checks whether current time is in backtesting time range
start_t = timestamp(_startYear, _startMonth, _startDay, 00, 00)     // backtesting range start time, (00, 00); (hour, minute)
close_t = timestamp(_closeYear, _closeMonth, _closeDay, 23, 59)     // backtesting range close time, (23, 59); (hour, minute)
isInRange() => true
//
// calculates moving average based on provided algorithm, source and length
// alg : moving average algorithm
// len : length
// ser : series
calcMA(alg, len, ser) =>
    (len == 0) ? ser : ((alg == "SMA") ? sma(ser, len) : ((alg == "EMA") ? ema(ser, len) : (alg == "WMA" ? wma(ser, len) : na)))

//
// -- strategy logic and calculation(s)
ma_fast  = calcMA(_ma_algo_id, _fastMA_len, close)
ma_slow  = calcMA(_ma_algo_id, _slowMA_len, close)
cross_ov = crossover (ma_fast, ma_slow) // returns true if fastMA crosses over slowMA
cross_un = crossunder(ma_fast, ma_slow) // returns true if slowMA crosses over fastMA

//
// -- strategy execution logic
// opens a long position whenever the time is in range and crosses over
strategy.entry("ID", comment = "-", long = strategy.long, when = isInRange() and cross_ov)
// closes the position whenever the time is in range and crosses under
strategy.close("ID", comment = "-", when = isInRange() and cross_un)

//
// -- drawing and visualization
co_fast = color.new(color.gray, 25)
co_slow = color.new(color.gray, 75)
// drawing moving average(s)
plot(ma_fast, color = co_fast, linewidth = 2, style = plot.style_line)
plot(ma_slow, color = co_slow, linewidth = 3, style = plot.style_line)

もっと