指標のデータベース化

先日、指標をデータベース化するという話をしましたが、
その実現をするためのプログラムでは、いくつかの選択肢があります。
今の環境では、
・ MySQL単独で計算させる。
   MySQLはバージョン5から、ストアドプロシジャという機能が追加されて、
  こいつをつかうと、MySQL自身で繰り返し演算などを行うことができる。
  たぶん、一番、処理は速いが、演算機能自身は貧弱。
・ Javaで計算させる。
   メンテ、速度ともに、一番妥当か。
・ Perlで計算させる。
  メンテは楽、速度は??
と、考えられるのですが、
後々の拡張を考えると、お得意のPerlで処理をさせる方が、
メンテナンスしやすいので、これで処理をすることにする。
自動取得などはほとんどPerlですからね。
できれば、近いうちに、データベースの設計をして、実際の指標を落とし込んでいきたいと
思います。

指標の計算

先日、指標(指数)を調べてみたが、処理能力を考えると、
毎回、必要な指標を計算するのは、だいぶ無理があることがわかった。
指標の中には、ボリジャーボンドのように、標準偏差を利用するものなどあるし、
パラメータの期間によっては、相当な時間がかかってしまう。
そこで、株価情報を収集したあとで、その日における、各指標をデータベース化し、
後で、その指標を使って、分析することにする。
そうすれば、銘柄が増えても、計算は当日分だけでよくなるので、
株価情報を取得してから、1時間もあれば、うちのマックでも計算できるだろう。
(銘柄一つの計算を1秒で終えられれば、丁度一時間でおわる。5秒なら5時間(^^;)
まずは、今後、その処理をさせることにする。

トレードの手法のお勉強

今さらなんですが、トレードをする際に必要な指数などについて、
HPで調べものをします。
これも本屋にはいろいろとかかれているようですが、
本をかってしまうと、それに縛られてしまい、自分でつくるメリットがなくなります。
そんなわけで、またしてもネットでみんながどんな指数を使っているのか、
調べてみました。
みなさん、いろんな指数に独自のパラメータを組み合わせて、買い時や売り時を判断しているようです。
ただ、つかっている指数(指標)は、大きくはかわりません。
概ね以下のようなものが多いです。
・移動平均 (単純移動平均(SMA)や加重(WMA)など種類がある)
・RSI オシレータ指数
・DMI
・VR ボリュームレシオ
・ボリジャーバンド
・株価変動率
・サイコロジカル
などが、どこででもお見かけします。
概ね、この中から適当なものを選んで、そこに与えるパラメータ(期間など)や、
判断するタイミングを変えて利用されているようです。
先人の知恵ですので、とりあえず、参考にしつつ、自分で考えた手法を組み合わせて
判断していきたいと思います。
とりあえずは、保有する全銘柄から選ぶことにしようと思います。

JDBCのお勉強

JavaでのDBアクセスは、JDBCがお約束であり、今回もそれを利用する。
以前から、データ取得などでは、PerlからDBIをつかっていたので、
たぶん、おなじような感じでしょう。
早速、MySQLのHPにおじゃまして、JDBC3.1をいただく。
プロジェクトにjarを追加して、適当なHPで操作手順を参考にさせていただく。
うごかん・・・
プロジェクトの見直しなどするが、なかなか原因がわからない。
結局、MySQL本家のHPのドキュメントを読む(始めからそうしとけばいいんですが)。
あっけなく、解決。
Class.forNameで記述する文言が違いました(;;)
com.mysql.jdbc.Driver
です。
一度、接続してしまうと、あとは、PerlのDBIより、簡単に取得ができました。
これで、Javaで分析ができます。
先日からいろいろと考えているのですが、このシステムは自分で勝手に使うシステムなので、
別にGUIにこだわらなくてもいいような気がしてきました。
GUIに時間かけるくらいなら、CUIでシミュレーションの精度をあげて、自動売買を進めて
いくほうが先決ですから。
そんなわけで、GUIは後回しで、画面には、ボタンと状況を表示するコンソール画面で、
当面は作業をしようと思います。

株日足データ再取得

先日取得した日足データが、微妙に取れていない部分があることが判明。
原因を追及したところ、想像通り、私のプログラムミス(^^;
ざざっと修正して、再度取得をする。
取得時間は2003年から現在までの取得、結局1日半かかって、
取得した。
2565764レコード
これから、分析する部分をつくりたいと思う。

JavaでのGUIをもう少し調べる

今ひとつJavaの書き方がわからない。
なんの予備知識もなく、いきなりソースをいじっているので仕方ないが・・(–;
やはり、本の一冊くらいは買わないといけないかな。
とりあえず、会社の帰りにこの本をかってみる。
部屋が狭いので、あまり本は買いたくないが、
リファレンスの一冊くらいはあってもよかろう。
でも、昔のリファレンスに比べて、説明が親切で非常にわかりやすい。
昔から、いろんな言語をさわっているので、普通の入門書はあまりにまどろっこしくて、
使えないので、ちょうど良い感じである。
(たぶん、Javaの本は将来この本だけだろう(^^;)
さて、JavaのGUIであるが、MacOSXでも、JiglooなるものがMacででも使えることが
わかった。
早速、つかってみると、結構、おもしろい。
リソースみたいな考えでなく、画面上でオブジェクトをさわると、
リアルにソースが変更されていく。
(動かすたびにCPUがふりきれるが・・)
非常におもしろいが、開発の快適さが失われるので、やはり、SWTをべたべたと書いていくことにする。
まず、つくるべきは、銘柄をいれると、四値や出来高をリストで表示して、
ローソク足を表示する程度のものを作成する。
データベースの扱いは、JDBCなるものがあり、MySQLの場合はこれを利用すれば、
簡単にアクセスできるようである。
とりあえず、ボタンなどの配置をしてみたのが、こんな感じである。
Swttest
とりあえず、ラベル、エディット、リスト、描画領域を作った。
比較的簡単に配置できたのに驚く。
とりあえず、これをたたきに、最低限の機能を実装したい。

GUI部分の実装

分析のための情報収集は概ね目処がたったことから、
次は、実際に運用をする部分の制作に入る。
当初、様々な指数などはExcelなどでシミュレーションを繰り返して、
有用なもののみをプログラムに組み込み、採用しようと思ったが、
Mac用のExcelがなく、(Excelは存在するが、私は持っていない)
ここまでMacで作ってきたので、データの分析をWindowsでするのも
気が悪いので、Mac上で分析をできるようにしたい。
とりあえず、情報の分析や、各指数などの閲覧用のプログラムを作る。
PerlでCUIなツールを作るのが楽であるが、ここは今後の事もあるので、
GUIで作業できるようにする。
ここは、今までさわらずにいたJavaをさわるのが、一番汎用性がありそうだ。
JavaでのGUIを調べてみると、Swingなどとかかれた本が多数みつかった。
JavaのGUIの定番らしい。
ただ、SWTというものがあって、これは、Javaチックな外観でなく、
Macチックな外観をつくれるようである。
今回はJava初めてで、どうせ苦労するのはわかっているので、
ここは情報の少ないが、見た目のよさげな、SWTを利用することにしたい。
SWTを深く探っていくと、どうも、OSによってネイティブなライブラリを利用する、
そこが、Macらしい外観の根拠でもあるらしい。
とりあえず、Eclipseも適当につかっていて、ライブラリのして方法も今ひとつわからない。
しかたないので、ソースのある場所に、指定のライブラリを置いておくとちゃんと動くようだ。
(後にプロジェクトのプロパティで場所指定できることがわかる)
SWTを使うときに、JFaceというのを使うと、SWTをカプセル化できるようであるので、
こちらも使うことにする。
もう一つ、RCPというが、このJFaceを抽象してくれるようであるが、
私はあまり抽象化は好きではなく、そのまま素で使うことにする。
(抽象化すると、中で動いているSWTの正体がわからないままになりそう)
WindowsやLinuxでは、VisualEditorなるもので、GUIでボタンなどの配置ができるようであるが、
あいにく、Macのみでやりたいので、プログラムに直接コードで作ることにする。

ザラ場取得成功!

今日も、同じ要領で、ザラ場処理をさせる。
今日の稼働時間は、7時から22時でした(^^;
結果は、予想どおり、無事取得!!
今日は、銘柄を25銘柄に増やして作業をしたが、
無事、処理されたようである。
それでも1銘柄1秒程度かかっており、取得だけでも30秒近くの時間がかかっている。
やはり、気配値の取得をするものと、現在値と出来高くらいの取得のものと色分けして、
銘柄数としては100程度は取得できるようにしたい。
これは、実際に稼働しつつ、挑戦していきたい。
とりあえず、シミュレーションをできる環境をつくり、
実際の運用を開始したいと思う。

日中足データの取得・ザラバでテスト

先日のシステムを実際にザラバで稼働させてみた。
テストなんで、今自分がもっている5銘柄でテスト。
まだ、時間での制御はできていないので、午前7時から午後7時半まで取得した(^^;
(要は家出てから帰るまで)
いけてるじゃん。
と、おもったのもつかの間・・。
LOGを見ると1銘柄の取得に2秒もかかっている。
たしかに、解析ロジックは鈍くさいかもしれんけど、2秒もかかることないのに・・。
分析の結果、やはりザラ場は証券会社からのレスポンスが夜に比べて落ちる。(当たり前です)
1銘柄取得するごとにログインしていた(;;)
と、いう致命的な状況でした。
もっと早く気が付けよ・・という内容ですが、
実際に動かさないとわかりませんでした。
明日は、普通に取得できればいいけど・・。
明日は金曜日なので、ここでちゃんと取得しときたい。

日中足データの取得・作成

実際にプログラムを組んでみる。
まずは、ログイン処理・・・
これは、データベースに入っている、私の証券会社のIDとパスワードを設定して、
submitするだけである。簡単である・・・。
はずだが、なぜか、変遷してない。
処理的には問題ないはずだが・・・。
取得したhtmlを見て、びっくり、Safariで普通に見ているときにはわからない現象が起こっていた。
おそるまじ・・・。
原因がわかれば対処はできる。
結局、数時間はまってしまった。
ログインしてしまえば、現在のログイン状態を内部変数に保持しつつ、
必要な会社のデータをリクエストすればよい。
現在値だけであれば、注視すべき銘柄をボードにいれて、それをリロードするのが、
処理は速いが、やはり、せっかくの日中足データ取得をするのであれば、
気配値もとりたいので、一つずつリクエストすることにする。
途中、
・ 気配値の取得
・ 表示されている現在時間の取得
ではまる。
気配値取得では、売り買い気配値がそれぞれ、
・5本ある場合
・5本ない場合
・5本以上ある場合
が、あって、htmlからどのように取得すればよいか、
ロジックが思いつかずに時間がかかる。
散歩中に思いついた・・。やはり気分転換は必要だ。
日時取得では、日時が文字列として扱われていることから、
データベースにinsertする時に文字列となってしまい、
日時型に設定したフィールドに入らない(デフォルト値)という現象であった。
処理中の変数を見ても、どう見てもおかしくない。
試しに日付を抽出して成形する作業を取得の直後におこなうと・・・・・・
動いた!
と、いうわけで、Perlの処理中にも日付であることを認識させておかないと、
DBIで処理をするときにうまくやってくれないようである。
そんなこと、どこにも書いてないぞ・・・。(って、見てないだけでしょうけど)
試行錯誤で、なんとなく動くようになる。
あとは実際の取得。
でもこればかりは、付き合えない(ザラ場は仕事だし)ので、
心配ですね。