BTLMインジケータで計算できる他のモデル

テクニカル指標が「数学的に意味を持つ」こととマーケット予測能力は全く関係無い…という話を書いておきますかね..^^;
どんなテクニカル指標にも、その計算式の背後には、必ず何らかの値動きのモデルを想定しています。(モデルというよりも、値動きのどんな特徴を抽出したいのか?という目的があります..と言うべきかな。


仮に市場での資金の流れは、物理的な制約、取引限度額的な制約で一定速度でしか動けないとしましょう。その場合、それにつられて動く価格も極めて直線的な動きをすることが多いはず..と考えたとします。

↑そんな市場での価格予測は、線形近似を使うのがおそらく妥当でしょう。個々の価格には意味の無い動き=ノイズが含まれているので、それを取り除いて本来の直線の動きを抽出するわけです。


ところが、別の人は、そんなマクロの話は短期のデイトレには当てはまらない、投機市場では買いが買いを呼び、売りが売りを呼んで値動きは加速し、放物線を描くように動くのだ..と考える人もいます。

↑その前提では、2 次多項式の近似曲線を使うことになります。(ちなみに、この後の値動きは上昇してゆきました..が、ただの偶然でしょう


こうして、全く同じチャートに対して下がるという予測(上図)と上がるという予測(下図)が、(与えられたデータに対して数学的に意味のある形で)計算できてしまいました。マーケット予測の優劣は、どちらのモデルが市場の実態に合っているか?を統計的に調べることで判明しますが、それはテクニカル指標の計算式の性能の良し悪しとは別の問題になります。テクニカル指標は、単にある特定の仮定のもとで意味のある値を算出するだけで、仮定(仮説)が正しいかどうか?とは関係ないのです。




そう理解してもらった上で、今日の本題のBTLMインジケータで計算できる他のモデルですが、R の tgp パッケージがサポートしているモデルであれば少しの修正で簡単に計算できます。

RExecuteAsync(R, "model <- btlm(X=X,Z=hist...
↑この一行を
↓次のいずれかに書き換えると計算モデルが変わります。
RExecuteAsync(R, "model <- bcart(X=X,Z=hist...
RExecuteAsync(R, "model <- btgp(X=X,Z=hist...
RExecuteAsync(R, "model <- bgp(X=X,Z=hist...
他にも blm,btgpllm,bgpllm があります。

以下は実際に変更して計算した例です。



↑bcart は、価格水準が非連続に変わるようなモデルで、階段状に近似されます。

↑btlm は、価格が折れ線状に動くモデルです。私は今でもこのモデルが一番裁量では使いやすいのではと思ってます。仮に価格が曲線状に動いたとしても、複数の直線になるだけのことです。それから、人間のパターン認識は直線と相性がよいのかもしれない..とも思ったりします。


↑btgp(もしくは bgp) は、価格がうねうねと動くとするモデルです。正しくは、ガウス過程(Gaussian processes)に従っていると言うべきですが、興味のある人は自力で調べてください^^;直近の値幅予測には bgp が良いのかな?と思ったりしますが特に検証はしていません。


BTLMインジケータの愛用者が少なからずいらっしゃるようなので、改造するとこんなカタチもできるよ〜と少し紹介してみました。
(..べ、べつに コミPo! を試してみたかった..わけじゃないんだからねっ

BTLMのTimeScale変更対応。

BTLM の擬似MTF対応版として、計算点のサンプリング間隔を調整できるようにしました。TimeScale = 3 を指定すると、3本毎の値で計算されるので、3倍の時間足に相当する BTLM を表示できます。Offset = 10 を指定すると、10本前の Bar を起点に計算するので、過去の BTLM を見ることも出来ます。

↑赤い点が BTLM の計算に使われています。(赤い点は!!TS-SamplingPoint.mq4 で表示できます。)


BTLM は、人間の感覚に近いカタチでトレンドを認識すると書きましたが、実際はかなり自由度を制限された範囲内でトレンドを視覚化します。人間のパターン認識は、スケールフリーというか、大きさに対する自由度が高く、小さなトレンドから大きなトレンドまで自在に認識してしまいます。その為、大きな上昇トレンドに乗って買いポジションをとっても、小さな下落トレンドで利食いしてしまったり、逆に大きな下落があっても、さらに大きな上昇トレンドでの一時的な戻りと勘違いして、ナンピンして損切りの判断が遅れます。いわゆる、ポジション保有によるバイアスの影響を受けてしまうわけです。


BTLM を使えば、常に一定のスケールで観察できるので、一部の裁量トレーダーさんに愛用されているのかな..なんて思ってます。

非同期で実行したRの計算終了を音で知る。

MT4の背後で非同期に R を呼び出すインジケータの場合、計算が終了した際に音が鳴ると便利です。
休日でも、Metatrader Tick Senderを起動しておけば画面更新されるので、R から直接 音を鳴らす必要性は低いのですが、リアルタイムに分かると気分的に嬉しいものです..^^;


R から音を鳴らすコードのうち、alarm() や、cat("\a") はダメで、以下の tkbell() が使えます。

library(tcltk); tkbell();

↑ tcltk パッケージを事前にRGuiからインストールする必要があります。

RExecuteAsync(R, "model <- btlm(X=X,Z=hist,verb=0,BTE = c(2000, 55000, 2),R=3) ; library(tcltk); tkbell()");

↑非同期実行のコードの最後に追記します。


ちなみに、以下のコードを追記すれば、直接 wav ファイルを開くことも可能です。

shell.exec(\"C:/File Path to WAV/Qbey'sTheme.wav\")

aws.gaussianで、ラインが一定量移動した時にアラートを鳴らす。

ミッシェルポルナレフ 2011/09/19 05:14
fai様 すばらしいインジをありがとうございます、

お気に入りは怪談の方の!!R-aws.gaussian-Indです。
5分チャートで順張りに使えないかとテストしたところ
まるでカタパルトのように押し目、戻りにピタッと君でした。

じ〜 2011/09/19 18:03
faiさま 

!!R-aws.gaussian-Indを見つめていて思ったんですが、アラートを付けては頂けないでしょうか?
ラインが移動した時に鳴ると、うれしいです。

よろしくおねがいします。

aws.gaussian は、常にレベルが微動しているので、移動した時にアラートを鳴らすのは無理ですが、前回のアラート時から AlertPips 分だけ動いた時にアラートを出すようにしたものを、ここに用意しました。(ついでに、15秒に1回計算する等工夫して負荷を減らしています。)


aws.gaussian は、水平ラインが、過去のある程度離れた時刻のラインと同じ高さになるように引かれてゆくので、押し目や利益確定の目安に役立つのでは?と思って作っています。

BTLMプチフリーズバグ対策。。orz

BTLMを非同期で計算しているのに、MT4が固まるのはおかしいなと思って調べたら実装間違いがありました。修正版をここに置きました。

RExecuteAsync()を呼んだら、RIsBusy(R)のチェックが終わらない限り、他のRの処理(RGetBool)をしてはいけなかったのでした..orz
なので、実行順序を入替えています。


今日は1日 BTLM の動きを、普通の線形回帰指標と比較して見ていましたが、単純な線形回帰指標では算出できない正確さで直近のトレンドとボラティリティ(値幅)を描画してました。BTLM 自体はただの解析ツールにすぎないので、トレンドが十分に長く継続しやすい通貨ペアや時間足を選べば、トータルで勝ち越すことも現実的かな...なんて思ったりします。

BTLM の活用方法を思いついた人や実際役立った人からのコメント歓迎です。

そろそろ大多数の人が導入に成功したと思うので、マニアックな話を少々..。

公開時に、「まったく同じ価格データで計算しても異なる結果を返す」のは、内部で MCMCマルコフ連鎖モンテカルロ法) という乱数を利用したシミュレーションを行っているからだと説明しました。当然ながら、その乱数シミュレーションの回数を増やせば、毎回得られる結果が同一になりやすくなります。
その調整方法は、

BTE = c(2000, 15000, 2),R=1

↑これを書き換えます。
上の表記では、「15000回計算し、最初の2000回分を破棄し、得られた結果のうちの2つに1つを採用する」というプロセスを1回(R=1)行う。
という定義になります。

BTE=c(2000,55000,2),R=3

↑このくらい増やすと計算時間はかなり掛かりますが、入力データに対してほぼ同じ結果が得られやすくなります。PCスペック次第では、R=1,2,3の順に試した方が無難でしょう..。論文では、10万回計算して、最初の5000回を破棄..なんて例もありますが、どれくらいが適切なのかよく分からないので、特に気にならなければデフォルトのままでも構わないと思います。

BTLM に手を加える。(Win7 64bitでの不具合対応他)

BTLM の活用方法を思いついた人や実際役立った人からのコメント歓迎です。

コメント欄にあったように、Win7 64bit 環境でBTLMが動かなかった問題に対応したものをここに置きました。

↑作業フォルダを指定する部分を絶対パスで指定するようにしたのと、
↓時間足や通貨ペアの切り替えでラインが消えてしまう場合に対処しています。


このインジケータは、普通のインジケータと違い、MT4のバックエンドで RTerm.exeが非同期で計算するので、休日にチャートにドロップしても、右クリックで更新を何度か行わないと表示されません。不便だと思う人は、http://www.fx1.net/mt4tick.php のMetatrader Tick Sender を起動すると良いでしょう。


既に、このインジケータをEAに組み込んでバックテストされている人もいるようですが、BTLM の計算が非同期に行われている点に注意してください。

↑一般のインジケータでは、Tickが来るたびに、結果が計算されますが、

↑BTLM では、あるTickから計算が開始されて、実際に結果が出るまでにいくつもTickが更新される可能性があるということです。


計算処理が遅すぎるので 非同期的に計算しているのですが、以下のように修正すれば常に1Tick遅れで計算できるようになります。

RExecuteAsync(R, "model <-...
↓
RExecute(R, "model <-...

※本格的にバックテストするためには、おそらく事前計算が不可欠でしょう。
テスト前に検証期間の BTML の値(平均値、バンド両端値、傾き、トレンド起点からの経過時間)を計算してデータを保存しておきます。
テスト中は、そのデータを読み取るようにするのが良いとおもいます。(昔やってたけど、コードごと捨てちゃった...^^;



トレンド起点からの経過時間は、正確な値は分からないのですが、区間分割された最後の部分の長さは求められます。

↓こんなコードを書くと…

↓分割された時刻に赤ラインを引けます。


↓以下のようなコードを参考にすれば、Rのグラフやツリー図をMT4から表示させたり、データとして保存できます。

最新版の中にコメントアウトした形で書いてありますので、必要であれば参考にしてください。

R for MT4の厄介なところ…

羅針盤 2011/09/15 23:08
難しい理屈は分かりませんが、今日1日、このチャートをMT4に表示させて見続けました。
私は滅茶苦茶面白いというか有用なチャートだと思います。
とにかく儲かりゃ良いってスタンスですから、理屈は分かりませんが、
使い方次第で極めて有用なチャートだと思います。
1日使っただけですが、私はもう手放したくありません。

で、1日使い続けた結果、次のような現象が発生しました。私の使い方が悪いのでしょうか?
・ベルのマークがついた警告ウィンドウ(EURUSDの15分足を表示していたとすると、
 『警告 EURUSD15 R error』と表示されます。)が結構頻繁に出現し、
 最初はOKを押してそのウィンドウを閉じれば、その後もきちんと稼働してくれるのですが、
 その内、砂時計状態でMT4自体の反応が無くなってしまいます。タスクマネージャーの
 プロセスで、イメージ名 Rterm.exe ってやつをあるだけ強制終了したら、再度稼働を
 始めるようです。ちなみに4つの通貨ペアを表示させています。
・これに関連するかどうかわかりませんが、直近が計算出来ていない(ラインが表示されない)
 ケースが時々あります。
・ティック足をプロットしているチャートに、これを表示させようとすると、
 結構即座に先のエラーが発生します。

というような状態が発生しています。
何か使用方法(設定等)で注意すべき点があるとか、そういったものがあるのであれば
教えて頂ければ幸いです。いずれにしても、有用なチャート、有用なノウハウの提供を
続けて頂いている事に感謝と敬意を表します。


早速の感想ありがとうございます。このツールの価値を分かってもらえて良かった..。
↓R error が出るのは、残念ながら今のところ仕様です。

どうも、RTerm.exeが異常終了しているらしいのですが、まだ、原因はつかみきれていません。運用ノウハウとしては、
・1つのPCでインジケータを1つだけ動かすとエラーが起きないかもしれない。
ソースコードの中から、以下の行を削除すると警告ダイアログだけは出なくなる。

Alert(Symbol()+Period()+" R error");

・以下の行を書いたバッチファイル(KillRTerm.bat)を用意して実行すると、楽に RTerm.exe を止められる。pauseは無くてもよい。

taskkill /IM RTerm.exe /F
pause


↑MT4自体が異常終了すると、計算用に動いていた RTerm.exe プロセスが残ってしまうので、
↓KillRTerm.bat を実行して一括終了させています。


他にも

↑こんなエラーが出ることもあります。


DebugView(http://technet.microsoft.com/ja-jp/sysinternals/bb896647)を起動しておくと、R for MT4からのメッセージが確認できます。
インジケータの RDebugLevel を 2 にすると計算時の出力も表示されます。

↑問題が起きる時はこんな感じなのですが、対策方法が見つかっていません。


排他制御が必要なのか、連携方法を変えるべきなのか..調べてくれる人がいると助かります^^;;;