定量取引の二重移動平均戦略

作者: リン・ハーンチャオチャン開催日:2023年12月29日 11:03:14
タグ:

img

概要

この戦略は,移動平均値と取引量に関する技術指標に基づいて,長期的トレンドフォローする定量戦略に設計されています. 閉店価格が20日間の移動平均線以上であり,その日の購入量は過去n日間の販売量と平均取引量よりも大きい場合,市場は上昇状態であると考えられ,購入する時間です. 閉店価格が下線を下回り,その日の販売量は過去n日間の購入量と平均取引量よりも大きい場合,市場は下落状態であると考えられ,売却する時間です.

戦略原則

この戦略は主に2つの判断指標に基づいています.

  1. 二重移動平均線:20日線と60日線を計算する.20日線が60日線を超えると,市場は上昇傾向にあると考えられる.20日線が60日線を下回ると,市場は下落傾向にあると考えられる.

  2. 取引量: 日々の購入量と販売量を計算する. 購入量が販売量よりも大きく,過去n日間の平均取引量よりも大きい場合,市場は上昇傾向にあると判断する. 販売量が購入量よりも大きく,過去n日間の平均取引量よりも大きい場合,市場は下落傾向にあると判断する.

具体的な取引戦略と論理は次のとおりです

ロング:閉店価格が20日間の移動平均線上にあり,その日の購入量は過去n日間の販売量と平均取引量よりも大きい場合,市場は上昇傾向とみなされます.波動性に基づいてボリンジャーバンドを計算します.閉店価格がボリンジャーバンドのミッドラインと下のレール間の場合,ロングします.

ショート: 閉店価格が下鉄線を下に突破し,その日の販売量は過去 n 日間の購入量と平均取引量よりも大きい場合,市場は下落傾向とみなされます.波動性に基づいてボリンジャーバンドを計算します.閉店価格がボリンジャーバンドの下鉄線を下に下ると,ショートします.

利益取得とストップ損失: 利益を確保または損失を減らすために合理的な利益取得とストップ損失レベルを設定します.例えば,価格がエントリー価格より5%上昇すると利益を得ます.損失が10%に達すると損失を停止します.または価格が最近の新高に達し,ある程度引き下げると利益を得ます.

利点分析

この戦略には以下の利点があります.

  1. 二重移動平均線と取引量指標を組み合わせることで,単一の技術指標判断の盲点が回避される.

  2. 異なるパラメータを持つボリンガー帯を使用することで,より正確なエントリー価格が決定されます.

  3. 利益とストップ・ロスの戦略は合理的で 利益とリスクを制御するのに役立ちます

  4. 安定したリターンで良いバックテスト結果が得られ 定量的な取引に実際に適用できます

リスク分析

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

  1. 二重移動平均戦略は誤った信号を生む傾向があり,ボリューム指標によってフィルタリングする必要があります.

  2. 誤ったボリンジャー帯パラメータ設定は,過度に頻繁または稀なエントリにつながる可能性があります.

  3. 誤った固定利益採取とストップ・ロスは 戦略の収益に影響を与える可能性があります.

  4. バックテストには多くの歴史的データが必要で,ライブ取引では予期せぬ損失が発生する可能性があります.

最適化方向

戦略は以下の側面で最適化できます.

  1. 最適な移動平均の組み合わせを見つけるために移動平均システムのパラメータを最適化する.

  2. より正確な入力のためにボリンジャー帯のパラメータを最適化します.

  3. 市場状況に応じて,収益とストップ・ロスのポイントを動的に調整し,合理的なリスク・リターン比を設定します.

  4. 戦略の正確性を高めるためにMACD,KDなどの他の技術指標の判断を高める.

  5. 機械学習方法を用いて 戦略をより堅牢にするための最適パラメータを自動的に見つけます

概要

総じて,これはバックテスト性能が良い非常に実用的な定量的な取引戦略です. 実行が簡単で,リスクは制御可能で,リアルトレードに適した安定した戦略です. 定量的なトレーダーにとって学ぶ価値があります. もちろん,戦略最適化にはまだ多くの余地があり,より多くの定量的な取引の専門家が改善することを楽しみにしています.


/*backtest
start: 2023-12-21 00:00:00
end: 2023-12-28 00:00:00
period: 1m
basePeriod: 1m
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/
// © KAIST291

//@version=4
strategy("prototype",initial_capital=0.01,commission_type=strategy.commission.percent,commission_value=0.1, format=format.volume, precision=0,overlay=true)
// SETTING //
length1=input(1)
length3=input(3)
length7=input(7)
length14=input(14)
length20=input(20)
length60=input(60)
length120=input(120)
ma1= sma(close,length1)
ma3= sma(close,length3)
ma7= sma(close,length7)
ma14=sma(close,length14)
ma20=sma(close,length20)
ma60=sma(close,length60)
ma120=sma(close,length120)
rsi=rsi(close,14)
// BUYING VOLUME AND SELLING VOLUME //
BV = iff( (high==low), 0, volume*(close-low)/(high-low))
SV = iff( (high==low), 0, volume*(high-close)/(high-low))
vol = iff(volume > 0, volume, 1)
dailyLength = input(title = "Daily MA length", type = input.integer, defval = 50, minval = 1, maxval = 100)
weeklyLength = input(title = "Weekly MA length", type = input.integer, defval = 10, minval = 1, maxval = 100)
//-----------------------------------------------------------
Davgvol = sma(volume, dailyLength)
Wavgvol = sma(volume, weeklyLength)
//-----------------------------------------------------------
length = input(20, minval=1)
src = input(close, title="Source")
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
mult2= input(1.5, minval=0.001, maxval=50, title="exp")
mult3= input(1.0, minval=0.001, maxval=50, title="exp1")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
dev2= mult2 * stdev(src, length)
Supper= basis + dev2
Slower= basis - dev2
dev3= mult3 * stdev(src, length)
upper1= basis + dev3
lower1= basis - dev3
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
plot(basis, "Basis", color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))
//----------------------------------------------------
exit=(close-strategy.position_avg_price / strategy.position_avg_price*100)
bull=(close>Supper and BV>SV and BV>Davgvol)
bull2=(close>ma20  and BV>SV and BV>Davgvol)
bux =(close<Supper and close>Slower and volume<Wavgvol)
bear=(close<Slower and close<lower and SV>BV and SV>Wavgvol)
hi=highest(exit,10)
imInATrade = strategy.position_size != 0
highestPriceAfterEntry = valuewhen(imInATrade, high, 0)
// STRATEGY LONG //
if (bull and close>ma3 and ma20>ma60 and rsi<70)
    strategy.entry("Long",strategy.long,0.1)

if (strategy.position_avg_price*1.05<close)
    strategy.close("Long",0.1)

else if (highestPriceAfterEntry*0.999<close and close>strategy.position_avg_price*1.002)
    strategy.close("Long",0.1)
else if (highestPriceAfterEntry*0.997<close and close>strategy.position_avg_price*1.002)
    strategy.close("Long",0.1)
else if (highestPriceAfterEntry*0.995<close and close>strategy.position_avg_price*1.002)
    strategy.close("Long",0.1)
else if (strategy.openprofit < strategy.position_avg_price*0.9-close)
    strategy.close("Long",0.1)
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////


もっと