ループしてみる

先日のポイント計算がおかしくなってから、
2,3日、ロジックを眺めて、いろいろと考えていた。
ポイントの計算誤りについては、もとの指標の計算が違っていたり、
ポイントの計算でロジックに誤りがあることがわかったが、
他にもおかしいところがないか、目デバックを繰り返していた。
一応、納得のいく精度までロジックが完成したので、
今日は、ループしてシミュレーションのたたきをつくってみた。
前にも書いたが、
指標の組み合わせが108通り。
比重の組み合わせが243通り。
計算日数を700日。
とした場合のループ総数は、18,370,800回であり、
相当の時間がかかることが見込まれた・・・。
実際にまわしてみてびっくり、うちのmini君は、これだけのループを、
211秒で処理してくれた。
(後ろでSafariでHPみたり、メールチェックをしたりしつつ(^^;)
予想以上に高速なのにおどろいた。
これなら28年もかからずに、すべての銘柄をシミュレーションすることができる。(^^;
今週末は実際に、300銘柄ほどを抽出して、銘柄ごとに最適なパラメータを抽出する作業をしたい。

ポイントの分布おかしい

先日の方針に基づいて、ポイントの分布をシミュレーションしてみる。
今回のポイントの分布調査は
・ 指標は適正に計算されているが、ポイントは適正に計算されているか。
・ 各指標ごとのポイントのバランスはおかしくないか。
・ 今後の売り買いの総合ポイントが適正にだせるか。
などを、検証するために行った。
全銘柄を計算しても、検証するのが大変なので、
とりあえず、代表的な銘柄を一銘柄計算してみる・・・。
なんと、ボリンジャーバンドの指標が、他の指標に比べて、
えらく数値の分布に偏りがあることが判明。
ポイント付けのロジックがおかしいのか・・。
最近、仕事で疲れがたまるので、今日は問題がでただけであるが、
寝ることにする(^^;

組み合わせについて考察

最近、プログラム以前の問題として、シミュレーションの手法について、
考えていることが多い。
実際の運用を開始してしまえば、パラメータを作って、上位ポイントについて売り買いを
していけば良いのだが、それまでのシミュレーションの段では、相当な時間がかかってしまう。
今回は5指標の組み合わせを考えているが、それぞれに2~3の候補があって、
それらを組み合わせると。
3 × 3 × 3 × 2 × 2 = 162通り
この中で、採用ランクを3段区分けすると、
3^5 = 243通り
これらを掛け合わせると・・・
39,366通り
これを700日計算すると・・
27,556,200
これを3000銘柄すると・・・
82,668,600,000
と、いうことです(^^;
やっぱり、だいぶかかりそう・・(^^;
ちょっと、ロジックを考えなおします。
指標からポイントを出すところまでは、できているので、
もうすこし、がんばります。

ポイントの生成

先日考案した、ポイントによる、売買シグナル(ポイントなんで厳密にはシグナルではない)についてであるが、
以下の、5指標でポイントを算出することにした。
・乖離率
  3パターン
・RSI
  3パターン
・ボリュームレシオ
  3パターン
・ボリンジャーバンド
  2パターン
・サイコロジカル
  2パターン
各指標のパラメータは、スイング取引の中でも短期売買を考えているので、
すべて期間はより短期のものを採用することにした。
ここで、13種類のポイントがでるので、この中から、3~4種類のポイントを加重平均する。
加重の割合も考えないといけない。
早速、プログラミング・・・
結構、頭がPerlになっているので、さらっと作成できる。
テストで、全13種類のポイントを、1銘柄計算させてみると・・1秒以下(^^v
Excelに流し込んで、グラフ化してみる。
単純に平均して、株価との連動をみてみると・・。
確率50%くらいのパフォーマンス。
とてもこのままでは使えない。
予想どおり、ポイントが出やすい指標と出にくい指標があり、
出やすい指標に引っ張られてしまっている。
やはり、加重平均でシミュレーションを繰り返して、最適解をみつけるように
しないといけない。
ただ、おもったより計算が早いので、複雑なシミュレーションもできるかもしれない。
究極パラメータを自動生成できるか・・。

各指標へのポイント付け

売りシグナル、買いシグナルについて、考える。
いろいろと情報をみてみると、指標がある一定の条件になると、
買いや売りのフラグをたてて、そのフラグの数などの条件で、
シグナルを出すのが多いようだ。
それだと、白黒ははっきりするが、私の目的とする、資本の高回転は、
シグナル次第になってしまう。
そこで、各指標に条件をつけて、その条件の範囲で、ポイントを算出するようにする。
買ってながら、買いは100点、売りは△100点として、数値する。
その順位高いものから順に、売り買いの指示をだし、手持ち資金分まで出資することにする。
今回は、その条件についても、システムで自動的にシミュレーションを行いつつ、
今の相場に最適なパラメータを作り出すこととしたい。
このパラメータの見直しは、毎週末に自動起動して、週明けの相場からは
新パラメータで売買をするようにする。
さすれば、毎日の損益(なんで損がさきかなぁ・・・縁起わるいなぁ)を、
確認するだけでよくなる。
と、いう夢物語を描いている。
今日は、各指標の条件の範囲について、検討をしている。
ここも自動化したかったが、そこまですると、例の28年間の時間がかかるので、
この、各指標の条件範囲については、手作業として、この2日くらいでつくりたいと思う。

シミュレーションの効率化

昨日の仮シミュレーションのプログラムを改良して、
汎用的なサブルーチンを作る。
タイトルは偉そうであるが、今日はほとんどコーディングはできていない。
たとえば乖離率での買いシグナルについての計算は、
-20%、-15%、-10%を基準とした場合、それぞれの計算をするサブルーチンを
つくるよりは、当然、その数値を引数とした、サブルーチンをつくる。
もっと、いえば、乖離率の計算だけのサブルーチンよりも、
もっと汎用的にして、他の指数でも使えるようにしたい。
いわゆるサブクラス化であるが、あまり、クラスを抽象化して汎用すぎるものは、
処理のオーバーヘッドが増えて、処理速度の低下につながる。
業務で作る場合は、判読性が優先されるであろうが、なんせminiである。
速度も重視しないと、あとでえらいことになる。
そんなことを考えていると、なかなか、作業がすすまなくなってしまった。
今日は、少し頭を冷やして、明日に備えることにする。

シミュレーション(仮)

とりあえず、プログラムのひな形を作ってみる。
言語は例のごとくPerl(^^;
Javaで組んでも全然問題ないんですけど、データベース操作などを、
Perlで組んでしまったので、ソースをほとんどきりはりでできてしまうので、
しばらくは、このパターンで行きたいと思う。
実際に作ってみると、30分くらいでできてしまった。
とりあえず、乖離率で一銘柄700日分で計算をしてみる。
なんとなく、判定をしてくれてそう。
ただ、テストした銘柄が悪いのか、売りシグナルが700日で、3回しか出ない。
「買いシグナル」はどこ行ったーーー。
今日は、ほどよく疲れたので、続きはまたにする。

シミュレーションの方法

先日、各指標の計算が終わり、いよいよ究極の方程式(?)を作るべく、
シミュレーションを行うこととしたが、プログラムを作る前に、
スイング用だけでも、
・ 6種類の指標(WMA、RSI、VR・・・)の組み合わせ
・ 各指標に複数のパラメータ(RSIなら、9日?14日?それとも両方使う?)
・ 各指標の判断パラメータ(RSIの9日の買いは20?25?30?など)
・ 銘柄はどれを選択すべきか(全銘柄、代表銘柄、指数?)
などで、悩み続けている。
先日書いた28年かかるというのは、すべての条件を総当たりで処理した場合の時間で、
非現実的なものであるので、ある程度条件を絞り込むなり、数学的に最適値を絞り込むか、
考えている。
HPで調べれば、いろいろとヒントはあるのであろうが、
ここの部分は、あまり、他の人を参考にせずに、自分のカラーを出したいと思っている。
ただ、私の場合、手を動かしながら考えないと、進まないので、
とりあえず、適当にシミュレーションできるものを仮ででも作り始めたいと思う。

指標処理完了

昨夜から処理している、指標の計算が無事に終了した。
と、言っても、朝起きたら勝手に終わってただけですが・・
計算に要した時間は1時間25分で、だいたい計算どおりの時間で終了していたことになる。
今後は、新しく取得した日足データと、新規に追加した銘柄の計算だけなので、
数分でおわることと思う。
ただ、今回の計算の過程で、
アクティビティモニタ(CPU負荷やHDDアクセスのモニタ、Windowsのタスクマネージャ)
を、見ていて思ったのが、データベース(MySQL)の負荷が予想以上に高いということ。
これからシミュレーションの作業や、日足、日中足データの取得、株式売買の発注などをすることになるが、
mini君が負荷に耐えれるのか・・・、心配になってくる。
うちのMacminiは、
ハードウェアの概要:
コンピュータ名: Mac mini
コンピュータの機種: PowerMac10,1
CPU タイプ: PowerPC G4 (1.2)
CPU 数: 1
CPU 速度: 1.25 GHz
二次キャッシュ(CPU 単位): 512 KB
メモリ: 1 GB
バス速度: 167 MHz
ブート ROM のバージョン: 4.8.9f1
 内蔵HDDは、Seagate (ST940110A) 40.00GB/5,400 rpm (UltraATA)という、
2.5inchのHDDです。
データベースを酷使するわりに、2.5inchの5,400回転はちょいと可哀想かな・・。
一番初期のMacminiなんで、今のIntelなminiだと、
全然、問題ないかもしれません。
でも、このminiでどこまでできるのか、試すのも楽しいですね。

指標のデータベースへの格納

いよいよ、指標計算の仕上げである「データベースへの指標の格納」だ。
単発での計算は先日までで完了しているので、
これを、ループで全銘柄の処理をするようにして、
今はコンソールに出力している計算結果を、
データベースに格納(戻す)する。
この作業が終われば、各指標をつかって、シミュレーションなどができるようになり、
その結果から、売り買いシグナルをだせるようになる。
ただ、昨日の書き込みで書いたように、私の構想を実現しようとすると、
うちのminiでは28年かかるので、助っ人PCを頼みつつ、処理方法を考えたい。
ループについては、保有するテーブルから、銘柄コードを読み込んで、
foreachでループさせるだけで、そんなにたいしたことではない。
問題はデータベースへの格納。
REPLASEを使うか、UPDATEを使うか・・。
UPDATEの方が早そうなので、UPDATEの方を採用する。
っと・・・。
動かん・・・また、はまったか・・・。
Perlプログラム以前に、SQLでつまづいているようだ。
SQLの本も一冊もないので、これまた感覚でさわりまくる(^^;
結局、whereでdateの判断で、’の入れ忘れだった・・(;;)
div0のエラーなどで、いくらか不具合は見つかったが、
とりあえず、本日中に計算スタート!
2005/1から指標の計算をしているが、1銘柄1秒強で計算してくれている。
この調子だと1時間半もあれば、計算できそう。
(計算の待ち時間でこれを書いている)
明日からは、シミュレーションをしよう。