移動平均取引戦略


作成日: 2023-10-30 15:53:25 最終変更日: 2023-10-30 15:53:25
コピー: 3 クリック数: 611
1
フォロー
1617
フォロワー

移動平均取引戦略

概要

この戦略は,平均線システムを使用して,現在のトレンドの方向を判断し,トレンドの方向に応じて空白を多めにします.平均線が上昇すると,看板信任が高く,空白を多めにします.平均線が低下すると,看板信任が高く,空白を多めにします.この戦略は,主に平均線システムを使用して,市場の方向を判断し,トレンドフォロー型の戦略です.

戦略原則

  1. 平均線指標として一定の周期 (デフォルトは400周期) の重力移動平均vwmaを計算する.

  2. 平均線vwmaが上昇しているかどうかを判断し,上昇している場合は多信号uptrendを設定し,下降している場合は空見信号downtrendを設定します.

  3. アップトレンドが本当なら,多めに;ダウントレンドが本当なら,平仓を空にする.

  4. K線ごとに戦略的リターンbar_pnlと買取保持リターンbar_bhを計算する.

  5. 四半期と年次の断絶点に基づいて,各四半期と年次の戦略リターンquarter_pnlと年次リターンyear_pnlと,相応の買取保有リターンquarter_bhとyear_bhを計算する.

  6. 表は,年毎の各四半期に戦略的利回りと買取利回りを示している.

戦略的優位分析

この戦略は,市場傾向の方向を平均線で判断する上で主に使用され,以下の利点があります.

  1. 操作は簡単で,平均線指標によって市場の動きを判断し,容易に理解し,掌握する.

  2. トレンド操作に伴い,非トレンド市場での損失を効果的に制御することができる.

  3. 配置できるパラメータは少ないが,主に平均線周期を調整し,テスト・最適化が容易である.

  4. 収益を表で表すのは簡単です.

  5. 収益表に購入保有収益を比較するために追加することで,戦略の増益収益を明確にすることができる.

  6. テーブル位置を柔軟に設定し,他の戦略と組み合わせるのが便利.

戦略的リスク分析

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

  1. Bulk marketリスク,長期にわたる牛市では,買持戦略に比べて利益がわずかに低い可能性があります.平均線周期を適切に調整して最適化することができます.

  2. 振動的な状況下では,ウィップソーのリスクが高い. 繰り返しの取引を減らすために,突破前の高点などのフィルタリング条件を追加することを考慮する.

  3. 均線系は曲線に適性がないため,トレンドの転換点を逃す可能性があります.異なるタイプの均線指標を試すことができます.

  4. 止損退出メカニズムを考慮していないため,大幅な撤回リスクがある. ダイナミックな止損を設定するか,ポジションを減らすことを考慮することができます.

  5. 表の最適化に関しては,シャープ比,最大撤回などのリスク指標を追加することを考えることができます.

戦略最適化の方向性

この戦略は以下の点で最適化できます.

  1. 平均線パラメータを最適化し,平均線周期を異なる市場環境に適応させる.

  2. Whipsawを減らすために,突破前の高点などのフィルタリング条件を追加します.

  3. 異なる種類の平均線,加重移動平均線,二次指数移動平均線などを試してください.

  4. ストップ・メカニズムの加入により,ダイナミック・ストップを設定したり,ポジションの減少を考慮したりできます.

  5. グラフの内容を豊かにし,シャープ比,最大撤回などの指標を追加します.

  6. MACD,Bollinger Bandsなどの他の指標と組み合わせてトレンドを判断する.

  7. ポジション管理の最適化,市場状況に応じてポジションの動的調整

  8. 異なる規格の動作をテストし,最適の適用範囲を探します.

要約する

この均線取引戦略は,全体的に簡潔で直接であり,均線判断によりトレンド操作し,撤回制御能力が強くなっており,トレンド型トレーダーに適している.最適化余地も十分であり,均線システム,ストップ・ロズ・メカニズム,ポジション管理などの面で最適化され,戦略を複雑な市場環境に適したものにすることができる.表のデザインは,戦略と持株収益を比較して,戦略の付加価値を直視的に示す.この戦略の有効な枠組みと表の展示方法は,定量化トレーダーに一定の借用作用がある.

ストラテジーソースコード
/*backtest
start: 2022-10-23 00:00:00
end: 2023-10-29 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/
// © Dannnnnnny

//@version=4
strategy(title="Quarterly Returns in Strategies vs Buy & Hold", initial_capital= 1000, overlay=true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.1)
maLength= input(400)

wma= vwma(hl2,maLength)
uptrend= rising(wma, 5)
downtrend= falling(wma,5)

plot(wma)

if uptrend
    strategy.entry("Buy", strategy.long)
else
    strategy.close("Buy")//

///////////////////
// QUARTERLY TABLE //
enableQuarterlyTable = input(title="Enable Quarterly Return table", type=input.bool, defval=false)
enableCompareWithMarket = input(title="Compare with Market Benchmark", type=input.bool, defval=false)
table_position = input(title="Table Position", type=input.string, defval='bottom_right', options=['bottom_right','bottom_left','top_right', 'top_left'])
precision = 2
new_quarter = ceil(month(time)/3)  != ceil(month(time[1])/3)
new_year  = year(time)  != year(time[1])

eq = strategy.equity

bar_pnl = eq / eq[1] - 1
bar_bh = (close-close[1])/close[1]

cur_quarter_pnl = 0.0
cur_year_pnl  = 0.0
cur_quarter_bh = 0.0
cur_year_bh  = 0.0

// Current Quarterly P&L
cur_quarter_pnl := new_quarter ? 0.0 : 
                 (1 + cur_quarter_pnl[1]) * (1 + bar_pnl) - 1 
cur_quarter_bh := new_quarter ? 0.0 : 
                 (1 + cur_quarter_bh[1]) * (1 + bar_bh) - 1

// Current Yearly P&L
cur_year_pnl := new_year ? 0.0 : 
                 (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1
cur_year_bh := new_year ? 0.0 : 
                 (1 + cur_year_bh[1]) * (1 + bar_bh) - 1

// Arrays to store Yearly and Quarterly P&Ls
var quarter_pnl  = array.new_float(0)
var quarter_time = array.new_int(0)
var quarter_bh  = array.new_float(0)

var year_pnl  = array.new_float(0)
var year_time = array.new_int(0)
var year_bh  = array.new_float(0)

end_time = false

end_time:= time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory

if (not na(cur_quarter_pnl[1]) and (new_quarter or end_time))
    if (end_time[1])
        array.pop(quarter_pnl)
        array.pop(quarter_time)
        
    array.push(quarter_pnl , cur_quarter_pnl[1])
    array.push(quarter_time, time[1])
    array.push(quarter_bh , cur_quarter_bh[1])

if (not na(cur_year_pnl[1]) and (new_year or end_time))
    if (end_time[1])
        array.pop(year_pnl)
        array.pop(year_time)
        
    array.push(year_pnl , cur_year_pnl[1])
    array.push(year_time, time[1])
    array.push(year_bh , cur_year_bh[1])

// Quarterly P&L Table    
var quarterly_table = table(na)

getCellColor(pnl, bh)  => 
    if pnl > 0
        if bh < 0 or pnl > 2 * bh
            color.new(color.green, transp = 20)
        else if pnl > bh
            color.new(color.green, transp = 50)
        else
            color.new(color.green, transp = 80)
    else
        if bh > 0 or pnl < 2 * bh
            color.new(color.red, transp = 20)
        else if pnl < bh
            color.new(color.red, transp = 50)
        else
            color.new(color.red, transp = 80)

if (end_time and enableQuarterlyTable)
    quarterly_table := table.new(table_position, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)

    table.cell(quarterly_table, 0,  0, "",     bgcolor = #cccccc)
    table.cell(quarterly_table, 1,  0, "Q1",  bgcolor = #cccccc)
    table.cell(quarterly_table, 2,  0, "Q2",  bgcolor = #cccccc)
    table.cell(quarterly_table, 3,  0, "Q3",  bgcolor = #cccccc)
    table.cell(quarterly_table, 4,  0, "Q4",  bgcolor = #cccccc)
    table.cell(quarterly_table, 5,  0, "Year", bgcolor = #999999)


    for yi = 0 to array.size(year_pnl) - 1
        table.cell(quarterly_table, 0,  yi + 1, tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
        
        y_color = getCellColor(array.get(year_pnl, yi), array.get(year_bh, yi))
        table.cell(quarterly_table, 5, yi + 1, enableCompareWithMarket ? tostring(round(array.get(year_pnl, yi) * 100, precision)) + " (" + tostring(round(array.get(year_bh, yi) * 100, precision)) + ")" : tostring(round(array.get(year_pnl, yi) * 100, precision)), bgcolor = y_color, text_color=#bfbfbf)
        
    for mi = 0 to array.size(quarter_time) - 1
        m_row   = year(array.get(quarter_time, mi))  - year(array.get(year_time, 0)) + 1
        m_col   = ceil(month(array.get(quarter_time, mi)) / 3)
        m_color = getCellColor(array.get(quarter_pnl, mi), array.get(quarter_bh, mi))
        
        table.cell(quarterly_table, m_col, m_row, enableCompareWithMarket ?  tostring(round(array.get(quarter_pnl, mi) * 100, precision)) + " (" + tostring(round(array.get(quarter_bh, mi) * 100,precision)) +")" : tostring(round(array.get(quarter_pnl, mi) * 100, precision)), bgcolor = m_color, text_color=#bfbfbf)