2010年11月28日日曜日

レンジ判別フィルター

レンジとトレンドの判別をするフィルターはいろいろな方法があると思うのですがなかなか実際に組み合わせて使おうとすると上手くいかないなぁーと常々思っています。例えば長期の移動平均が示す方向だけにエントリーするというようなことが本に書かれていたりしますが、実際に組み合わせてみると今一つ上手く行きません。

この間の記事に書いたNC(Naked Close)トレーリングをいろいろ試していたときに、ふとNaked Closeがレンジ判別に使えるかもしれないと思ったので早速試してみました。

ちなみにNaked Closeとは現在の終値がひとつ前の足の高値を超えているかあるいはひとつ前の安値より下の場合を言います。Naked Closeが発生する状況とはどういう状況なのか考えてみると、(ロングの場合)少なくともひとつ前の高値を超えた状況(新値)で且つある程度の勢いがある状況と言えるかと思います。Naked Closeがよく発生するのはトレンドが発生した時と、後はトレンドが終わる前に急上昇するような場合のようです。

Naked Closeをフィルターにどう使うかということは前述のとおりNCトレーリングをもう少し改良できないかということを考えながらチャートを眺めていた時にひらめきました。チャートを眺めていると例えば上昇トレンドが発生した状態ではロング方向のNCトレーリングの値もショート方向のNCトレーリングの値も実値の下にある状態になります。一方でレンジの場合にはロング方向のトレーリングとショート方向のトレーリングの間に実値があるような状態となります。

これを利用してトレーリングラインのロング方向とショート方向の間に実値がある場合をレンジとし、どちらのトレーリングラインよりも上に実値がある場合を上昇トレンド状態、下にある場合を下降トレンド状態として表示させて見ました。以下の緑の線と赤の線がトレーリングラインで、この2本の線の両方の上に実値(今回は (High+Low+Close)÷3で計算しています)がある場合は上昇OK、両方の下に実値がある場合は下降OK,そうでない場合はレンジとしています。下の赤と緑がフィルター状況を表しています。赤が下降トレンド状態、緑が上昇トレンド、何もないところ(黒)はレンジを表しています。

補足でもう一枚画像を載せておきます。水色でSMA(20)を表示しています。また一番下の赤と緑はSMA(20)の傾きがプラスかマイナスかを表しています。SMAではだましが発生するような横ばいの状況でそこそこ上手くフィルタリングができている感じです。


自分では「これは結構面白いフィルターかもしれない!」と思っているのですが、実際に上手く組み合わせて使えるかどうかを今後はもう少し検証したいと思っています。こういう検証をやっていると「自分の発見は大発見!」と思いたい発見(?)が多々ありますが、実際にしばらく検証すると全然使えない代物ということが良くありますねー。これもその一つかもしれません。

2010年11月25日木曜日

NCトレーリングExit+ボリンEntryを検証

ATRトレーリングよりも良いトレーリングで説明したNCトレーリングをエグジットに使って、エントリーをボリンジャーの2σタッチでその方向へエントリーするという方法で検証して見ました。前回はエントリーは(方向もタイミングも)ランダムにて検証しましたが今回はエントリーにもう少し意味を持たせて見ての検証です。 ボリンジャーの期間は20から34の範囲で、そしてNCトレーリングのFactor(どれだけはなれてトレーリングするか)は2.5から6.0の範囲で検証を行いました。

例によって16通貨ペア、1時間足、2001年から2010年の途中までのデータで検証を行いました。結果は以下の通りでした。

平均PF=1.06
平均利益=0.015%
利益の標準偏差=0.101%


ランダムにエントリーしてNCトレーリングでエグジットした場合の平均利益は0.001%だったので今回の方が少し意味のあるエントリーになっているようです。この小さな数値の変化にどれだけ意味があるのか?とも思いますが、最近は「実はこの小さな違いも結構意味があるのでは」と思うようになっています。

パラメータ(2つ)と平均利益の関係図は以下のような感じでした。
これによればボリンジャーの期間は24から28の範囲でトレーリングのFactorは4.5から5.5のあたりが良いようです。これだけ範囲がきれいに出ているというのは良いことだと思うのですが、平均利益が0.02%とかだとまだまだ勝てないですね。これをどうすればもっと勝てるようにできるのかが課題です。

ちなみにボリンジャー以外のエントリー方法(平均移動クロス、ストキャスティックを使ったエントリー、などなど)もいろいろ試しつつあります。エントリーは少しタイミングが違うだけでどれでも同じようなものというような意識を持っていましたが、実際にいろいろ試すと結構違います。特にこの違いは平均利益とかProfitFactorではほぼ同じような数値であっても、上記のようなパラメータの関係図には結構違いがはっきり現れるようです。(上記のように比較的きれいに最適パラメータの範囲が見えるものとそうでないものがある) 参考までに以下は平均移動を終値がまたいだらその方向へエントリーといつ方法で検証を行った場合の結果です。


平均PF=1.04
平均利益=0.008%
利益の標準偏差=0.109%


以下はパラメータと利益の関係図です。








Pivot、R1,S1のヒット確率

本屋でしろふくろうさんという方の本を見かけ、その中に書かれていたPIVOTに到達する確率についての記述に興味をひかれました。しろふくろうさんはフィボナッチピボットを用いて5年分の日足データでPivot、R1,S1等のラインにどのくらいの確率で到達するのかを検証してみたとのことでした。それによればPivotラインにはかなりの確率(確か70%くらいだったと思います。記憶が定かではありません)でタッチするとのことで、その上下のR1、S1ラインにそれよりも少ない確率ですが何%かの確率で到達するというものです。興味深かったのは前日が上昇(前々日のClose<前日のClose)の場合にはR1への到達確率がS1への到達確率よりも大分大きいということ(前日が下降の場合はその反対)でした。

これは面白い!と思い早速自分でも検証してみました。私は現在1時間足のデータでいろいろ検証しているのでとりあえず1時間足で検証してみました。使ったのは例によって16通貨ペアで1時間足、2001年から2010年の途中までのデータです。Pivotの計算は以下のように行いました。(この計算はワイルダー氏の方法ではなくてフィボナッチピボットと呼ばれるものらしいです)

Pivot = (ひとつ前の足のH + ひとつ前の足のL + ひとつ前の足のC) ÷ 3
Range = ひとつ前の足H - ひとつ前の足L
R1=Pivot+Range*0.5
S1=Pivot-Range*0.5

ひとつ前の足の上下でR1とS1への到達確率が半々の確率でなくなるのであれば、あとは回数をこなせば勝てるということだと思って、そんなに簡単なことなのか?と思ってしまいました。(当然そんな簡単ではないということがいろいろやってみてわかりました。下記参照)

まずはPivotとR1、S1を計算して集計を行いました。結果は以下の通りで、確かに前日の上下によって到達確率にかなりの違いが見られます。例えばひとつ前が上昇の場合にはR1への到達確率がS1の到達確率と比較して結構違います。(下記のパーセントのカラムを足して100%にならないのは例えばR1とS1の両方に到達するケース等の重複があるからです)

おおよそ上下の方向によって53%対33%ということでこのままトレードの数をこなせば勝てるということだと早合点しました。

これはすごいと思って「いったい一回あたりのトレードでいくら勝っているのだろうか?」という点を次に調べようと思いました。上昇もしくは下降でCloseした足の次の足の始値でエントリーすると仮定して、始値からR1およびS1までの価格差(距離)を測ったところ以下のような集計結果が出ました。(下記は距離をパーセンテージベースの価格で表しています。)

これはつまり前日が上昇だった場合は(少し考えると当然なのですが...)始値からR1までの距離が始値からS1までの距離よりも短くなり、逆に前日が下降だった場合は始値からS1までの距離がR1までの距離よりも短くなるので、必然的に到達確率が良くなるということでした。距離と到達確率を掛け算してみるとほぼトントンという結果でした。

ということで今回は「そんな上手い話しがあるはずないか」という結論でした。

こう言ったぬかよろこびは検証をしていると良くありますね。 多くの場合はプログラムミスとかそんな結論なのですが今回も少し残念でした。

しかしこの確率を検証してみると言う考え方は今後活用したいと思いました。

2010年11月20日土曜日

ATRトレーリングよりも良いトレーリング (NCトレーリング)

前回の投稿からいろいろ考えてATRトレーリングよりも良くするにはどうするのかを考えました。良いトレーリングはトレーリング幅を狭めるべく時と狭めずに待つべき時の状況判断が良くできるトレーリングだと考えて、まずはどのタイミングでトレーリング幅を狭めて良いのかを考えました。

例えば新値(5)を更新したタイミングでトレーリング幅を狭めるとかそういう考えも良いかもしれませんが、今回は別のところ(Larry Williams氏のサイトでhttp://www.ireallytrade.com/というサイトがあるのですがそこでメールアドレスを登録すると読める記事)でヒントを得たFalse Breakの条件の一つをきっかけとしてトレーリング幅を狭める方法を試みました。(種明かしは一番下です) そのサインになぞらえて「NCトレーリング」という名前で以下に説明します。

ATRトレーリング(Factor=1.0)とNCトレーリング(Factor=1.0)をチャート上でみると以下のような感じです。
例えば★の地点でロングエントリーをしたとします。ATRトレーリングはATR(14)の距離だけ離れてトレーリングしていきます。なので赤い矢印の箇所で引っかかってしまいます。 一方NCトレーリングはATRに近い考え方で距離自体は決めますがATRトレーリングのようにやみくもに近づいては行きません。安全と判断した時にだけ近づいて行くようにしました。なのでここでは青の矢印までストップに引っかかることなく到達しました。この図ではNCトレーリングに軍配が上がりますがATRの方が結果的にたくさん利益が残せるパターンももちろん多々ありましたので実際どちらが良いのか判断がつきかねます。

そこで前回やったランダムエントリー&ATRトレーリングエグジット対ランダムエントリー&NCトレーリングエグジットを比較してどちらが良いのかを調べることにしました。結果は以下のような感じでNCトレーリングはやはり良いようです。(今まで同様に16通貨ペア2001年から2010年途中までの1時間足のデータで、スプリットは0.025%として計算しています)

上記の結果は面白いなと感じています。前回のATRトレーリングの検証もそうですが今回もエントリーはでたらめなタイミングででたらめな方向にエントリーしています。にもかかわらずエグジットだけで少しではありますがスプリット分の0.025%を稼ぎ出しているという点です。(ちなみに0.025%といえば例えばEURJPYの今現在の値で換算すると2.8 pipsということになります)

最後にNCの種明かしですが、NCはNaked Closeの略です。なのでNCトレーリングは最新終値が一つ前の高値を超えた(Naked Close)タイミングで近づくということをやっています。

---------------------------------

その後NCトレーリングの場合の距離計算(上記の「ATRに近い考え方で距離の計算」)をATRトレーリングとまったく同様のATR(14)で計算させたらどうなるのかなとふっと思ったのでやってみました。ちなみに上記のNCトレーリングではNaked Closeが起こった時のTRで距離の計算を行っています。

ほんの軽い気持ちで試したのですがこの距離の計算方法で結構結果が変わりました。

この結果とチャートをながめていて思うところはNCトレーリングでせっかく見極めたはずの近づくタイミングの効果が、近づかないでいることで取り損なうマイナス効果で相殺されてしまっているという事です。一気に大きくあるいはその反対に今まで以上に小さく値が動いた時の変化のスピードについていくためにはATRの期間は短い方が良いという事かもしれません。

2010年11月19日金曜日

ATRによるトレーリングを検証

私はトレーリングの考え方が性にあっているようで以前から興味がありました。

「トレーリングエグジットの考え方に優位性はあるのだろうか?」
というのが今回の検証目的です。

エントリーはランダムでエグジットをトレーリングストップで行うという事をやってみました。

以前にランダムエントリー&ランダムエグジットを試しに行ってみた時に確率はちょうど50/50でトレードあたりの平均利益も(スプリットを除いて)0になることを確認してありますので、今回はエントリーを同条件にしてエグジットをトレーリングで行い、以前のそれよりも少し良くなるだろうかという考えで検証を行います。エントリーは以前と同条件ということでBUYで入るかSELLで入るかもランダムで決定します。つまりランダムに決定されるある時点でSELLもしくはBUYでエントリーしてとにかくその方向にトレーリングをするといったやり方で検証を行いました。

トレーリングはATRをベースにした方法で検証しました。ここで言うATRトレーリングとは例えばロングをトレーリングする場合には:
現在の安値 - ATR(14)×Factor
をストップに設定するというものです。Factorはパラメータで例えば1とか2.5とか設定したい幅によって決定します。Factorを小さくすればするほどよりきつい(実値に近い)トレーリングとなります。例えばFactor=3.0で現在の安値が80.00でATR(14)が0.25の場合にはトレーリングストップを79.25に設定するといった具合です。

実は以前にATRトレーリングをいろいろなFactorでやってみたことがあり、その時の印象として今一つ実際の値動きをとらえていないという悪いイメージがあります。今後これよりも良いトレーリングを研究したいので今回はこのATRトレーリングを一番ダメなパターンとしてデータを取りたいと考えました。

今回も以前からと同様に2001年から2010年の途中までのデータ(1時間足16通貨ペア)を用いてスプリットを0.025%として行いました。その結果が以下の通りです。上が以前行ったランダムエントリ&ランダムエグジットの結果で下が今回行ったランダムエントリ&ATRトレーリングの結果です。ここで平均利益は1トレードあたりのパーセンテージベースの利益を示しています。(パーセンテージベースの価格についてはこちらの記事に少し書きました)ランダムエントリーランダムエグジットの平均利益が-0.025なのはスプリット分を除けばトントンであるということが表れているからと思われます。 エントリー条件を変えずにATRトレーリングを採用したことで平均利益が少しだけ良く(-0.025%から-0.009%へ、つまりスプリットを除いてトントンだったのが少しプラスに)なりました。それから標準偏差も小さくなってよりリスクが小さくなったとも言えます。平均利益がたったこれだけ良くなったことに何か意味があるのか?と思ってしまいますが以前にもまして現在ではこの小さい違いでも実は思ったよりも意味があるかもしれないと考えるようになりました。


今回のATRトレーリングではFactorを1.0から4.0までの範囲で0.2きざみ毎に変化させながら検証を行いました。上記数値はFactor1~4までの範囲の平均です。またランダムエントリーのタイミングも何種類かの異なる確率で行いました。なのでトータルで10万回以上のトレード数での結果なので小さな違いでも有意となりました。(U検定にて

今後はトレーリングでもっと良いものを目指したいと思っています。良いトレーリングというのは「こういう形になったらトレーリング幅を狭めて良い、こういう形の時は狭めずに待たなければいけない」という状況判断が的確にできるトレーリングということになると考えています。 ATRトレーリングはあくまでここ最近の値幅をベースに幅を決定し特に状況判断をせずに一定の距離を保つといった感じのトレーリングですが、良いトレーリングはおそらく何か別の状況判断でもってトレーリング幅を狭めて良い時とそうでない時を区別できるのだと思っています。今後研究していきます。




2010年11月2日火曜日

平均移動からの乖離率を正規化

(例えばRSI等の指標が0-100の範囲で正規化されているのに対し)モーメントや平均移動からの乖離率等の指標は正規化されていないので今一つ使い勝手が良くないと思っていました。しかしモーメントにしても乖離にしても今後システムの中で利用したいなと考えている指標なので何か良い正規化の方法はないかなと考えていました。

いろいろ考えたのですが私の結論としては過去のデータに頼るのがベストなのかなと。

過去のデータでこれらの指標の値を毎足(例えば1時間足であれば毎時)計算してその平均と標準偏差を求めておいて、それらの平均と標準偏差を使った正規化を行うというものです。

具体的には例えば単純平均移動(20)からの乖離率をデータがある分だけすべて計算させたくさん計算された乖離率の平均と標準偏差を求めます。この例で実際に過去10年分16通貨ペアすべての1時間足で計算を行うと平均はほぼゼロ、標準偏差は0.382681との結果がでました。

この数値を使って得られた乖離率の正規化を行おうと考えたのですが、ボリンジャーバンド入門(ボリンジャー氏著)という本に載っていた %b というボリンジャーバンドベースの指標と同じような考え方で±2.0×標準偏差をそれぞれ0と100に対応させるように計算させようと考えました。例えばRSI等のように0を下限、100を上限とするのであれば以下の式で得られた乖離率から0から100の範囲の数値が求められるはずです。(ボリン等と同様確率的に100を超える(ボリンでいうところの2σ超え)こともありますし0以下になることもありますが概ねこの範囲に収まることで良しとすることにしようと考えて計算させてみました)
得られた乖離率÷標準偏差×25+50

結果は以下のとおりで良好な感じです。0以下で結構-方向に乖離しているとわかり、100以上で結構+方向に乖離しているということがわかる(はず)です。

同時期のSMA(20)と終値は以下のとおりです。

もう少し調べてヒストグラムを見てみました。1時間足でSMA(20)からの乖離率を16通貨ペア10年分程のデータ調べたところ以下のような感じです。

分布は正規分布でないようでとても尖がっています。(尖度=18.4215) 正規分布を仮定できない場合の信頼区間はどうやって計算させればよいかいろいろ調べてやっとたどり着いたあるサイトに97.5%と2.5%のパーセンンタイルを求めてそれを使えば良いというようなことが書いてありました。

そこで2×標準偏差の場合とパーセンタイルベースの場合でどのくらい違う結果になるかを見てみました。パーセンタイルベースだと95%信頼区間は -0.78368~0.73508 という結果で標準偏差×2.0だと信頼区間は -0.76536~0.76536 なので自分の中では標準偏差×2.0を使って問題無しと結論づけました。

その後乖離率以外でもやってみようと思い、手始めに標準偏差(20)をやってみました。標準偏差は乖離率と違って分布が以下のように左右対称ではありません。(※標準偏差(20)の20は期間を表しています。今回は時間足なので過去20時間の平均からのばらつきを表しています)

左右対称でないためか乖離率の時のような標準偏差×2.0というやり方は通用しませんでした。今回の平均は 0.2223、標準偏差(標準偏差の標準偏差ということです)は 0.1864でした。そのまま標準偏差×2.0を計算すると下限が0より小さくなって明らかにおかしいことになっています。 なのでパーセンタイルベースで95%信頼区間と99%信頼区間を求めて見ました。95%信頼区間は0.04459~0.69156ということが分かりました。この値を上限下限にして正規化してみた標準偏差と同時期の価格変動(及び参考にボリンバンド)は以下のような感じでなかなか良い感じです。

ボリンで+2σもしくは-2σにタッチしている箇所が何か所かありますがそこでの真ん中の線から2σまでの距離÷2が即ち標準偏差ということなのですが、正規化(と言えるか分かりませんが...)されていた標準偏差を見たほうがこのバンドの幅の部分については良く分かりやすい感じです。