2010年10月25日月曜日

時間帯別ボラティリティー

ふと思いついてヒストリカルデータから時間帯別のボラティリティーを調べてみました。ここで言うところのボラティリティーとは高値-安値のことですがいろいろな通貨ペアの平均を見たかったので、パーセンテージベースの価格で計算を行いました。例えば9時から9時59分までのUSDJPYの高値が85.82で安値が85.22だった場合は85.82-85.22=0.60。これをパーセンテージベースに変換するためにその足の終値で割ります。例えば終値が85.50とすると0.60÷85.50=0.00702となります。

下記のグラフで例えば0.0025は0.25パーセントの値動きを表します。なので例えばUSDJPYのレートが90円であったと過程して逆算(90円×0.0025)すると22.5pips程度の値動きが平均的にあるという事がわかります。

用いたデータは2001年1月から2010年9月までの15通貨ペアのデータです。日本時間ベースで表にしてみました。(夏時間が採用される時期とそうでない場合の2パターン)


上記は15通貨ペア(EURUSD, GBPUSD, USDCHF, USDJPY, EURJPY, GBPCHF, GBPJPY, CHFJPY, USDCAD, AUDUSD, AUDJPY, EURCAD, EURCHF, EURGBP, NZDJPY, NZDUSD)の平均です。通貨ペア毎に活発に取引される時間が違うのかもしれないと思ったので何となく異なった結果になりそうな3つの通貨ペア(USDJPY/GBPCHF/EURUSD)でもグラフにしてみました。

これによれば大体どの通貨ペアも似たような傾向にあるようですね。あとUSDJPYは日本の昼間の時間帯で多く取引されるという傾向も見て取れます。

2010年10月17日日曜日

CBOを検証してみた

今までランダムトレードで自作検証プログラムの動作がOKかを何となく確認してきたのですが今回やっとランダムではないものを試してみました。チャネルブレークアウト (CBO) というものをまずはやってみて、ランダムより良ければ良しということでやってみました。

使ったデータは2001年1月~2010年9月までの1時間足のデータを1年区切りにしたものを利用しました。合計で10年弱分のデータ × 16通貨ペア=160年分のデータでやってみました。

CBOのエントリー時のパラメータEntryPeriod(過去何時間の最高値をつかうか)は20,25,30,35,..,75,80までの13パターンとしました。ExitのパラメータはEntryPeriodを一とした場合の比率として定義(ExitRatio)して0.2~0.8までを0.1ステップ刻みで変化させました。(例えばEntryPeriod=20の場合でExitRatioが0.5の場合Exitに使う期間は10本(時間足を使っているので10時間)ということになります)合計13エントリー期間 × 7Exit比率 ×160年 =14560の結果が得られました。(合計2パラメータ)

今回の設定ではロングもショートもチャンスがくればエントリーするという設定になっていますが以下がそのルール(ロングの場合)です。
  • エントリーはEntryPeriod期間中の最高値を終値ベースで更新した次の始値でエントリーとしました。
  • エグジットは 切り捨て(EntryPeriod×ExitRatio) とし、その期間中の最安値を終値ベースで更新した次の始値でエグジットとしました。

下記の結果はその全ての結果の平均です。CBOがチャネルブレークアウト(今回)の結果で、RANDOMがランダムトレード(今までやっていたやつ)の結果です。(あとPF=プロフィットファクター、AvProf=%ベースのトレードあたりの平均利益をそれぞれ示しています)

たったこれだけのちがい?と思いましたがあくまでこれは16通貨ペアでかつ良い年も悪い年も含め、そしてさらに良いパラメータも悪いパラメータも全部含めての全平均なのでこんなもんなのかもしれません。この2つでU検定を行うと(前回の記事参考)とりあえず意味のある差がある(P値=0.0001)との結果です。(サンプル数が多いのでP値も相当小さいです)

尚上記のデータはすべて0.025%のスプリットが考慮してあります。ランダムのAvProf(パーセンテージベースの平均利益)が-0.025となっているのはまさにそのためでです。(ランダムトレードは(スプリット等を除いて)とんとんになる) ですのでCBOではスプリット等考慮しなければ確率的には+が見込めるということです。

この次のステップとしてはまずはEntryPeriodとExitRatioの各パラメータの指定範囲をもう少し小さくしていってそれでAvProf等の平均値を上げていくことだと思っています。各パラメータは最初は(点ではなく)範囲で指定することが良いことだと考えています。これによってオーバーフィッティングを避けることができてより堅固なシステムができれば良いなぁなどと現時点では考えています。

<1日経過>

まずはEntryPeriodとExitRatioそれぞれと平均利益の関係を見てみたいと思ってグラフにしてみました。以下のような結果が出ました。
これによれば(アバウトですが)EntryPeriodは50~75の範囲、ExitRatioは0.5以上で0.8以上も今後検証したほうがよいといった感じに見受けられます。

そこで次はEntryPeriodを狭めて且つExitRatioは0.5~1.4くらいまででやってみようと思います。

<半日経過>

やってみた結果は以下の通りでした。

少し良くなりましたが微々たるもの。こんなもんなんでしょうかね。今回もまたEntryPeriodとExitRatioそれぞれのパラメータ値毎の平均利益を出してみました。今回はパラメータによっては平均利益がプラスに振れているものが出てきました。
最後に一番良さそうなEntryPeriod=50, ExitRatio=1.3での集計もとってみると以下のような感じでした。また少しだけ良くなりました。

この結果は持ってるデータの10年弱×16通貨ペアの平均なのですが、これじゃ儲かりませんね。平均でそこそこのPF(1.4程度?)もしくはAvProf(0.20%程度?)が出てそして且つ標準偏差が小さいというようものを目指したいと考えています。(これがどのくらい大変なことかは現時点では皆目見当もつきませんが、簡単ではないのだろうなぁと思っています。)

(※後で気が付いたのですが標準偏差の計算が間違っていました!平方根取り忘れてた!なのでこの記事を含め今までの記事で標準偏差とあるものはすべて不偏分散でした。)


2010年10月13日水曜日

統計的な検定をもう少し

前回の投稿でT検定(分散が同じ)、T検定(分散が異なる)、マンホイットニーのU検定を計算してみましたが、今回はもう少し追加で「ためし検定」をやってみました。今まで取った以下の5種類のランダムトレードシミュレーション結果を基にそれぞれを比較(検定)してちゃんと検定ができているかを見てみました。
  • sm00 - サンプル数200程度、スプリット=0.000%
  • sm25 - サンプル数200程度、スプリット=0.025%
  • mid00 - サンプル数2000程度、スプリット=0.000%
  • mid25 - サンプル数2000程度、スプリット=0.025%
  • bg25 - サンプル数20000程度、スプリット=0.025%
上手く行っていればサンプルサイズに関係無くスプリットが違う場合のみP値が小さくなるはずです。
その結果は以下のとおりでした。(AvProfは平均利益です)

やはり正規分布を仮定しなくてよいU検定が一番良いのかなとの結論に達しました。

ちなみに参考までに他の指標(例えばプロフィットファクターとか最大ドローダウンとかで検定した場合はどうなのかと言うことでやってみました。以下がその結果です。

興味深いですね。Sharpe比の場合だとかなりどの検定でも上手くいっています。Sharpe比のヒストグラムはそういえば正規分布に近かったなぁと思い出しました。以下がSharpe比のヒストグラムですがこれが正規分布っぽいのでSharpe比ではU検定でもT検定でも上手くいくのかもしれませんね。統計の専門家に聞きたいところです。


統計の力

前回の投稿でスプリットを変えて計算結果の確認をしましたが本当は統計の力を借りないといけないのかもしれないと思いいろいろ調べてみました。2つの結果の比較に利用できそうだと思ったものはT検定(分散が同じ)、T検定(分散が異なる)、U検定(マンホイットニーのU検定と言うらしい)等です。調べによるとそれぞれ前提条件が違います。
T検定(分散が同じ):サンプルが正規分布であること
T検定(分散が異なる):サンプルが正規分布であること
マンホイットニーにU検定:2つのサンプルの分布の形が同じであること

ランダムトレードの結果で平均利益のヒストグラムは以下のようにだいぶ尖がっていて正規分布じゃないんじゃないかとの結論に達しました。なのでU検定?かなと思っていたのですが、いろいろWebを見ているとT検定でもいいんじゃないかというようなことが書いてあったりまぁよくわからないのでとりあえず上記全部を計算させてみることにしました。

結果は以下の通りでした。(平均利益の比較)

T検定(分散が同じ)のP値=0.0000
T検定(分散が異なる)のP値=0.0000
マンホイットニーにU検定のP値=0.0001

P値が0.05(5%)もしくはより厳しく判断するのであれば0.01(1%)以下であれば結果に統計的に意味のある違いがみられるということらしいです。今回は明らかに違い過ぎてものすごく小さいということだと思います。が、本当に計算がうまくいっているのだろうか?と少し疑問に思い、もう少しサンプル数の少ないパターンでの比較をやってみようと思いました。上記の結果はサンプル数がそれぞれ2000前後のサンプルA(スプリット0.0%)とサンプルB(スプリット0.025%)の比較だったので今度はサンプル数を200程度に落として再度計算をさせてみました。その結果は

T検定(分散が同じ)のP値=0.051937
T検定(分散が異なる)のP値=0.051937
マンホイットニーにU検定のP値=0.015005


でした。上手くいっているような感じです。しかし分散が異なる場合と同じ場合でなぜか答えが同じでした。(分散が同じということだろうか?)

続きはこちら

2010年10月11日月曜日

ランダムトレードシミュレーション動作確認

この前からやっているランダムトレードシミュレーションの続きです。

今回はスプリットの効果が効いているかということをチェックしました。 というのも今回のシミュレーションソフトはまだ作成中のしろものでうまく計算ができているか等まだまだ自信が持てないからです。今までここに載せた数値はすべてスプリットを0.025%で計算していたものなので必然的に利益平均は若干マイナスであるはずで、実際にもそれらしくマイナスになっていました。

※参考までにここでスプリット0.025%を実際の金額ベースのスプリットに換算するには例えば以下のように現在のレートとパーセンテージベースの値をかけ合わせます。
例)
  • USDJPY 81.88円ならば: 81.88 × 0.00025 = 0.02047 → 約100分の2円(2銭)
  • GBPJPY 130.55円ならば: 130.55 × 0.00025 = 0.0326 → 約100分の3.3円(3.3銭)
  • EURUSD 1.3929ならば: 1.3929 × 0.00025 = 0.000348 → 約100分の3.5セント
パーセンテージベースで計算しているのは、通貨ペアが異なっても一括で同じ計算ができるようにするためです。(これはトレーディングシステム入門(トーマス・ストリズマン著)という本からのネタです。)

今回は一応プログラムでのsplitの計算がうまくいっていそうかどうかをチェックしようということでスプリット0.0%の場合とスプリット0.025%と念のために0.075%の3パターンでの結果を出してみました。

スプリット0%の場合
profit factor = 1.05
平均利益 = 0.004%




スプリット0.025%の場合
profit factor = 0.9621239,
平均利益 = -0.021%




スプリット0.075%の場合
profit factor = 0.81
平均利益 = -0.071%


大体予想通りの結果でまずまず上手く計算できているようでした。今回でスプリット=0.025%は少し甘すぎかもしれないと改めて思いました。





収益曲線の回帰残差の標準誤差

この間からやっているランダムトレード(いろんな通貨ペアでランダムにトレードを行って収益やプロフィットファクタ、勝率等を計算)して算出された結果の相関関係をみるということを少し通貨ペアを増やしてやってみました。今回は通貨ペアを増やして(合計16ペア)でまたまた相関をとってみました。

あと今回は「売買システム入門(Turshar S. Chande著)」からネタを仕入れた「収益曲線の回帰残差標準誤差」なる指標も計算させてみました。 この指標はどれだけなめらかに収益が伸びているかということを表すというもので小さければ小さいほどよいというものです。今回はその数値で平均利益を割った数値をRSEという名前で算出しました。それからもう一つ収益曲線の回帰残差から算出するRSDなる数値(過去の投稿でRSSとか読んでいたやつを少し変更)も合わせて出しています。

今後これらの数値のどれかがシステムの良し悪しの評価に使えないかなと考えています。

相関の結果は以下のような感じでした。


追加情報としてランダムトレードにおいてのRSEと平均利益の散布図を描いてみました。

システムの良し悪しの判断に使えそうな指標のもう一つにSharpe比というものがあるのですがこちらも比較対象として以下に載せてみます。Sharpe比は1を超えると良いモデルということらしいです。

参考までに他の数値の例として勝率と平均利益(AveProf)の散布図は以下のような感じでした。

更にランダムトレードにおいてのRSEのヒストグラムは以下のような感じです。

Sharpe比のヒストグラムは以下のような感じでした。

今後の記録のためにとっておきたいと思います。



2010年10月10日日曜日

散布図 (平均利益:勝率、最大ドローダウン、平均ドローダウン、etc.)

この間から検証用のプログラムを書いていて、現在はまだランダムトレードがやっとできるようになった状態です。 ランダムトレードの結果はExcelでグラフにしていたのですが、なかなか面倒なので何とか自動的にできないかなぁと思って少ししらべたところ、グラフを簡単に生成してくれるGnuPlot(フリー)を見つけてありがたく利用させてもらうことにしました。

GnuPlotはいわゆるCSVで出てくる検証結果を簡単にプロットして画像を作成してくれるという優れもので、これの利用方法がわかったおかげで、この間から掲載している散布図のようなグラフもあっという間にできるように! こんな良いソフトがただなんてありがたいですね。

その結果例をいくつか以下に掲載します。今回は平均利益(%価格ベース)対他の指標値の散布図です。

プロフィットファクターとの散布図よりこっちのほうがわかりやすいかもしれません。今後はこっち(平均利益 v.s 他の数値)のプロット図を作成しようと考えています。

あと各項目のヒストグラムも自動生成できるようにしたいと考えています。

最大ドローダウン:平均利益

CDD(平均利益÷トレードあたりの平均ドローダウン):平均利益


RSS(平均利益÷収益曲線の回帰残差の標準偏差:平均利益

Sharpe比:平均利益

勝率:平均利益

相関 (平均利益、勝率、最大ドローダウン、etc.)

この間からヒストリカデータででランダムなトレードを行ってみて、その結果から各種集計結果の相関を調べてみるということをやっています。 もう少したくさんのデータを取ってみました。この間の結果はこちら

今回の結果は以下の通りでした。



使ったデータは今回も2001年から2010年まで1年ごとに11種類の通貨ペアで1時間足。
エグジットを今回はトレード開始から6時間先、7時間先、...、96時間先まででデータをとりました。
あといつエントリーするかと方向(ロング・ショート)を乱数で決定するという方法でデータを作成しました。

前回誤りのあったRisk Reward Ratioの計算を修正しました。

各パラメータは以下のとおり。
 PF=プロフィットファクター
 AvProf=トレードあたりの平均収益
 Sharpe=Sharpe比というもの。(簡易計算)
 SD(%)=標準偏差(パーセンテージベース)
 RSS=AvProf÷(収益曲線の)回帰残差の標準偏差
 CDD=AvProf÷トレードあたりのドローダウン
 RRR=Risk Reward Ratio
 WIN(%)=勝率
 NTR=トレード数
 AvDur=平均ポジション保有期間
 MxDur=最大ポジション保有期間
 MxDDN=最大ドローダウン
 LDDN=最長ドローダウン期間
 Efcy(%)=トレード効率
 EfcyIn(%)=エントリーのトレード効率
 EfcyOut(%)=エグジットのトレード効率

2010年10月8日金曜日

散布図 (プロフィットファクター:エントリーの効率、エグジットの効率、トレード全体の効率)

この前からの続きです。ランダムトレードの結果から今度はトレード効率(全体、エントリー、エグジット)対プロフィットファクターの散布図です。
トレード効率はトーマス・ストリズマン氏のトレーディングシステム入門から(ねたを)仕入れました。たとえばロングの場合だと以下の式で求めます。

全体効率
(Close-Open)÷(トレード期間中のHigh-トレード期間中のLow)

エントリー効率
(トレード期間中のHigh-Open)÷(トレード期間中のHigh-トレード期間中のLow)

エグジット効率
(Close-トレード期間中のLow)÷(トレード期間中のHigh-トレード期間中のLow)

以下が全体効率対Profit Factorの散布図です。

以下がエントリー効率対Profit Factorの散布図です。

そして最後がエグジット効率対Profit Factorの散布図です。

2010年10月7日木曜日

散布図 (プロフィットファクター:トレード数)

この前からの続きです。ランダムトレードのデータを用いて今度はトレード数とプロフィットファクターの散布図を書いてみました。

以下のような感じです。今回のデータは1年間ランダムトレードを行った場合を想定しているので年間でのトレード数とプロフィットファクターの関係が示されています。

散布図 (プロフィットファクター:最大ドローダウン、最長ドローダウン期間)

この前の投稿からの続きです。ランダムトレードで今度は最大ドローダウン(パーセンテージベース)とプロフィットファクターの散布図を出してみました。

最長ドローダウン期間とProfit Factorのものは以下のような感じです。
上限が6000程度なのは1時間足1年間分がだいたい6200本だからです。

散布図 (プロフィットファクター:勝率、標準偏差、リスクリワード比)

この前の投稿からの続きで、ランダムトレードにおいてのいくつかの散布図をもう少し載せてみます。

今後これが役立つとよいのだが。。。

まず勝率とプロフィットファクタは以下のような感じです。

次にパーセンテージベース価格の標準偏差とプロフィットファクターの散布図です。
Risk-Reward Ratioは以下のとおりです。

散布図 (プロフィットファクター:回帰残差SD、平均ドローダウン指標、Sharpe比)

Profit Factorと回帰残差のばらつきベースの集計値との散布図を書いてみました。
散布図用のデータはひとつ前の投稿で使ったランダムトレードのものを用いました。

参考までに、その他の集計値での散布図は以下のとおりです。
(平均利益との散布図はこちら

今後モデルの良さをはかるための指標としてSharpe比とRSS(トレードあたりのパーセンテージベースの平均収益÷収益曲線回帰残差の標準偏差)とCDD(トレードあたりのパーセンテージベースの平均収益÷トレードあたりのパーセンテージベースのドローダウン)が使えそうだと思っています。

RSSとプロフィットファクターの結果はこのような感じです。 これをどう解釈するのかは今一つわかりません。が、今後の記録のために取っておくことにします。


そして以下がCDDとProfit Factorの散布図です。

最後にもう一つ。Sharpe比というものとProfit Factorの散布図です。

ランダムトレードシミュレーション

ヒストリカルデータでランダムなトレードを行ってみて、その結果から各種集計結果の相関を調べてみました。
結果は以下の通り。 (こっちにはもっと新しいのがあります。更にこちらにはそれより新しいのがあります)



使ったデータは2001年から2010年まで1年ごとに11種類の通貨ペアで1時間足。
エグジットをトレード開始から2時間先、3時間先、...、96時間先まででデータをとりました。
あといつエントリーするかと方向(ロング・ショート)を乱数で決定するという方法でデータを作成しました。

最近自作の検証用プログラムを作りはじめ、はじめてまともに取ってみたデータということもあり、その検証用のプログラムがまともに動いているか手探りの状態なのでどこまでこの結果に意味があるかは定かではありません。

今回そもそもこのランダムトレードの検証をやってみようと思ったのは、今後の検証にあたってSharpe比とか回帰残差ベースの指数やドローダウンベースの指数がどの程度使えるものなのかを調べてみたいと思ったからです。

個人的にはRSSで示されている回帰残差ベースの数値が良さそうな気がしています。(プロフィットファクターとの散布図はこちら) ちなみにRSSは名前として変です。もともと残差平方和の意味でRSS(Residual Sum of Squares)としていたのですが、最終的に制作過程で違う数値になっていますので今後名前を変えようかと考えています。

ランダムトレードの結果は今後のベースとなってくれるかもしれない。このランダムトレードの結果は何も戦略がない状況と考えて、今後はいろいろな戦略のアイディアをシミュレーションしてみて散布図、ヒストグラム、各数値などの比較ができれば良いなと思っています。最終的には数種類の異なる性格をもったルールがシンプルで堅固なシステムというのが目標です。(しかも数種類異なるタイプのものができたらなおよいですね。)

各パラメータは以下のとおり。
 PF=プロフィットファクター
 PF-L=プロフィットファクターロングのみ
 PF-S=プロフィットファクターショートのみ
 AvProf=トレードあたりの平均収益
 Sharpe=Sharpe比というもの。(簡易計算)
 SD(%)=標準偏差(パーセンテージベース)
 RSS=AvProf÷(収益曲線の)回帰残差の標準偏差
 CDD=AvProf÷トレードあたりのドローダウン
 RRR=Risk Reward Ratio
 WIN(%)=勝率
 WIN(%)-L=勝率ロングのみ
 WIN(%)-S=勝率ショートのみ
 NTR=トレード数
 NTR-L=トレード数ロングのみ
 NTR-S=トレード数ショートのみ
 AvDur=平均ポジション保有期間
 MxDur=最大ポジション保有期間
 MxDDN=最大ドローダウン
 LDDN=最長ドローダウン期間
 Efcy(%)=トレード効率
 EfcyIn(%)=エントリーのトレード効率
 EfcyOut(%)=エグジットのトレード効率
 OUTDAYS=トレード日数(今回はこれを2から96の範囲でデータを作成した)