2016年2月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29          

tweet

  • tweets

« AlphaGoが誇大広告ぎみな件 | トップページ

FXや株の自動取引ツールの作り方

私はFXやら株やらの投資に多少手を染めているのですが、一時期その自動取引をするツールを自作したことがあります。先日やはり自動取引に興味のある方とその話をしていたのですが、自動取引のやり方というのはどうもあまり知られていないようです。Web製作サイドでは割と一般的な技術を使っているだけ(だと思う)で、そんな大したことをやってるわけではないのですが、その業界以外ではたしかにあまり知られていない技術かもしれないので、参考にされる方もいるかもしれないと思い、ご紹介しておきます。

世の中にはFXや株の自動取引ツールというものがいくつか出回っています。FXだとMetaTraderというのが有名です。ただ、どのツールも大体、為替なり株価なりの時系列情報だけを用いた単純なテクニカル分析を対象としており、いろんな情報源を利用してある程度複雑なロジックを実現することは(私の知る限り)できないはずです。そのようなことを実現しようとすると、ツールを自作する必要があります。

自動取引のツールが行う処理には、おおむね以下の3つがあります。

・データ収集(スクレイピング)
・売買判断
・取引実行

このうちスクレイピングについてはいろいろ他に情報源があるのでここでは触れません。ググればいろいろ情報が出てきますが、ここではいちおう参考書として以下を挙げておきます。この本ではたとえば、Yahoo!ファイナンスから株価のデータをとってくるライブラリ、なんてものも紹介されています。
Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

また売買判断については、FXと株でも違うし、そもそも自動取引をやりたいという人は、取引手法に関するなにがしかの自分なりのアイデアがあって、それを試したい、という人だと思いますので、これにも触れません。というかそもそも私も必勝の売買判断法を知ってるわけでもありませんし。

ということで本記事では、取引実行の部分に関してのツールの作り方を紹介します。売買判断のアルゴリズムは作れる/作りたいけど、どうやって取引を自動化すればよいのかわからない、という人が想定読者です。前提とする知識としては、FXなり株なりの知識の他に、プログラミング言語とHTMLの基礎知識(そんな高度な知識がいるわけではありませんが、入門書程度は)。あと、VPSでツールを動かすためにサーバシステム(OS)の基礎知識も若干必要です。ここでは私が使っている関係で言語はruby、OSはLinuxを例にとって説明していきますが、たとえばpythonとWindowsとかでも同じことができると思います。

【概要】

基本的なアイデアとしては、「通常は人が手で行うブラウザの操作を、プログラムで実行する」というものです。人がたとえばFXの取引をするとき、ブラウザ上でまず取引業者のサイトに行き、ユーザネームとパスワードを入れてログインボタンをクリックします。それから、価格ボード上の価格を見ながら、タイミングを見て、通貨・枚数・売りか買いか・注文種類(通常/IFDone/IFD-OCO/…)・成り行きか[逆]指値か・[逆]指値ならその価格、といった情報を入力/選択して、注文ボタンをクリックします。要はこういった一連の動作を、手でやるのでなくプログラムから実行できればよいわけです。

これを実現するには、以下の3つのツールを使えばできます。
A. Selenium webdriver
B. Selenium builder
C. Firefox付属の開発ツール(インスペクタ)

このうち、Aがメインのツールで、ブラウザの操作をプログラムで実行/自動化するものです。BとCは、個々のブラウザ操作をプログラムに「翻訳」する作業を簡単化してくれるヘルパーツールです。なおブラウザは、たしか他のブラウザ(Chromeとか)も使えると思いましたが、これまた私が使ってるという関係でFirefoxを前提に説明していきます。では順番に、これら3つのツールがどんなものか、何ができるのかを説明していきます。

【Selenium webdriver】

例として、次のような一連の動作を考えます。

1. Googleのページに行き、
2. 検索窓に「FX 自動取引」と入力し、
3. 「検索」ボタンをクリック
4. 検索結果のいちばん上のリンクのタイトルを表示する

これを実行するrubyプログラムは以下のようになります。

1 require 'rubygems'
2 require 'selenium-webdriver'
3 wd = Selenium::WebDriver.for :firefox
4 wd.get("http://www.google.co.jp")
5 wd.find_element(:id, "lst-ib").click
6 wd.find_element(:id, "lst-ib").clear
7 wd.find_element(:id, "lst-ib").send_keys "FX 自動取引"
8 wd.find_element(:name, "btnK").click
9 sleep 3
10 s = wd.find_element(:css, "#vs0p1c0").text
11 print s
12 wd.quit

各行の左端の数字は説明のためにつけた行番号で、実際のプログラムにはないです。1、2行めはおまじないで、とりあえずこうするものだと思ってください。3行めが”webdriver”なるものを用意します。これが「ブラウザを操るもの」になります。4行めでGoogleのページに行きます。5-7行めのfind_element()が検索窓のHTML中の位置を見つけて、内容をクリアした後、send_keys()でそこに文字列を入れます。8行めで検索ボタンをクリック。少し待ってから、10行めで、最初のリンクのタイトル文字列の情報を抽出します。

細部はともかく、なんとなく直感的に何をやっているかわかるのではないでしょうか。意外と簡単そう、と思っていただけるのではないかと思います。このrubyプログラムをターミナルから実行すると、firefoxのウィンドウが立ち上がり、Googleページを表示します。そして検索窓に「FX 自動取引」の文字が入力されていき、続いて検索ページに飛びます。それから最初のリンクのタイトルがターミナルに表示されて終了します。まさに、手でやることをそのままプログラムでやっている感じです。

Selenium webdriverのインストール方法や概要についてはこの↓あたりを参照ください。
RubyでSeleniumを使ってスクレイピング

難しそうなのは、find_elementで要素を指定するのを具体的にどうやるのか、クリックはclickとわかったけど、ラジオボタンやら選択リストから選ぶのはどう書けばいいのか、などが気になると思います。これに答えるのが、次のSelenium builderとFirefoxインスペクタです。

【Selenium builder】

これはFirefoxのプラグインです。インストール方法や概要、使用法についてはこちらの記事を参照ください。
Selenium Builder で UIテストを高速化

要するにこれは、ブラウザ上でクリックしたり文字列を入力したり選択リストから項目を選択したりすると、それに相当するプログラムの文を出してくれる、というものです。上のrubyプログラムの例だと、1-8行めは自分でrubyを書かなくても、ブラウザ上で操作さえすれば、Selenium builderがrubyを書いてくれるのです。はっきり言って超スグレモノのツールです。

【Firefox インスペクタ】

インスペクタは、Firefoxに標準で入っている開発/デバッグ用の機能です。
入力に伴う操作に関してはSelenium builderにお任せでほぼ問題ないのですが、入力操作がなく、情報を見るだけの部分にはインスペクタを使います。上のGoogleの例だと、10行めのリンクのタイトルをとってくる部分です。自動取引ならば、時々刻々変化する価格をウォッチしつづける必要があります。上のGoogleの例の10行めでは、最初のリンクの位置を “#vs0p1c0” で指定していますが、見たいページ上の場所の位置情報をどうやって知るか?です。

これも実はかなり簡単にできます。Firefox上でページを開き、知りたい情報(価格等)の上にカーソルを置いて右クリックします。メニューの中の「要素を調査」を選択します。するとFirefoxのウィンドウ中にインスペクタのペインが開き、その要素に対応するHTMLの行がハイライトされます。こんな感じ:

Firefox_inspector

更にそのハイライトされた部分にカーソルを動かし、また右クリックをすると、メニューに「一意なセレクタをコピー」というのがありますのでそれを選びます。それをどこかに貼り付けると、要素のCSSセレクタが得られます。これをfind_element()の引数に与えればよいわけです。

以上のようにして、Selenium webdriver、Selenium builder、Firefoxインスペクタを組み合わせて使うことで、取引に必要なブラウザ操作をプログラムで実現できることがおわかりいただけたと思います。あとは、自分の使っている取引業者のサイトに合わせてプログラムを作って、運用するだけです。

【24時間運用】

基本は以上ですが、もう1点、実際に運用するにあたって便利なtipsを書いておきます。
FXをやるなら、できれば月曜朝から土曜朝まで5日間24時間ノンストップで動かしたいでしょう。自宅のPCからではいろいろ不都合があるので、VPSで走らせるのが何かと便利です。私がやっていたときは、cronで月曜朝に起動し、ruby中で土曜朝になったら終了するようにして運用していました。

しかしVPSでSelenium webdriverを動かすには問題がひとつあります。VPSではコンソールがなく、通常sshでリモートで入って作業します。これを”headless”と言います。Selenium webdriverはfirefoxのウィンドウを出すので、出し先のディスプレイを用意する必要があります。何もせずに動かすと”Can’t Open Display”となって、webdriver起動のところで異常終了してしまいます。

この対策には、Xvfbというツールを使います。Xvfbのインストール方法や使用法はこの記事あたりを参考にしてください。
xvfbとfirefoxでseleniumをヘッドレスに起動する手順

xvfbは「仮想フレームバッファ」と呼ばれるもので、つまり仮想コンソールです。ディスプレイはないんだけど、あたかもディスプレイがあるかのようにディスプレイへの表示コマンドを扱うものです。文字列を/dev/nullに出力するような、というか。これによってheadlessでもwebdriverが動くようになります。

xvfbを起動する際、たとえば”:9”のような引数を与えて、仮想ディスプレイを9番とします。で、rubyスクリプトの最初で
ENV[“DISPLAY”] = “:9”
のようにしておけば、firefoxウィンドウはその(仮想の)9番ディスプレイに出力され(たことになり)、問題なく動きます。

【注意事項】

最後に、注意点をいくつか挙げておきます:

・取引サイトによっては、Flashを使うサイトがあります。ここで述べた手法では、Flashには対応できません。(Flashでも似たようなこと(自動操作/情報抽出)ができるのかもしれませんが、私はやり方を知りません。)サイトによっては、基本はFlashのインタフェースだが、Flashのないブラウザ向けにFlashなしのインタフェースがあるようなサイトもありますので、そういうときはFlashなしの方を使うとよいでしょう。

・取引業者の規約を守ってください。業者によっては、自動取引は禁止、と明確に書いているところもあります。また現状禁止してない業者も、自動取引を行うユーザによって何か迷惑をこうむるような事態になれば、規約を変えて禁止することもありえます。特に危険なのは、ひんぱんに取引やアクセスをすることでサイトに負担をかけることです。これが業者にとっていちばん迷惑なので、絶対にやめましょう。アクセスはある程度間隔を置くこと。私がやっていたときは、いったんアクセスしたら次のアクセスまでは10分待っていました。スキャルピングのような手法は避けた方がよいでしょう。

・本記事の内容は無保証です。本記事を参考にした結果として、取引での損失等含め何が起ころうとも、私は一切関知しません。自己責任でお願いします。

« AlphaGoが誇大広告ぎみな件 | トップページ

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/507007/64103536

この記事へのトラックバック一覧です: FXや株の自動取引ツールの作り方:

« AlphaGoが誇大広告ぎみな件 | トップページ