今回は一般的なテクニカルインジケーターは使わず、終値の標準偏差とパーセンタイルを使って
市場のモメンタムの方向に仕掛けるシステムを検証していきたいと思います。
海外でもヘッジファンドの多くは統計学的手法を使っているところが多く、マーケットの魔術師の
ラリーハイトはベイズ統計を使ってますし、近年ジョージ・ソロスやウォーレン・バフェットを上回る
リターンを記録したルネッサンステクノロジーのジェームズシモンズは元数学者でトレードでは
全て統計解析でアルゴリズム化したシステムトレードを行っており、トレードに統計学を使うことには優位性があるとみています。
では、ポンド円の8時間足で2016年~現在までの5年間で検証していきます。
まず仕掛けのシグナルに終値の10本のバーの標準偏差を計算します。
標準偏差とは分散の正の平方根で、データや確率変数の散らばり具合を示し、pineスクリプトではstdev関数を使用します。
そして、その終値の標準偏差を18期間の平均で平滑化した移動平均をsma関数を使って計算します。
現在の標準偏差の値が標準偏差の移動平均をクロスオーバーした時、つまり終値の標準偏差が大きくなった時に
市場のモメンタムが強くなったということなので終値が過去10本のバーの75パーセンタイルならロングエントリー
終値が過去10本のバーの25パーセンタイルならばショートエントリーします。
パーセンタイルとはデータ数値を髙い順で並べて任意の数値が全体の何パーセントの大きさであるかを示します。
50パーセンタイルだったら全てのデータの中央値(メジアン)となります。
利益がポジションサイズ×8×ATRのところにターゲットストップを置き、損切りは資産の5%
もしくは5期間の高値と安値のレンジの0.8倍の距離のいずれか小さい数値にロスカットを置きます。
現在の終値が仕掛け値から2ATR以上の利益が出ていればロスカットをキャンセルして
10期間の終値の20パーセンタイルでトレイリングストップ。
ポジションサイジングは投資資金の5%を過去2000期間のATRの最高値で割った数に0.3を掛けた数とします。
ここまでの説明から、すべてのパラメータセットに市場のボラティリティを計算に含んでいるので仕掛けや手仕舞い
の数値は市場の状態に応じて常に変化していくダイナミックなシステムとなっています。
チャートを見ると価格が勢いを失って反対方法に動き始めたときに上手く仕掛けることができており、
資産曲線も滑らかに上昇しており、プロフィットファクターは1.68で期待値は31%、リカバリーファクターは5.98と
非常に素晴らしいシステムであることが検証できました。
BCount = input(18, title="STD平均", step=2, minval=8, maxval=30)
PCount = input(75, title="CLパーセンタイル", step=5, minval=20, maxval=80)
sub_param = input(false, type=input.bool, title="リバース")
var cantrade = false
var close_20st = array.new_float(10, close)
if close - close[1]
array.remove(close_20st,0)
array.push(close_20st,close)
std_20close = array.stdev(close_20st)
stdEM = sma(std_20close,BCount)
if sub_param == false
if std_20close >= stdEM
cantrade := true
else
cantrade := false
else
if std_20close <= stdEM
cantrade := true
else
cantrade := false
if strategy.opentrades != 0
cantrade := false
//買いシグナル△
BUY = if sub_param == false
cantrade == true and close >= percentile_nearest_rank(close,10,PCount)
else
cantrade == true and close <= percentile_nearest_rank(close,10,100 - PCount) and close > close[1]
//売りシグナル▽
SELL = if sub_param == false
cantrade == true and close <= percentile_nearest_rank(close,10,100 - PCount)
else
cantrade == true and close >= percentile_nearest_rank(close,10,PCount) and close < close[1]
市場のモメンタムの方向に仕掛けるシステムを検証していきたいと思います。
海外でもヘッジファンドの多くは統計学的手法を使っているところが多く、マーケットの魔術師の
ラリーハイトはベイズ統計を使ってますし、近年ジョージ・ソロスやウォーレン・バフェットを上回る
リターンを記録したルネッサンステクノロジーのジェームズシモンズは元数学者でトレードでは
全て統計解析でアルゴリズム化したシステムトレードを行っており、トレードに統計学を使うことには優位性があるとみています。
では、ポンド円の8時間足で2016年~現在までの5年間で検証していきます。
まず仕掛けのシグナルに終値の10本のバーの標準偏差を計算します。
標準偏差とは分散の正の平方根で、データや確率変数の散らばり具合を示し、pineスクリプトではstdev関数を使用します。
そして、その終値の標準偏差を18期間の平均で平滑化した移動平均をsma関数を使って計算します。
現在の標準偏差の値が標準偏差の移動平均をクロスオーバーした時、つまり終値の標準偏差が大きくなった時に
市場のモメンタムが強くなったということなので終値が過去10本のバーの75パーセンタイルならロングエントリー
終値が過去10本のバーの25パーセンタイルならばショートエントリーします。
パーセンタイルとはデータ数値を髙い順で並べて任意の数値が全体の何パーセントの大きさであるかを示します。
50パーセンタイルだったら全てのデータの中央値(メジアン)となります。
利益がポジションサイズ×8×ATRのところにターゲットストップを置き、損切りは資産の5%
もしくは5期間の高値と安値のレンジの0.8倍の距離のいずれか小さい数値にロスカットを置きます。
現在の終値が仕掛け値から2ATR以上の利益が出ていればロスカットをキャンセルして
10期間の終値の20パーセンタイルでトレイリングストップ。
ポジションサイジングは投資資金の5%を過去2000期間のATRの最高値で割った数に0.3を掛けた数とします。
ここまでの説明から、すべてのパラメータセットに市場のボラティリティを計算に含んでいるので仕掛けや手仕舞い
の数値は市場の状態に応じて常に変化していくダイナミックなシステムとなっています。
チャートを見ると価格が勢いを失って反対方法に動き始めたときに上手く仕掛けることができており、
資産曲線も滑らかに上昇しており、プロフィットファクターは1.68で期待値は31%、リカバリーファクターは5.98と
非常に素晴らしいシステムであることが検証できました。
BCount = input(18, title="STD平均", step=2, minval=8, maxval=30)
PCount = input(75, title="CLパーセンタイル", step=5, minval=20, maxval=80)
sub_param = input(false, type=input.bool, title="リバース")
var cantrade = false
var close_20st = array.new_float(10, close)
if close - close[1]
array.remove(close_20st,0)
array.push(close_20st,close)
std_20close = array.stdev(close_20st)
stdEM = sma(std_20close,BCount)
if sub_param == false
if std_20close >= stdEM
cantrade := true
else
cantrade := false
else
if std_20close <= stdEM
cantrade := true
else
cantrade := false
if strategy.opentrades != 0
cantrade := false
//買いシグナル△
BUY = if sub_param == false
cantrade == true and close >= percentile_nearest_rank(close,10,PCount)
else
cantrade == true and close <= percentile_nearest_rank(close,10,100 - PCount) and close > close[1]
//売りシグナル▽
SELL = if sub_param == false
cantrade == true and close <= percentile_nearest_rank(close,10,100 - PCount)
else
cantrade == true and close >= percentile_nearest_rank(close,10,PCount) and close < close[1]