ヴォスフィルターとトレンドインジケーターに基づく定量的な取引戦略

作者: リン・ハーンチャオチャン, 日付: 2023-09-19 16:59:10
タグ:

概要

この戦略は,Voss予測フィルターとEhlers瞬時トレンドライン指標を組み合わせて,定量取引の市場における周期的なターニングポイントを特定する.Vossフィルターは早期の購入/売却信号を提供し,トレンドラインインジケーターはトレンド市場におけるVossフィルターからの誤解を避けるために全体的なトレンド方向を決定する.この戦略は,良好なバックテスト結果によって証明されているように,周期的なパターンを示すBitcoinのような楽器でうまく機能する.

戦略の論理

Voss 予測フィルター

ヴォスフィルターは,ジョン・F・エラーズの記事"A Peek Into The Future"から得られたもので,計算は以下の通りである.

_filt = 0.5 * _s3 * _x1 + _f1 * _s2 * _filt[1] - _s1 * _filt[2] 
_voss = _x2 * _filt - _sumC

ここで _x1 は 1 番目の順序の価格差, _x2 はスムーズ化因数, _s1, _s2, _s3 はフィルターパラメータ, _f1 はサイクルパラメータ, _filt はフィルター出力, _voss は最終出力.

フィルターは,初期信号を生成するために,現在のおよび過去のサイクル情報を強調する滑らかなフィルターとして見ることができる.固有のグループ遅延のために,他の指標よりも前に予測信号を生成するために,未来を眺めている.

インスタントトレンドライン指標

トレンドライン指標は以下のように計算されます.

_it = (_a-((_a*_a)/4.0))*_src+0.5*_a*_a*_src[1]-(_a-0.75*_a*_a)*_src[2]+2*(1-_a)*nz(_it[1])+-(1-_a)*(1-_a)*nz(_it[2]) 

価格動向にぴったり合う リアルタイムでトレンドラインを描き トレンドの方向性と強さを正確に決定します

戦略の論理

Voss がフィルター結果を通過すると買い信号が生成される.

Voss がフィルター結果を通過すると売り信号が生成されます.

トレンドラインインジケーターによって確認された場合のみ取引信号が受け入れられます.これはトレンド市場におけるボスフィルターからの間違った信号を避けるためです.

利点

  • Vossフィルターは,周期的な回転を捕捉するための早期予測信号を提供します.
  • トレンドライン インジケーターは,間違った信号を避けるために,トレンド方向を正確に決定します
  • パラメータは,異なるサイクルと市場環境に最適化できます
  • リスク管理のために停止を加えることができます

リスク と 軽減

  • 戦略は初期信号に依存し,いくつかの傾向を見逃す可能性があります
  • 強いトレンドで反トレンド信号が現れ,損失を引き起こす可能性があります.

リスクは以下によって軽減できます.

  • 計器サイクルのための最適化期間パラメータ
  • 偽信号を減らすためにフィルターの帯域幅を減らす
  • 強いトレンドに対するシグナルを避けるためにトレンドフィルターを追加する
  • 取引ごとに損失を制御するためにストップを使用する

増進 の 機会

戦略は以下によって改善できます.

  • クローズ,移動平均等など,異なる価格源を試す
  • 特定の計器サイクルのためのフィルター調整期間
  • 傾向指標のパラメータを最適化し,傾向をより良く検出する
  • より良い組み合わせのために異なる傾向指標を試す
  • より良いリスク管理のためにストップ,トラッキングストップを追加
  • 最良パラメータセットのためのパラメータ最適化

結論

この戦略は,ボスフィルターとトレンドインジケーターを組み合わせて,市場の周期的な転換を効果的に特定する.最適化されたパラメータとリスク制御により,堅牢な定量的な取引システムを生成することができる.良質なバックテスト結果によって証明されるように,周期的なパターンを示す楽器に適用できる.全体として,この戦略はユニークな予測能力を持ち,多次元最適化を通じて拡張する幅広い可能性を持っています.


/*backtest
start: 2023-08-19 00:00:00
end: 2023-09-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// A Peek Into the Future
// John F. Ehlers
// TASC Aug 2019

// Created by e2e4mfck for tradingview.com
// Modified by © Bitduke

//@version=4
//strategy("Voss Strategy (Filter + IT)", overlay=false, calc_on_every_tick=false,pyramiding=0, default_qty_type=strategy.cash,default_qty_value=1000, currency=currency.USD, initial_capital=1000,commission_type=strategy.commission.percent, commission_value=0.075)

// voss filter

source = input(close, type = input.source)
period = input(20, type = input.integer)
predict = input(4, type = input.integer)
bandwidth = input(0.25, type = input.float)

// it trendline

src = input(hl2, title="Source IT")
a = input(0.07, title="Alpha", step=0.01) 
fr = input(false, title="Fill Trend Region")
ebc = input(false, title="Enable barcolors")
hr = input(false, title="Hide Ribbon")


voss_filter (_period, _predict, _bandwidth, _source) =>
	float _filt = 0, float _sumC = 0, float _voss = 0
	_PI		= 2 * asin(1)
	_order	= 3 * _predict
	_f1		= cos(2 * _PI / _period)
	_g1		= cos(_bandwidth * 2 * _PI / _period)
	_s1		= 1 / _g1 - sqrt(1 / (_g1 * _g1) - 1)
	_s2		= 1 + _s1
	_s3		= 1 - _s1
	_x1		= _source - _source[2]
	_x2		= (3 + _order) / 2

	for _i = 0 to (_order - 1)
		_sumC := _sumC + ((_i + 1) / _order) * _voss[_order - _i]

	if bar_index <= _order
		_filt := 0		
		_voss := 0		
	else			
		_filt := 0.5 * _s3 * _x1 + _f1 * _s2 * _filt[1] - _s1 * _filt[2]
		_voss := _x2 * _filt - _sumC

	[_voss, _filt]


[Voss, Filt] = voss_filter(period, predict, bandwidth, source)


instantaneous_trendline (_src, _a, _freq, _ebc, _hr) =>
    _it = 0.0
    _it := (_a-((_a*_a)/4.0))*_src+0.5*_a*_a*_src[1]-(_a-0.75*_a*_a)*_src[2]+2*(1-_a )*nz(_it[1], ((_src+2*_src[1]+_src[2])/4.0))-(1-_a)*(1-_a)*nz(_it[2], ((_src+2*_src[1]+_src[2])/4.0))
    _lag = 2.0*_it-nz(_it[2])
    
    [_it, _lag]

[it, lag] = instantaneous_trendline(src, a, fr, ebc, hr)

// - - - - -  - - - - - //

plot(Filt, title = "Filter", style = plot.style_line, color = color.red, linewidth = 2)
plot(Voss, title = "Voss", style = plot.style_line, color = color.blue,	linewidth = 2)
hline(0.0, title = "Zero", linestyle = hline.style_dashed, color = color.black,	linewidth = 1)
plot(hr? na:it, title="IT Trend", color= fr? color.gray : color.red, linewidth=1)
plot(hr? na:lag, title="IT Trigger", color=fr? color.gray : color.blue, linewidth=1)


// Strategy Logic
longCondition =  lag < it  and crossover(Voss,Filt) 
shortCondition = it > lag and crossover(Filt,Voss) 

strategy.entry("Voss_Short", strategy.short, when=shortCondition)
strategy.entry("Voss_Long", strategy.long, when=longCondition)


// === Backtesting Dates === thanks to Trost

testPeriodSwitch = input(true, "Custom Backtesting Dates")
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, testStartHour, 0)
testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(2, "Backtest Stop Month")
testStopDay = input(29, "Backtest Stop Day")
testStopHour = input(0, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, testStopHour, 0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
testPeriod_1 = testPeriod()
isPeriod = true
// === /END

if not isPeriod
    strategy.cancel_all()
    strategy.close_all()


もっと