はじめに
auのカブコム証券は、株取引のAPIを「kabuステーション」というブランドで公開してくれています。これは日本のシステムトレードにおいて、大変画期的なことです。
しかし、kabuステーションが公開しているAPIは、いわよる「WebAPI」と言われるものなので、MT4のように自動売買に便利な関数が至れり尽くせり用意されているわけではありません。
現状では、公開されている自動売買プログラムなどがほとんどないことから、なかなかプログラミングに精通していない人にとっては、手を出しずらいものになっていると思います。
私は、githubという、プログラム公開用プラットフォームで、自作の自動売買プログラムを無料公開しています。
ただ、公開している内容だけだとよく分からないと思いますので、このブログでその自動売買プログラムをもとに、私なりの自動売買プログラムの作り方を説明していこうと思います。
開発言語はPythonがおすすめ
kabuステーションもそうですが、FXや仮想通貨などの、自動取引のAPIは、「WebAPI」という形で公開されています。こりはRESTインターフェースと呼ばれるもので、特定のプログラム開発言語に依存するものではありません。
私は、いままいで仮想通貨のWebAPIを利用するプログラムを、Microsoft C#、Node.js(JavaScript)などで作成した経験がありますし、Javaに関してはもともと十分な知識を持っていました。
しかし、kabuステーションの自動売買プログラムはPythonで作成しました。その直接のきっかけは、kabuステーションのサイトに載っているサンプルプログラムがPythonだったからということにすぎませんが、実際に書いてみると、WebAPIを利用した自動売買プログラムに関しては、他のどの言語を使うよりも楽に書くことができました。
Pythonをお勧めする理由① WebAPIの呼び出しが簡単
これが最大の理由です。WebAPIというのは、外部のWebサイトに対してアクセスして、結果を取ってくるという処理を行うため、プログラムから内部の関数やメソッドを呼び出すのとは違う方式になります。
少し専門的な話になりますが、そういったかたちのAPIの呼び出しは、非同期処理と言って、APIの応答の受け取りや、異常系の取り扱いが複雑になりがちです。
各言語ともそこはいろいろと工夫して、なんとか簡単に記載できるようにしようとしているのですが、事前の設定がいろいろと必要だったり、約束事が多かったり、書き方が直観的に分かりずらかったりします。
しかし、Pythonは、わずかな設定だけで簡単にWebAPIを呼び出すことができます。
実際に、私が株価をWebAPIから取得しているプログラムは以下のようなものです。
import urllib.request
import json
url = 'http://localhost:18080/kabusapi/board/1570@1'
req = urllib.request.Request(url, method='GET')
req.add_header('Content-Type', 'application/json')
req.add_header('X-API-KEY', 'トークンの値')
with urllib.request.urlopen(req) as res:
content = json.loads(res.read())
curPrice = content["CurrentPrice"]
これだけで、「curPrice」という変数に1570日経レバレッジ指数ETFの現在の株価が取得できます。他の言語だと、なかなかここまでシンプルに書くことはできません。
これは、Pythonという言語が、機能性よりもシンプルさを重視した思想に基づいて作られ、発展してきた言語であることがその一因であると思います。実際、処理は他の言語に比べて遅いのですが、超高速取引をしているのであればともかく、私も含めて個人のトレーダーが使う分には、プログラム言語の処理速度など、ほとんど気にする必要はないと思います。
個人のトレーダーの方は、本業が終わった後や、休みの日にシステムトレードのプログラミングをすることが多いと思います。なかなかまとまった時間がとれず、1回に作業できる時間もあまり長くないことと思います。
そうした場合、そのプログラム自体が理解しやすい、書きやすいということは積み重なると大変な時間の節約になると思います。
また、Pythonは他の言語にくらべて読みやすいので、しばらく時間が空いたあとでも、すぐに内容を思い出し、すぐに実行することができます。これが他の言語(C#とか、Javaとか)の場合は、しばらく時間が空いてしまうと、書き方のルールや動かし方を思い出すまでに一苦労だったりするのです。
Pythonをお勧めする理由② 数学関係の機能が豊富
FXの自動売買でよく使われるMQLでは、もともと移動平均線やRSI、ボリンジャーバンドなどの自動売買のアルゴリズムでよく使われるインジケーターが関数というかたちで提供されています。
しかし、WebAPIにはそのようなものはありません。世界的にみても自動売買投資というものが、今はそこまでメジャーではないため、一般の言語でライブラリ形式で公開されているものはほとんど見当たりません。したがって、基本的にすべて自分でコーディングする必要があります。
そんな中で、Pythonはそれらのインジケーターの計算のもととなる数学的ライブラリが豊富に提供されています。
これは、Pythonが近年、データサイエンスというAI分野で統計的処理を行うのに多く用いられていることも一因であると思われます。
例えば、私は、自分の自動売買プログラムの中で、標準偏差を取得しているのですが、そのプログラムを書くときの作業量がJavaとPythonでは全く異なります。
Javaで標準偏差を取得するコード
double sum = 0.0, standardDeviation = 0.0;
double[] numArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int length = numArray.length;
// まずは平均値を求める
for(double num : numArray) {
sum += num;
}
double mean = sum/length;
// 平均からの差を累乗した値を合計する
for(double num: numArray) {
standardDeviation += Math.pow(num - mean, 2);
}
// 上記の値の平均値(分散)を平方根化する
double std = Math.sqrt(standardDeviation/length);
1つ1つの処理は単純で、コードも長くないのですが、ライブラリ化されていないため、上記の処理を自分で(ネットを漁るとはいえ)自分で理解して組み立てなければなりません。
Pythonで標準偏差を取得するコード
numArray = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
std = np.std(numArray)
たったこれだけです。Pythonが標準偏差がライブラリ化されているためです。
プログラミングの世界には「車輪の際発明をするな(Don’t invent the wheel)というものがあります。これは、すでに先人が解決したものと同じ問題は、その結果や解決方法をそのまま使え という意味です。それが信頼性を高め、時間を節約することになるからです。
システムトレードは必然的に自分の大切なお金を扱うものなので、信頼性は重要ですし、本業のある人がシステムトレードのプログラミングを行う場合は、投入できる時間も限られていると思います。
それらの観点からもPythonはシステムトレードのプログラミング言語としては、最適な選択だと思います。
Pythonをお勧めする理由③ ネット上にWeb APIのサンプルが多い
日本では全然そんなことありませんが、実はPythonは、世界で一番人気のあるプログラム言語です。
したがって、ネット上にPythonのサンプルは沢山あります。特に、欧米や中国を中心に仮想通貨取引所のWebAPIが多く公開されているのですが、そのサンプルにはかならずといっていいほどPythonのものがあります。中にはとてもよく構成されているものもあるので、今後自分でシステムトレードを進化させていく場合に、大いに参考になると思います。
世界最大の仮想通貨取引所 Binanceのサンプル
Pythonが一番上にきています
コメント