読者です 読者をやめる 読者になる 読者になる

コバのシステムトレード構築日記(トレードステーションとIB証券とその他)

マネックス証券、IB証券のナレッジやその他諸々

3/11投資戦略フェア

雇用統計発表後の逆指し値が刺さって、円高による損失は回避出来ましてそこそこいい感じでドル円ロングを利確出来ました。期末に向けての円換金とFOMC後のリバウンドや欧州選挙1発目もあるので来週はボラが大きくなりそうなので、ポジションは薄めで行きたいと思います。

そして寝不足のまま、土曜日は朝から投資戦略フェア in 東京ドームシティに行ってきました。

 

InteractiveBrokersのブースが閑散としてました(汗)。

ちょろっといろいろ教えて貰いました。詳細はメッセージセンターでというオチでしたが(汗)。

マネックスさんのブースはミニセミナーみたいなのをやっていたこともあり、時間帯によっては大盛況。

 

受講した中では 「ヒルトンの市場心理のクセを読む225先物デイトレード」と、「未来のシステムトレード」が印象的でした。

アノマリーが日々真似され上書きされ新しいモノを作っていかないと、テクニカルでは厳しいという話はよく聞きますが、前者のN225TOPIXアノマリーデイトレの話は真似するには少し敷居が高そうなので興味深いモノがありました。もっとリアルタイム性と、解析データの幅を広げれば、他の商品ペアでも使えそうな直感がしました。

 

後者は、SAXO BANKでも APIトレーディングが可能だと言うことと、ブルーオーシャンが見えてわくわくする個人でのシストレ領域の話です。Python3シストレ著者の森谷さんという方はかなりの切れ者だという印象ですが、いろいろ悩みというか歯がゆさを積み重ねてきている感じもしました。IB、Dukascopy、マネックス・トレステをメインに考えていましたが、SAXO BANKも加えたいところです。手が回りません・・・orz

 

昨年に続き、2回目でしたが人の多さにちょっとウンザリです。来年もあるとしたら待ち時間を会場内に居なくて済むような動き方と、椅子がしょぼくて堅いので携帯座布団必須ですw。こういうとき肉座布団の大きい女性は羨ましく思います(汗)。

 

トレステ ELの試行錯誤を次の作業として考えていましたが、いろいろとアノマリーのネタが貯まってきたので整理作業に入りたいと思います。

IB証券:API接続検証、その7「履歴データ取得前の留意点」追加

イエレンさんが比較的以前よりも積極的な発言を出しても思ったよりドル高にならず、逆にドル安になった昨晩。

はい、損切りしました。難しいですなあ相場は。

 

今週末の IB Gatewayのメンテナンスが終わり、履歴取得プログラムを再スタート。

最近は土曜日はこの作業のために外出できません・・・

今日は東証株価履歴が 11:00 AM JSTに停止、為替などの IDEALPROの履歴は12:00 AM JSTに停止、とこれらは前週と同じでしたが、再開時刻が 15:45 JSTと少し遅くなったようです。このあたりの傾向を見極めたら、スケジューラーから自動で処理出来るようにして、外に遊びに行けるようにしたいと思います。来週3/11は投資EXPO2017に朝から出かけるので。

 

今日から為替と東証株価に加えて、金と銀のUK Metal価格も履歴取得を開始しました。こちらは古いモノでも2010年10月ごろからしか無いようで、為替価格履歴とマッチングさせる時間軸が短くなってしまいます。まぁ仕方ないです。

さらに3月から、OSEのプライスデータ取得月額チャージも始めたので、日経225など主要な指数データの履歴取得プログラムを早く作らなければなりません。

 

前回記載した IB証券からの履歴データ取得での留意点に関して追記があります。

6:履歴取得は当日と直近数日分(おそらく1週間)の取得が一番速い

 東証株価だけで確認していますが、前場引け後・後場引け後などのタイミングを考慮して当日分の履歴データ取得を呼び出すと、ほぼ瞬時にレスポンスが返ってきます。過去5営業日分ぐらいまでは同じ傾向です。試しに三日間ほど、IBGatewayにソケットを4本開いて証券コード1301から9997までの全銘柄当日30秒足~1時間足まで9種類のデータを呼び出すと7時間程度で完了しました。ソケットの数の増加に対して速度の低下があまり無いようなので、週明けにはソケット数をもっと増やして後場開始までに前場の全履歴を取得出来るように調整してみます。

 これから、IB証券の過去データを取得することをトライする方は、まず最初に1日分の履歴データを取得するプログラムを走らせるのを優先すべきです。1週間過ぎると時間が倍以上かかります。

 まだ東証過去データ取得が今年の分すら終わりません(汗)。30秒足から各足を生成しようかと考えましたが VWAPの値がずれそうなので諦めて地味に全部取得中です。為替の方は6通貨だけ2006年から2014年まで取得完了です。来週末までにはほぼ現在までに追いつきそうです。

 

また、試験的に作成したIBの注文プログラムが正常に動作しました。マネックスのトレステにも銘柄スクリーニングしてデータを展開するのを短期目標の一つにしています。複数銘柄マーケットデータを同時に確認する能力が高いトレステにデータをインポートさせるというイメージです。ごくまれに起こるかもしれない接続障害への備えとして、 IB証券とマネックスの両方が使えるよう用意していく考えです。CFDや為替はDukascopyも対象にしていますが、まだプログラム開発が未着手です。

IB証券:API接続検証、その6「履歴データ取得前の留意点」

Forex6通貨ペア、東証上場約3,900銘柄の 30sec/1min/2min/3min/5min/10min/20min/30min/1h/4h/1day/1weekの12種足を取得開始して2週間ほど経過しました。(4時間足は東証株価には不要だろうと除外)

いくつか経験からの留意点があるので書き留めておきます。

 

1:Exchange毎にレスポンスのキャップがある模様

 92通貨ペア全てだと年単位で時間がかかりそうだとは以前書きましたが、IB証券側のサーバレスポンスが遅いので覚悟が必要です。

 接続時に contractオブジェクトを生成してプロパティ値として Exchageを指定しますが、そのExchange毎に処理能力がアカウント毎に決まっているようなレスポンスを感じます。IBGatewayにソケットを開いて Forexの Exchange=IDEALPROを指定して例えばUSDJPY履歴データの取得を始めると打てば響く程度のレスポンスでドンドンデータが取れます。しかし新しくソケットを開いて EURUSD、EURJPY、GBPJPYと通貨を増やして並行処理させると増やした通貨ペアに比例するレスポンスの低下が起きます。厳密にははかっていませんが、サーバー側の付加を考えると致し方ないとは思います。これは Exchange=TSEJでも同じです。

 したがって、取得したい銘柄や通貨ペアなどに優先的に指定出来るようなプログラムのパラメータが必要かと思います。もしくは Exchangeが異なるデータ取得プログラムを複数早く揃えるのがよろしいかと思います。まだ IDEALPROと TSEJ用しか作っていないです。パターンは同じなのであとは課金とやる気の問題。

 東証約3,900銘柄の数年分の履歴取得に計算したくないほど膨大な時間がかかりそうなので、IB証券さんにはなんとかして欲しいなあとは思います。

 

2:Symbol(銘柄/通貨ペア)毎にレスポンスに微少な差がある。

 現在、6通貨 USDJPY, EURUSD, EURJPY, GBPJPY, GBPUSD, AUDJPYの履歴を取得中ですが、人気?の通貨単位が入ったペアは若干のレスポンスの遅さがあります。ざっくり5%~8%ぐらいと推測。上記6通貨ペアを1年分12種足取得するプログラムを同時に走らせると、EURUSDが一番遅く、次いでUSDJPY, EURJPY, GBPUSD, GBPJPYと続いて一番速いのが AUDJPYという傾向があります。サーバーの負荷が低そうな、不人気そうな通貨ほど速くデータが取得出来る可能性はあるかもしれません。数パーセントの誤差が履歴取得プログラムの制御に影響しそうであれば考慮しても良いかもしれません。

 あと2週間ほどで6通貨の履歴取得は終わりそうなので、その後のマイナー通貨ペアのダウンロードに取りかかればもう少し正確な傾向が判るかもしれません。

 

3:東証上場廃止銘柄の履歴データ

 過去に上場廃止になった銘柄のデータは query not foundで取得出来ません。あとはそのタイミングで何時からなのですが、2017/2/6に上場廃止になった日本デジタル研究所の場合では、最終取引日2/3 Friの24:00 JST頃にデータが取得出来なくなりました。MBOなどで上場廃止になり将来復活の可能性がある銘柄などはデータを持っておきたいところなので、早めに対応することが必要かと思います。

 

4:サーバの保守メンテナンス

 土曜日15:00頃 JST~翌週土曜日12:00 JST頃までは、IBGatewayが IB証券に基本的に接続出来るようです。上記期間中でもネット回線の状態によるのかもしれませんが希にセッションが切れて再接続を IBGatewayが試行しているようです。また、Exchange毎にメンテナンスがあるのか停止することも希にあります。東証の TSEJは土曜日の早朝に10分ほど止まっていたこともありましたが、同時刻帯に IDEALPROの Forexデータは取得出来ていたことからの推測です。

 プログラム側で履歴データ取得のレスポンス待ちを組み込んでその時間を長めにとるなどの対策を組み込みつつ、土曜日の12:00~15:00 JST頃は停止することを前提にプログラムの制御を考慮した方が良いかと思います。

 

5: IB Gateway接続時には Trader Workstationにログイン出来ない

 Trader Workstationにログインすると排他制御なので、IB Gatewayのセッションが切れてデータ取得が Abortします。私のプログラムは精緻なリスタート機能は無いので面倒くさいことになります。不便なのですが、全てシステム売買にするか UIから行うかの2択なのかと思います。

 バックテスト環境構築優先でデータ取得しかしていませんが、余力がもったいないので暴落時に発注出来るようプログラム発注もそのうち試す予定です。3Q決算を出してきて値が下がった押し目買い候補がいくつかありますので。

IB証券:API接続検証、その5「ほぼ基本構造の完成とバグ取り終了」

不具合と効率性のチューニングで手間取りましたが、

為替(Forex)

東証(TSEJ)

の2種の IB証券のExchange指定から、

日本株と為替通貨ペアの詳細履歴を取得するプログラムが完成して、稼働開始しました。

ざくっと見積もると為替だけでサイズは 1TBぐらいになりそうです(汗)。

取得には2年ぐらいかかりそうです(滝汗)。

現実的では無いので、主要通貨だけの20ペア分ぐらいで良いかなと言う気もしてます。

東証株価の方はさっき出来たばかりなので、どれぐらいの期間とサイズになるか不明です。基本的に同じクラス構造の中で対応したので、さらに3つめの金融商品への対応も楽そうです。おそらくプライス情報が無料の中から UK Metalの Silve/Goldか、European BATS/Chi-X Equitiesか、OSE-Jの購読のActivationして各種指数あたりをざっくり確認中。

疲れたので途中経過のみ。

プログラミングのはまりどころや重要なポイントは次の週末ぐらいにはまとめます。たぶん。

トレステ:忘れてた諸々。

すっかり忘れてましたが、昨年の11月?、日本橋での杉原杏璃さんと、個人投資家3名の方と冷やし中華芸人を招いたプレス向けに一般参加してました。

 

実物で見るとえらい細くてびっくりしたのが杉原杏璃さん。

お腹いっぱいメシ食って好きなだけ酒飲むような生活しているオッサン女子には無理な体型だろうなあと想像。

それ以外は特に印象には残らず。マニアックな質問をしたかったけどなんか雰囲気が違ってて早々に退散しました。

 

 

あとは、メールで募集が来てた 「Easy Languageホームスタディコース」が届きました、年末に。PDFでも良いけど、最近は紙の本の見やすさにまた戻ってきてます。

5年ぐらい前に、断捨離で3,000冊ぐらいの本を裁断して全てPDF化しましたが、若干後悔しています。本って本棚での位置とラベルと厚みも調べ物をする際に大事な情報だということに気がついた次第です。

今から本をスキャンしようとしている人がもしいたら、考え直すことをお勧めします。

 

電子ファイルで事足りるのは資料性の無いどうでもいいものになります。

漫画でもたとえばゴルゴ13だと、あのダイヤを狙撃してかち割るダイヤカットダイヤって何巻だっけと思って本棚だとすぐに見つけて読めますが、電子ファイルだとそうはいかないです。

いずれ、ゴルゴとこち亀は全巻買い直しだなと思っています。

IB証券:API接続検証その4「クラスオブジェクトの、どこから手をつけるか」

(以下は Java限定。他の言語でも似たようなオブジェクトデザインなので参考程度に。)

 

IB証券へのAPI接続には、"IB Gateway"というプログラムを Windows or Linux/Macの環境で起動すると IDとパスワードを打ち込み "IB Gateway"が、IB証券に繋がるので、自分で作るプログラムはこの "IB Gateway"に接続する形になります。

自作PG(デモプログラムも同じ) → IB Gateway → IB証券

24時間/365日OKみたいです。たまに切れて再接続してます。

 

サンプルソースコードは、この IB Gatewayに、接続して リアルタイムや 履歴データを取得するプログラムそのものになっていました。

 

開発環境への取り込み:

私の環境は eclipseです。

eclipseってなんじゃ?という人はググって使って慣れてください。何でも出来る系の開発環境なので敷居が高く感じますが根性で乗り切りましょう。

D:\TWS API\source\JavaClient\com\ib

ディレクトリパスにある、3つのパスにある javaファイルをパッケージとしてインポートします。

com.ib.client

com.ib.contracts

com.ib.controller

です。ぜんぶで68ファイルぐらいあります。

警告が出たりしたら適当に直すか、エラーでは無い限り放置で良いかと思います。

セッション確立のあたりはサンプルを見ればなんとか解ると思います。

 

結論から先に書くと、com.ib.controller.ApiController クラスを継承して新しいクラスを作成し、履歴データやリアルタイムデータが返ってくるメソッドをオーバーライドして必要な処理を実装すればOKです。

オンラインドキュメントでは、EReaderSignalオブジェクトを EJavaSignalクラスでインスタンス化して、EClientSocketクラスに EWrapperインターフェースを実装して作成したクラスもインスタンス化して渡せば、EWrapperインターフェースクラスの実装メソッドにデータが返ってくるように読めますが、素直にそういうのを作ってやっても返ってきません。(汗)

ApiControllerクラスがすでにその条件のもとに作成されているので、多少使わない機能実装があったとしてもそのまま使うのが吉かと思います。

 

重要なクラスの一つが、ApiControllerです。

履歴データ取得専用の新たなクラスを作るとすると、こんな感じです。

public class ibController extends ApiController {

  /** とりあえずコンストラクタはそのまま上位を呼び出し。 */
    public ibController(IConnectionHandler handler, ILogger inLogger, ILogger outLogger) {
        super(handler, inLogger, outLogger);
    }
    
    /**
     */
    @Override
    public void historicalData(int reqId, String date, double open, double high, double low, double close, int volume, int count, double wap, boolean hasGaps) {
        //上位メソッド呼び出し。
        super.historicalData(reqId, date, open, high, low, close, volume, count, wap, hasGaps);
        //データ処理(上位メソッドの条件判定の一部をそのままコピペ。ApiControllerを修正したくないので)
        if (date.startsWith( "finished")) {

            //ここに指定条件の全てを取得後の処理、たとえばトランザクションのコミットなどを書く。
            System.out.println("IB historical data received end:");
        }
        else {
            long longDate;
            if (date.length() == 8) {
                int year = Integer.parseInt( date.substring( 0, 4) );
                int month = Integer.parseInt( date.substring( 4, 6) );
                int day = Integer.parseInt( date.substring( 6) );
                longDate = new GregorianCalendar( year - 1900, month - 1, day).getTimeInMillis() / 1000;
            }
            else {
                longDate = Long.parseLong( date);
            }

            //Date型への変換用に1000倍して戻す。
            Date dt = new Date(longDate*1000);

            //ここで1件ずつデータがやってくるので persistするか、コミット用にためるなどの処理を書く。
            System.out.println("IB historical data received:" + reqId + ":" + date + ":" + dt + ":" + open + ":" + high  + ":" + low  + ":" + close  + ":" + volume  + ":" + count  + ":" + wap  + ":" + hasGaps);
        }
    }


}

 

 

 

IB証券:API接続検証その3「まずはどんな感じでデータが取れるのかを確認」

イメージをつかむために、サンプルデモプログラムを動かすのが一番。

VB用と、C#用が何もせずに exe実行すれば動くので、見た目の解り易さで C#のプログラムを起動します。

ソースを展開したディレクトリ、(私の場合は ドライブDに展開した)

D:\TWS API\samples\CSharp\IBSampleApp\bin\Release

に、IBSampleApp.exe があるので実行。こんな感じ。

f:id:koba_tradestation:20170114101416j:plain

実際に動かすには、口座開設と1万ドル以上もしくは同等の任意の通貨での入金し、承認されて、データ情報を受け取る金融商品をアクティベートしてからになるので、ゼロから手続きすると半月ぐらいはかかると思います。

ドル円を、15分足で、midpoint中間値で、履歴データを表示させるとこんな画面になります。

f:id:koba_tradestation:20170114101809j:plain

VisualStudio2015 CommunityEditionとか入手して、ソリューションファイルを読み込んでデザインを変えて再構築したりしても楽しいかもしれません。

☆ソリューションファイルは、絶対パスで記述されているので、エディタなどで自分の環境に合わせてディレクトリパスなどを書き換えないと動きません。