取引シグナルの処理

今日はPCをさわることができなかった。
先日から、取引シグナル(売買シグナル)の計算方法を考えないといけないと考えていた。
(始めに考えろよ・・・という意見もあるでしょうが、私は先に作り始めてしまう癖があります(^^;)
通勤電車や仕事の移動時間に、いろいろと考えてみた。
スイング用のシグナルは、日足データから生成。
いろいろと本などをみてみると、3つの指標で基準をみたしたら、シグナルを発するような
仕組みがかかれていた。
私の場合は、軍資金の範囲で、より効率的に回したいことから、
予算額を設定して、その範囲で帰る銘柄を抽出するようなシステムにしたい。
(100万であれば、30万、40万、20万の銘柄3つを抽出・・とか)
なんせ、汎用性はいりませんからね(^^;
一度、買い(売り)をいれると、それを決済する必要がありますが、
これには、同じロジックの指標からの売り(買い)シグナルとともに、利益確定や損切りの基準を設けて、
決済する必要があります。(購入額の5%減で損切り・・など)
また、次に書く、デイトレ用の決済でも、判断をして、急落した場合や、
急上昇して、即落ちるようなケースに対応したいと思います。
これは、証券会社の自動売買では、今のところ対応できない手法だと思います。
デイトレ用のシグナルは、注視する銘柄を当日の朝までに自動抽出して、
30から100銘柄を注視していきます。
分足のデータを日足と同じように処理しつつ、気配値などから近々の動きを判断して
売り買いをしようと思います。
これは、シグナルが出た銘柄を、予算内で購入するようにします。
デイトレ用予算の全部を使うような買い方はせずに、予算の半分程度を限度に、
同時に3銘柄ほど、一日に、10回ほどの取引で回したいと思います。
基本的に翌日への持ち越しはせずに、その日のうちに決済をするようにします。
取引が終わってから、不測の発表があり、翌日に動けないと困りますので・・
(逆に良い発表があって急騰することもありますが・・)
どの指標をどのように組み合わせるかは、シミュレーションで決めることにしますが、
今、考えるシミュレーションを、すべて行うと・・・・
計算すると、うちのmini君では、
1回の計算で   28年
かかることがわかりました。
この辺は、現実的でないので、せめて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
と、回す。
とりあえず、日足データの取得まで作成。

指標のデータベース化

先日、指標をデータベース化するという話をしましたが、
その実現をするためのプログラムでは、いくつかの選択肢があります。
今の環境では、
・ 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は後回しで、画面には、ボタンと状況を表示するコンソール画面で、
当面は作業をしようと思います。