相対的モメンタム戦略に基づく


作成日: 2024-01-29 08:38:04 最終変更日: 2024-01-29 08:38:04
コピー: 0 クリック数: 722
1
フォロー
1617
フォロワー

相対的モメンタム戦略に基づく

概要

相対動力の戦略は,株と指数の動力を比較して,大市場に対する株の強さを判断する.株の動力が大市場より高いときに買い,株の動力が大市場より低いときに売って,株の成長ピークを捕捉する.

戦略原則

この戦略は,各株の強さと大株の弱さを見極め,以下のように論理的に考えます.

  1. 株の動力として,一定の期間における株の収益率を計算する.
  2. インデックスを計算して,同じ期間の収益率をインデックスの動量として
  3. 株価とインデックスの動きを計算する移動平均の平滑処理
  4. 株価の移動平均に指数の移動平均をつけると,株価の移動が指数全体より強いと判断され,買い信号となる.
  5. 株価の移動平均を指数移動平均の下に横切ると,株価の動きが指数全体より弱いと考えられ,売り信号となる.

この論理を踏まえれば,株が成長のピークを突破したときに購入し,その成長の勢いが衰退したときに売って,その成長のピークの余剰利益に鍵をかけることができます.

優位分析

相対的な動量戦略は,主に以下の利点がある.

  1. 株の成長のピークを動的に捉え,状況に配慮せずに,株が大盤より早く成長すれば購入できます.
  2. 移動平均処理により,短期的な波動の干渉をフィルタリングして,信号の信頼性を高める
  3. シンプルで直接的な買入・販売条件で,操作が分かりやすい.
  4. 相対運動計算の時間パラメータを自由に設定し,最適化策略

リスク分析

この戦略にはリスクがあります.

  1. 株価上昇のピークが終わった後,リターン調整が起こり,抑制不足の危険性がある
  2. 相対運動量指数は誤った信号を発し,認識された成長ピークは本当のピークではない
  3. ストップ・ロスを設定して最大損失を制御する

これらのリスクは,合理的なストップ・ストップ・損失,適切なパラメータの調整などの方法によって制御できます.

最適化の方向

相対的な動量策は,以下の点で最適化できます.

  1. 異なる動力計算時間パラメータをテストし,最適のパラメータを見つける
  2. 移動平均の種類と長さをテストし,最適なパラメータを探します.
  3. 取引量指標のフィルターを追加し,不足した偽の突破を避ける
  4. 他の技術指標と併せて購入確認のタイミング

要約する

相対動量戦略は,各株の相対的に大きなポケットの成長ピークを捕捉することによって,効率的に余分な利益を得ることができます.この戦略は,シンプルで明確な買賣論理,操作の容易さの利点があり,パラメータ最適化とリスク管理により,優れた効果を得ることができます.

ストラテジーソースコード
/*backtest
start: 2024-01-21 00:00:00
end: 2024-01-28 00:00:00
period: 15m
basePeriod: 5m
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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Relative Returns Strategy", overlay=false, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

index_ticker=input("BTC_USDT:swap")
Loopback = input(40, step=20)
useStopAndIndexReturns = input(true)
useStopAndIndexReturnsMa = input(true)

useDifference = not useStopAndIndexReturns

MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
MALength = input(10, minval=10,step=10)

i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Backtest Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "Backtest End Time", type = input.time)
inDateRange = true

f_secureSecurity(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on)
f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

index = f_secureSecurity(index_ticker, '1D', close, 0)
stock_return = (close - close[Loopback])*100/close
index_return = (index - index[Loopback])*100/index

stock_return_ma = f_getMovingAverage(stock_return, MAType, MALength)
index_return_ma = f_getMovingAverage(index_return, MAType, MALength)
relativeReturns = stock_return - index_return
relativeReturns_ma = f_getMovingAverage(relativeReturns, MAType, MALength)

plot(useStopAndIndexReturns ? useStopAndIndexReturnsMa ? stock_return_ma : stock_return : na, title="StockReturn", color=color.green, linewidth=1)
plot(useStopAndIndexReturns ? useStopAndIndexReturnsMa ? index_return_ma : index_return : na, title="IndexReturn", color=color.red, linewidth=1)

plot(useDifference?relativeReturns:na, title="Relative-Returns", color=color.blue, linewidth=1)
plot(useDifference?relativeReturns_ma:na, title="MA", color=color.red, linewidth=1)

buyCondition = (useStopAndIndexReturns ? useStopAndIndexReturnsMa ? stock_return_ma > index_return_ma : stock_return > index_return : relativeReturns > relativeReturns_ma)
closeBuyCondition = (useStopAndIndexReturns ? useStopAndIndexReturnsMa ? stock_return_ma < index_return_ma : stock_return < index_return : relativeReturns < relativeReturns_ma)
strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca")
strategy.close("Buy", when=closeBuyCondition)