ループしてみる

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

ポイントの分布おかしい

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

ポイントの生成

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

シミュレーション(仮)

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

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

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

指標を計算させる(ボリンジャーバンド、サイコロジカル)

昨日は仕事で帰ったらとてもPCをさわれる時間で無かったので作業はできず。
今日は普通に帰れたので、作業をする。
今回は、ボリンジャーバンドとサイコロジカルである。
この指標で、当初の予定の指標はおわる。
ボリンジャーバンドは、期間の標準偏差の一定倍率を移動平均に加減することでバンドを作るが、
実際の判断は、倍率を1から3倍に変化させつつ処理させたいので、
データベースに格納する計算は、一定期間(今回は13日と25日)の標準偏差のみとした。
標準偏差も、特に難しい計算もなく、すんなりできた。
検証も、ExcelだとSTDEV関数で一発なので、検証も楽ちん。
サイコロジカルも、前日から上昇した日数のカウントだけなので、
すんなり処理できる。
一応、検証・・・
問題なし!
そんなわけで、指標については、そろったことになる。
これからは、この指標をデータベースにupdateする処理を追加して、
週末には実際に計算をさせて、シミュレーションに備えたい。
ついでに、計算期間が足らない時の処理を追加した。
とりあえず、3年くらいの計算は全銘柄でさせるつもり。
一回っきりの処理なので、時間がかかりそうなら、DOSVなパワーを借りようかな。

指標を計算させる(RSI,VR)

昨日に引き続き指標を求めるプログラムを組む。
今日は、RSIとボリュームレシオである。
RSI は、9,14日
ボリュームレシオは、14,25日
をパラメータとする。
移動平均のサブルーチンを、ちょいちょいと直せば、楽ちんである。
処理自体は単純ですからね。
ただ、大変なのが、処理が合っているか検証すること。
目デバッグで問題ないので、検証なしでも良いかと思ったけど、
自分の資金が関わるので、面倒がらずにやることにしたが・・・
AppleWorksでは、移動平均や乖離率の検証は簡単にできるが、
RSIやボリュームレシオになると、とたんにやりにくくなる。
csvのインポートもままならない。
結局、Excelを借りてきて、検証する。(同時にインストールしなかったらいいらしい)
条件付き合計( {}でくくる式 )を使えるので、便利。
時間ができたら、OpenOfficeでもいれるか・・・。
結果は、プログラムの倍以上の時間をかけて、検証OKでした。
(検証結果がおかしく、見直したらExcelの方がおかしかった(^^;)
結構なペースで開発が進んでいる。
このまま行くと、週末には売り買いシグナルを出せるかもしれない。
とりあえず、自分で検証していくつもり。
なんせ、このBlogみている人いるかわからないし・・・(^^;
まーー、実績がでれば、見てくれるでしょうから、それまでは日記がてらつけときましょう。

指標を計算させる

先日、とりあえず、配列にハッシュを配置して、
メモリ上で、銘柄コード、日付、4値、出来高などを展開できた。
今日は、その配列を利用して、各種指標の計算をさせてみる。
テーブルに、計算結果を格納するカラムはもうけてあるが、
とりあえず、テキストにはいて、テストをしたいので、
コンソールに計算結果を出力するところまでつくってみる。
まずは、移動平均(WMA)、最近、年齢のせいかロジックがすぐに出てこない。
そのかわり、本能のおもむくままにコーディングすると、動いてくれることがある。
今回は、あたりみたいで、あっさりうごいた。
ついでに、乖離率、これも移動平均ができれば、終値との差の割合を出すだけなので、
簡単だ。
AppleWorks6の表計算で検算してみる。
( Windowsな方でいう、Excelです。
  Excelは会社では使ってますが、家では高価ので買えないです。
  Macは標準でついてますからね。)
計算は、あってるようだ。
ここで時間を計ってみる。
データベースからの読み出し、計算、コンソールへの出力まで、
一銘柄で、300日分、6指標の計算(WMA、乖離、それぞれ3期間)で、
1秒弱
ちょいと、厳しいですね・・・全指標の計算させると、5秒くらいかかるかも。
3000銘柄だと、4時間ちょっとかかります。
一度計算させれば、あとは、一日分ずつですからいいですが・・。
この調子では、シミュレーションは相当な時間を食いそうです。
実際の取引に使う段になって、影響が出そうであれば、データベースだけは、
我が家のファイルサーバ君に手伝ってもらってもいいですけどね。

配列にハッシュを入れる

先ほど、Perlでプログラムをしていて、すこし奇妙な組み方をした。
それは、Perlの配列の中に、ハッシュを作って作業をすることにしたのだが、
配列は、メインルーチンで宣言し、それに格納するハッシュをサブルーチンで宣言して、
そのポインタを配列にいれてみた。
適当に100日分くらいのデータを入れてループで回してみたけど、
例外は発生せず、しかも、消費メモリも増えない・・。
なんか違うような気もするが、とりあえず、動いているのでそのままでいく。
Perlも我流で、本も一冊も持っていないので、振る舞いがよくわからないのだが・・。
だれか知っている人教えてください(^^;

指標のデータベース化2

実際に、指標のデータベース化について、プログラムしていく。
ただ、その前に、どの指標でそのようなパラメータを使うか検討する。
先日書いた指標から、計算しやすそうで、かつ、効果のありそうなものを抽出する。

指標 パラメータ
加重移動平均(WMA) 6日 13日 25日
移動平均乖離率
RSI 9日 14日
VR 14日 25日
ボリンジャーバンド 13日 25日
サイコロジカル 12日

とりあえず、これくらいをデータベースに入れる。
これはあくまで指標なので、実際のシミュレートなどは、別のシステムで行う。
また、指標の分析だけだとおもしろくないので、いろいろと他のタイミングを考えたい。
早速、Perlで記述する。
指標の作成は指標作成テーブルから取得(基本的に全銘柄)、計算期間はパラメータで与えることにする。
これは、最終的にJavaからコマンドを呼び出すつもりなので、これでいいでしょう。
Start
|
要処理銘柄コード取得
|
Loop(銘柄) — 日足データ取得 — 計算 — データベースPut
|
End
と、回す。
とりあえず、日足データの取得まで作成。