目次。
この文章を読んで、面白い!役に立った!...と思った分だけ、投げ銭していただけると嬉しいです。
【宣伝】ギターも歌も下手だけど、弾き語りをやっているので、よければ聴いてください。
はじめに。
株式の自動売買のプログラムは、株価データの取得、解析、それをもとにして株を買うか否かの判断をするところまで開発を進めた。ついでにその結果をTwitterで自動投稿するコードも書いた。と言うのが、前回までの話。
そして、開発したコードの動作確認をする傍ら、証券会社に自動で株式の売買注文するプログラムを書き始めた。と言うのが、今回の話。
自動売買プログラムを作るんだったら、まず自動売買ができるということを担保するために、最初に自動注文のコードを書くべきであったが、ずるずると時は流れ、今に至った。
個人的にあんまり僕が使っている証券会社を公開したくない。そして書いたコードは、その証券会社のWebページの構造に合わせて開発している。そのため、実際のコードもここには載せない。
と言っても、それじゃあ面白くないので、下記の(超)簡易な株式売買注文フォームを例にとって、どのようにしたら、株式売買の自動注文ができるか、プログラムのコードとともに説明しようと思う。
実際の自動注文は、今から説明する例よりもややこしい。しかしながら、ややこしいのであって、難しいわけではない。自動で注文するプログラムを書くのは簡単。見た目がややこしいので、ただ難しく見えているだけ。
自動で株式の売買注文するプログラムの作成手順。
ログインとか。
ご存知の通り、証券会社のWebサイトにログインしてなかったら、売買注文はできない。ログインの話は、以下を参照のこと。
ログインが完了したというていで話を進める。
HTTP通信の解析。
ここら辺は、上のログインの時に書いた内容ともろ被りなのだが…。
以下のフォームに
・買値…100円
・購入数…100株
・注文タイミング…今日
と入力して「買う」というボタンを押す。
ボタンを押すと本物の注文画面であれば、「買い注文を受け付けました」みたいなページに移ると思うが、このフォームは、あくまでデモなので、「買う」というボタンを押すとNot Foundというエラー画面に遷移する。
この過程で行われたhttp通信を調べる。調べ方は、「証券会社の口座にログインするプログラムを書いた話。」で書いた通り。ブラウザを使えば、簡単に調べることができる。僕が使っているブラウザは、Firefox。
ここで分かるのは、ブラウザがhttps://blog.sun-ek2.comにPOSTメソッドでhttp通信をしたということ。僕の(超)簡易な送信フォームでは、https://blog.sun-ek2.comにPOSTでアクセスするとエラー(404 Not Found)が返ってくる。ちゃんとした送信フォームの場合、送信先には拡張子がcgiとかdoとかいったファイルが待ち構えていて、POSTで送ったデータが適切に処理される。
要求ヘッダ(request header)は、「ブラウザの種類はなんだの」、「使用言語はなんだの」、「どっから(どのリンクから)やってきたのか」といった情報が載っている。僕の経験上、プログラムを書くときに要求ヘッダのことを全く考えなくても上手くいくことが多い(僕は、実際のコードで要求ヘッダをいじくっているが)。
ここで分かるのは、POSTによるhttp通信でparameter1, 2, 3と名付けられたパラメータにそれぞれ100, 100, 1という値を代入して送っているということ。
しかし、ここで疑問が…。
- parameter1, 2のどっちが買値で、どっちが購入数を表しているのだろうか?(本当なら、パラメータ(変数)にparameter1, 2みたいな分かりにくい名前は付けないだろうが…)
- parameter3に代入された1とは何か?
この謎を解こうというのが、次の話。
HTML解析。
http通信で送信されたパラメータ一覧を見ると「これは一体何だ?」といったパラメータに遭遇することがある。今回は、その例として送信フォームのパラメータにあえて分かりにくい名前(parameter1, 2, 3)を付けた。
ここでは、「これは何だ?」といったパラメータに遭遇したとき、「htmlを調べれば、推定できますよ」という話をする。
とりあえず、(おそらく大体のブラウザに元から入っているであろう)解析ツールを使って、htmlを眺めてみる。Firefoxの解析ツールは、[Ctrl]+[Shift]+[E]で出てくる。
ここで分かるのは、parameter1が買値、parameter2が購入数、parameter3が注文タイミングに対応するということ。それに加えて、parameter3に代入された1という値が「今日」に対応するということ。
これさえ分かれば、もうプログラムを書く準備はできた。
僕の場合、パラメータの送り漏れを防ぐためにhttp通信解析によって、必要なパラメータをリストアップして、html解析によって、パラメータの意味を推定している。
プログラムコード(ソースコード)。
http通信解析とhtml解析で必要なパラメータセットとそれらパラメータの意味を知ることができた。後は、先ほど「買値100円」、「購入数100株」、「注文タイミング 今日」と手動で入力して、「買う」ボタンを押していたのを自動でやってしまうプログラムを書く。使用言語は、Python。
import requests target_url = 'https://blog.sun-ek2.com' post_parameters = {'parameter1':'100', 'parameter2':'100', 'parameter3':'1'} r = requests.post(target_url, post_parameters) print(r) #このコードを走らせると、もちろん404というエラー(Not Found)を表すHTTPステータスコードが返ってくる。 #僕のブログには基本GETメソッドでアクセスしないといけないので。 #本物の売買フォームは、POSTで送ったパラメータを処理するプログラムが待ってくれているので、 #ちゃんとすれば、200(OK)というHTTPステータスコードが返ってくる。
さっきも言った通り、実際の売買注文のフォームで送るバラメータの数は数十個である。パラメータが大量にあるので、むちゃくちゃややこしい。しかし、ややこしいということは、難しいということではない。パラメータが単純に増えただけであって、やるべきことは(超)簡易な送信フォームを使って、今まで説明したことと何ら変わりがない。
今後。
「自動株式売買プログラム開発を思い立った話。」という題で文章を書き、実際にプログラムの開発を始め、やっと最低限必要な自動売買のプラットフォームの構築を終えた。
これで一区切り。
とりあえず売買ロジックを考える。
今までは自動売買のプラットフォーム構築にずっと注力していたため、売買ロジックに関する開発はまだ十分にできていない。
一応、短期・長期の移動平均線を組み合わせによって売買タイミングを判断するプログラムを書いた。この方法は、かなり初歩的ではあるが、とても有名である。
このロジックを積んだプログラムを試験的に走らせてみて、結果をTwitterに自動投稿しているが、結果はずっとマイナス…。今は、無限マイナス生成マシンと化している。
次の一手は、移動平均線のアンサンブル化。つまり、複数の移動平均線の組をピックアップして、各組に重みをつけて、その重みを過去の株価データを使って学習させるといったアルゴリズム。
移動平均線の組をどのように選ぶのか?これは、難しい問題。最初は、単品で高パフォーマンスを発揮する移動平均線の組を上からピックアップしようと思う。それがダメなら…次の手は考えているが、その話はまた今度。
後は、やっぱり勉強の意味も含めて、色々な機械学習のアルゴリズムに触れたいな。
海外大学院出願に向けて。
「自動株式売買プログラム開発を思い立った話。」で書いたような理由でプログラムの開発を始めたのだが、最近、今まで開発したプログラムを海外大学院の出願書類でアピールすれば、プラスにはたらくのではないかと思い始めた。今考えている具体案は、GitHubに開発中のプログラムのソースコードを載せて、重要な出願書類である”Statement of Purpose (SoP)”、もしくはCVにそのリンクを張るといったもの。
「僕は、プログラミング技術があります」
って文章書くよりも
「僕は、株式を自動売買するプログラムを開発しとるけん、しゃんしゃんリンク飛んでソースコードを見てんまい!」(僕の普段の話し言葉は、こんな感じ)
って書いてGitHubのリンクを張った方が、きっと10倍くらい説得力がある(10っていう数字は適当)。
僕がつきたいと思っている先生は、数年前から「量子機械学習」に力を入れだしている模様。それなら、「プログラミングとか機械学習といったトピックを出願書類に盛り込めば、有利になるのでは?」なんてことは、1年位前から考えていた。「じゃあ、具体的にどうアピールするか?」については、その時は考えていなかったのだが。
GitHubを通じて開発中のコードを見せるのは、一つの解。
第一目標 2020年末までに月利2.1%(日本学生支援機構奨学金の月額返済額をカバー)。
大学・大学院進学、一人暮らしに必要な費用は、すべて奨学金で賄っている。日本学生支援機構から円を借りた。幸いなことに学部2年目から民間団体より経済的なご支援を頂けることになり、かなり生活が楽になった。民間団体から頂いている奨学金は、給付型なので返済義務はない。生活が楽になったこともあり、現在円の貯蓄がある。
日本学生支援機構から借りた円は、奨学金という名の借金である。学生の身分が終わってから、最長20年かけて毎月返済していかなければいけない。
借金円を貯蓄円を元手に開発中の株式自動売買プログラムで返済するには、どれだけの月利が必要か、ものすごくざっくりと計算してみると…
と言うわけで、第一目標は2020年末までに月利2.1%。
この文章を読んで、面白い!役に立った!...と思った分だけ、投げ銭していただけると嬉しいです。