
この戦略は,移動平均と取引量の技術指標に基づいて,長線を追跡して落を抑制する量化戦略を設計している. 株価が20日線に立つと,その日の買い量が売り量より大きく,過去n日の平均取引量より大きいとき,市場は多頭状態にあると考えられ,購入する. 株価が下落し,その日の売り量が買い量より大きく,過去n日の平均取引量より大きいとき,市場は空頭状態にあると考えられ,売却する.
この戦略は主に2つの指標に基づいて判断されます.
双均線:20日線と60日線を計算し,20日線上から60日線を突破すると,市場が看板状態にあると考えられる.20日線下から60日線を突破すると,市場が看板状態にあると考えられる.
取引量:毎日の取引量 (取引量) を計算し,取引量 (取引量) を上回る取引量 (取引量) が過去n日の平均取引量 (取引量) を上回る場合,多頭取引と判断する.取引量 (取引量) を上回る取引量 (取引量) が過去n日の平均取引量 (取引量) を上回る場合,空頭取引と判断する.
具体的取引戦略と論理は以下の通りです.
多頭入場: 閉盘価格が20日線に立つとき,その日の買い物が売り量と過去n日の平均取引量より大きいとき,市場は看多状態にあると考えられ,波動率に基づいてブリン帯を計算し,閉盘価格がブリン帯の中軌道と下軌道の間にある場合,入場は多する。
空頭入場: 閉盤価格が下位に転落し,その日の売り量が買取量と過去n日の平均取引量より大きいとき,市場は空頭状態にあると考えられ,波動率に基づいてブリン帯を計算し,閉盤価格がブリン帯下位より小さい場合,入場は空空する.
ストップとストップ・損失:合理的なストップとストップ・損失を設定し,利益を固定するか,損失を減らす.例えば,入場価格より大幅な5%の上昇がストップしたとき;損失が10%に達したときのストップ;または,最近の新高を記録した後,株式価格が一定幅で下落したときのストップ.
この戦略の利点は以下の通りです.
双平均線と取引量指標を組み合わせることで,単一の技術指標の判断の盲点を回避した.
異なるパラメータを使用したブリン帯は,特定の取引価格を決定し,入場をより正確にします.
ストップ・ストップ・ストラスト戦略は合理的で,利益をロックし,リスクをコントロールするのに役立ちます.
測定結果は良好で,収益は安定しており,実際に量化取引に使用できます.
この戦略にはいくつかのリスクがあります.
双均線戦略は誤信号を発生しやすいため,結合量能指標をフィルタリングする必要がある.
ブリン帯のパラメータ設定が正しくない場合,入場が頻繁すぎたり稀すぎたりする可能性があります.
固定ストップ・ストラストポイントの設定が不適切で,戦略的利益に影響を与える可能性がある.
膨大な歴史データが必要で,裏返しが必要で,不意にディスクが損なわれる可能性があります.
この戦略は以下の点で最適化できます.
均線システムのパラメータを最適化して,最適な均線組合せを探します.
ブリン帯のパラメータを最適化して,入場をより正確にする.
ストップ・ストップ・ロスを動的に調整し,市場状況に応じて合理的な利益・損失比率を設定する.
MACD,KDなどの他の技術指標の判断を加え,戦略の正確性を向上させる.
機械学習の手法を使って,戦略をより優位にするために,自動で優位なパラメータを検索します.
この戦略は,全体的に非常に実用的な量化取引戦略であり,反測は良好で,実行しやすい,リスクは制御可能であり,実盤に適した安定した戦略であり,量化トレーダーに学ぶ価値があります. もちろん,戦略の最適化の余地はまだ十分であり,より多くの量化取引の熟練者がそれを改善することを期待します.
/*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)
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////