無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

Jiji2の開発状況

追記(2015-12-01):

FXシステムトレードフレームワーク「Jiji」、リリースしました!

jiji2.unageanu.net

使ってみて、ご意見など頂けるとうれしいです。



しばらく更新できていなかったので、現在の開発状況を簡単にまとめておきます。
徐々にですが、動くようになってきています。

できていること

  • エージェントの作成/バックテスト/リアル口座でのトレードなど、コアとなる機能は一通り動く。
    • サーバー側のREST APIは概ね実装完了(のはず)。
    • バックエンドをOANDA APIに変更する対応も済みです。
  • UIも主要な機能は一通り実装完了。
    • UIから、エージェントを作成→バックテスト→リアル口座で動かす、というところまでできます。
    • ただし、「とりあえず機能を配置しました」レベルです。デザイン等はまだまだです。
    • また、バックテストの削除など細かなところの作りこみもできていません。

  • スマホアプリ
    • Cordoaのハイブリットアプリにして、UIコンポーネントはなるべくWebUI側と共有する方針ですが、それでもデザインの調整作業等は必要とみています。
    • あとはPush通知など、アプリだけの機能の部分ですね。
  • UIデザイン
  • 細かな機能の作りこみ
    • 使ってみて最低限必要と思われる機能はリリースまでに入れておきたい。
  • デバッグ
  • ドキュメント整備
  • 導入手順の整備
    • Herokuへの1クリックデプロイ
    • Dockerコンテナの用意

初版では見送った機能

以下の機能は、とりあえず初版では見送ることにしました。

  • UIからの成行注文機能
    • OANDA のクライアントアプリを使えばできるので。
    • また、Jijiではレートの更新が15秒ごとになってしまうので、作っても使いにくい機能になるかなと。

思ったよりもだいぶ時間がかかっていますが、あと1~2か月くらいあればリリースできるかなー、というところです。

コードはGitHubにあるので、気になる方はこちらをご覧ください。

github.com

導入手順とかまだ何も整備できていないので、動かすのは難しいですが。

マニュアルに書かれていないOANDA fx Trade APIの仕様3つ

OANDA fx Trade APIで、マニュアル に詳細が書かれていない仕様がいくつかあったので、動かしてみて確認した内容をまとめておきます。

サマリ

  • REST APIでは、stop と marketIfTouched で注文が可能
  • 注文のレスポンスに含まれる、tradeOpened、tradesClosed、tradeReduced, orderOpened の違い
  • tradeOpened、tradesClosed、tradeReduced のidは建玉(trade)のID

REST APIでは、stop と marketIfTouched で注文が可能

OANDA 取引ツールでは成行(market)、指値(limit) での注文ができますが、REST APIではこれらに加えて 逆指値(stop)、marketIfTouchedでの注文が可能です。

  • 成行/指値/逆指値は、他の証券会社でも提供している一般的な注文方法なので、説明はこのあたりを参照 していただければわかるかと。
  • marketIfTouchedは、「価格が指定価格になったら成行きで発注する」注文方法です。

    • 現在価格が 122.8 で、123 を指定してmarketIfTouchedで注文した場合、価格が123まで上昇した時点で成行きで発注が行われます。
    • 指値/逆指値と違って、現在価格が発注条件となる価格を満たしていても、即時約定はしません。
      • 例えば、現在価格 122.8 で、123 でを指定してmarketIfTouchedで買注文を行っても即時には約定しません。 (limitだと、123は現在価格より既に高い価格なので、発注と同時に約定してしまいます。)
  • トレールストップなど、建玉の決済条件は注文方法とは別に指定できるようになっています。

    • 指定できる条件は以下の3つです。
      • 利益確定価格(takeProfit)
      • 損切価格(stopLoss)、
      • トレールストップのpip数(trailingStop))
    • これらの決済条件は、注文方法(成行、指値..etc..)を問わず指定可能です。
  • なお、OCOのような両建ての注文方法はありません。

注文のレスポンスに含まれる、tradeOpened、tradesClosed、tradeReduced, orderOpened の違い

注文(order)の結果に応じて、これらのレスポンスの内容が変わります。

  • 注文が約定しなかった場合、新規注文が作成され、 orderOpened で注文の情報が返されます。
    • 成行き以外の指値や逆指値注文では、一般に即時には約定しないので、orderOpenedが返されます。
    • 成行注文の場合、即時約定するのでorderOpenedが返されることはありません (ちなみに、週末など市場が閉じている場合は、403 応答になります。)
  • 注文が約定し、新しい建玉ができた場合、 tradeOpened で作成された建玉の情報が返されます。
  • 注文が約定し、既存の建玉が決済された場合、 全決済された建玉が tradesClosed、部分決済された建玉が tradeReduced で返されます。
    • 例: EURJPY/3/売 の建玉を3つ所有した状態で、成行でEURJPY/7/買の注文を行うと、EURJPY/3/売の2つが全決済され、残りの1つが部分決済されます。
    • 複数まとめて決済される場合があるので、tradesClosedは配列になっています。ご注意。

f:id:unageanu:20150629170743p:plain

tradeOpened、tradesClosed、tradeReduced のidは建玉(trade)のID

細かい話ですが、注文のレスポンス tradeOpened、tradesClosed、tradeReduced のidは建玉(trade)のIDになっています。 ちょっと紛らわしいので、念のため。

追記(2015-12-01)

OANDA FX trade APIを利用した、無料のFXシステムトレードフレームワーク「Jiji」をリリースしました!

jiji2.unageanu.net

使ってみて、ご意見など頂けるとうれしいです。

OANDA fx Trade API を使って、リアルタイムな為替レートを取得してみる

今さらですが、OANDA Japan から FXトレードAPI が提供されているのを発見。

www.oanda.jp

  • レート情報の取得から、取引、建玉情報の取得などのFX 取引に必要なAPI一式が提供されています。
  • 初期費用、月額利用料金は無料。ただし、口座残高が25万円以上必要です。
  • 本物の口座を使うLive環境のほか、デモ口座のアカウントで使える Practice、アカウントなしで試せるSandbox環境も提供。
  • REST APIの他、Java/FIX版のAPIも有り。


機能もかなり充実してます。本格的なトレードアプリも作れるんじゃないかな。

  • REST APIだけど、ストリーミングでのレートデータ配信に対応
    • Transfer-Encoding: chunked で配信する仕組みで、ポーリングなしでリアルタイムなレートデータを取得できます。
  • OAuth 2.0での認証に対応
    • サードパーティのサービスに、アカウント/パスワードを渡すことなくREST APIへのアクセストークンを安全に渡すことが可能。
    • なので、クラウド型のWebサービスも作ったりしやすいかと。
    • ただし、APIから取得した情報の再配信は禁止されているのでご注意。
  • すべてのGET APIが ETag に対応しているなど、細かいところの完成度も高い。

ということで、Rubyを使ってREST APIにアクセスし、リアルタイムな為替レートを取得してみるサンプルを書いてみました。(といっても、公開されているアクセスライブラリのサンプルを動かしてみただけですが・・・)

アクセスライブラリのインストール

RubyだとREST APIのアクセスライブラリが公開されているので、これを利用します。 gemでインストール。

$ gem install oanda_api

デモ口座のアカウントを使って、現在価格を得るサンプルコードです。 「<アクセストークン>」のところには、OANDAのサイトから取得したアクセストークンを指定します。取得方法はこちら。

require 'oanda_api'

client = OandaAPI::Client::TokenClient.new(:practice, <アクセストークン>)

prices = client.prices(instruments: ['EUR_USD','USD_JPY']).get
prices.each do |p|
  puts "#{p.instrument} #{p.ask} #{p.bid} #{p.time}"
end

実行結果です。

$ retrieve_price.rb
EUR_USD 1.1201 1.11994 2015-05-11 00:22:16 UTC
USD_JPY 119.744 119.728 2015-05-11 00:21:43 UTC

せっかくなので、ストリーミングAPIでリアルタイムなレート情報の取得もやってみます。

require 'oanda_api'

access_token =  <アクセストークン>

# アカウントのIDが必要なので取得しておく。
client = OandaAPI::Client::TokenClient.new(:practice, access_token )
account =  client.accounts.get.first

# ストリーミングAPI用のクライアントを別途作成し、実行
streaming_client = OandaAPI::Streaming::Client.new(:practice, access_token )
prices = streaming_client.prices(account_id: account.account_id, instruments: ["USD_JPY"])
prices.stream do |p|
  # ※無限ループするので Ctrl+Cで停止すること。
  puts "#{p.instrument} #{p.ask} #{p.bid} #{p.time}"
end 

実行してみます。放置するとずっと更新を続けるので、Ctrl+Cで停止すること。

$ ruby retrieve_price_uses_streaming_api.rb
USD_JPY 119.747 119.743 2015-05-11 00:37:52 UTC
USD_JPY 119.748 119.744 2015-05-11 00:38:12 UTC
USD_JPY 119.749 119.745 2015-05-11 00:38:12 UTC
USD_JPY 119.75 119.746 2015-05-11 00:38:12 UTC
...

Jiji2のバックエンドもこれに移行かな

Jiji2絶賛開発中ですが、

unageanu.hatenablog.com

github.com

バックエンドは OANDA fx trade API に変更かな、と考えています。 旧バージョンと同じくスクレイピングを使う方向で考えていましたが、次のようなリスクはどうしても残るので。

  • (アクセス頻度はもちろん抑えるにしても)やはり証券会社のサービスに多少は負荷がかかるので、利用禁止になる可能性がある。
  • サイトの仕様変更で突然動作しなくなるリスクがある。

アプリ開発者としては、特定の証券会社にロックオンしてしまうのは避けたいところではあるので、このようなAPIを提供してくれる証券会社がもっと増えてくるといいな。(クリック証券、何でやめたんや・・・。)

追記(2015-12-01)

OANDA FX trade APIを利用した、無料のFXシステムトレードフレームワーク「Jiji」をリリースしました!

jiji2.unageanu.net

使ってみて、ご意見など頂けるとうれしいです。

jiji2の画面スケッチを3つほど。

追記(2015-12-01):

FXシステムトレードフレームワーク「Jiji」、リリースしました!

jiji2.unageanu.net

使ってみて、ご意見など頂けるとうれしいです。



jiji2の画面スケッチを少し作ったので、公開します。

  • ホーム画面、ナビを開いたところ、チャートの3つ。
  • 表示するデータや機能をざっくりと並べてみました。
  • アイコンなど、細かいデザインの詰めはまだです。

フィードバックとかいただけるとうれしいです。

ホーム

アプリ起動直後に表示する画面。

f:id:unageanu:20150428134409p:plain

  • 損益状況、エージェントからの通知を、ファーストビューでさっと確認。
  • ミニチャートで、現在のレートと直近の値動きを確認できる。
    • 「取引」ボタンから、取引を行うことも可能。
  • ミニチャートの下には、建玉一覧、バックテスト一覧のサマリを表示。
  • 各カードをタップすると、詳細が見える
    • 例) ミニチャートをタップすると、チャート画面に移動して詳しいチャートが確認できるイメージ

ナビ

ナビを開いたところ。

f:id:unageanu:20150428134522p:plain

  • バックテスト一覧やエージェントエディタなどの機能は、ナビからアクセスする。

チャート

ローソク足チャート。

f:id:unageanu:20150428134556p:plain

  • レートの動きと、エージェントが出力したグラフ(移動平均, RSI ..etc..)を表示。
    • 移動平均はチャートと重ねて表示。RSIはレートの下の部分に別枠で表示。
    • 通貨ペア、集計期間(10分足,1時間足 ,,et,,)は、上部のメニューから変更できる。
  • レートの下部には、売り買いした建玉の情報も表示。
    • 値動きに対して、売り買いのタイミングが妥当かどうか確認できる。
    • 緑が買、赤が売。●のタイミンクでエントリーして、〇で決済したことを示す。
  • 値動き/現在価格をみながら、右下の「+」ボタンから、売り買いもできる。
  • 下のスライダーで、表示する期間を変更できる。
    • チャート部分を左右にドラッグしてもOK

作っていく過程で変わるところも多々あるとは思いますが、とりあえずはこれをゴールに実装進めます。 他の画面の絵も作っておきたいところだけど、現状の3枚で「ほんまこれ実装できんの」感が半端ない・・・。絵に描いた餅にならないよう、実装も並行して進める方がいいかなと思ってます。まずはチャートかな。

jiji2の画面一覧(案)をまとめてみた

追記(2015-12-01):

FXシステムトレードフレームワーク「Jiji」、リリースしました!

jiji2.unageanu.net

使ってみて、ご意見など頂けるとうれしいです。



検討段階ですが、jiji2の画面と機能概要をざっくりとまとめてみました。

f:id:unageanu:20150331103430p:plain

  • 基本的な機能は、PCとスマホで同じに。
    • レスポンシブにして、PCでもスマホでも大体同じ機能が使えるようにしたい。
      • エージェントの作成・編集はPCがメイン。一応スマホでもできるようにしておく。
      • バックテストの実行や分析も同じ。
    • ↑は、スマホで見た場合の画面+機能案。
      • PCだと画面が広いので、一覧と詳細は同じ画面にしたりはするかも。

  • メイン画面は、「ホーム」「バックテスト」「エージェント」「設定」の4つ
    • これらをナビで切り替えながら使う形。

旧バージョンとの違いは次の2つ。

  • ホーム画面を新設。

    • 最初に表示されるビュー。
    • ダッシュボート的な感じで、資産状況などが最初の一画面でざっくり把握できるようにする。
    • ダッシュボートのパネルをタップすると、詳細を確認できる。

  • プライスボード && 価格一覧からの裁量取引もできるようにする

    • 通貨ペアごとの現在価格を一覧表示するプライスボードを追加。
    • ここから、成行での取引もできるようにする。
      • 「指標のPush通知で裁量トレード」を行うときに使う。
      • 通知からシームレスに取引できるようにするのが狙いなので、指値/逆指値/OCOでの取引はサポートしない。 (やりたい場合は証券会社が提供しているツールで。)

エージェントを作る → バックテストで検証 → 運用 あたりの画面フローは旧バージョンと同じでいいかな。

ユースケース

1.完全自動でのシステムトレード

  1. エージェントエディタからエージェントを作る。

    • PCからの作成がメイン(画面が広くてキーボードが使えるので)
    • ひな形のエージェントがあり、コピペして編集する形で簡単にロジックを組める。
    • 移動平均線など主要な指標も組み込みのライブラリとし提供されていて、簡単に組み込める。

  2. エージェントができたら、バックテストで検証。

    • 期間を指定して、本番と同様のデータ(tick)で動作を確認できる。
    • テストが完了したら、収益や勝率、プロフィトァクターなどがレポートされ、成績を評価できる。
    • 取引や約定のタイミングがチャート上に表示され、タイミングが妥当だったか確認できる。
    • 移動平均線など、エージェントが使用した指標をチャート上に出力して確認できる。

  3. 満足な結果が出たら、実際に運用してみる。

    • デモ取引での利用に対応しているので、まずはデモ取引口座で気軽にお試しできる。
    • 約定や決済は、随時スマホにPush通知される。
    • 通知をタップするとjijiが起動し、ホーム画面から現在の損益やチャート、ポジジョン一覧を確認できる。

2.指標のPush通知で裁量トレード

  1. エージェントプログラムがレートを監視。
  2. 移動平均線のゴールデンクロスなど、取引のチャンスが来たら、通知がスマホに届く。
  3. 通知をタップすると、アプリが起動。
    • ホーム画面で、チャートと現在価格をチェック。
  4. 価格を確認し、取引するか判断。OKならプライスボードから取引を実行する。
  5. 取引が成立したら、ポジション一覧に反映される。
    • 以降の損益推移はここから確認できる。
    • 決済も可能。

3.ロスカットをシステム化して徹底

  1. チャートやレートを見ながら、裁量で取引する。
    • エージェントでチャート上にグラフを描くことができるので、移動平均など好みの指標をみながらタイミングを判断できる。
    • jijiのプライスボードから発注する他、使い慣れた証券会社のツールを使っても取引できる。
    • 他のツールで行った取引も、jijiに反映され、管理できる。
  2. エージェントのポジションを監視。プログラムされたルールに従って、 一定の損失となった時点で自動で決済される。
  3. 決済が行われると、結果がスマホに通知される。
  4. 通知をタップすると、ポジションの詳細な情報(損益、通貨ペア、約定日時、決済日時 ..etc..)を確認できる。

4.承認制システムトレード

  1. エージェント追加時に、「承認制にする」をチェックすると、承認制モードになる。
    • 実運用のほか、バックテストでも同様に選べて試せる。
  2. 承認制エージェントが取引を行うと、スマホにPush通知が届く。
  3. 通知を確認して、OKなら「承認」を実行。
  4. 承認を受けて、エージェントが取引を実行する。

5. トレンドにあわせて、複数のシステムを用意して切り替え

  1. 上昇トレンド・ボックスなどのトレンドごとに、エージェントの成績を確認しておく。
    • バックテストを利用して把握しておく。成績はレポートで残しておける。
  2. 取引するエージェントのほかに、トレンドの変化をチェックするエージェントも作る。
    • 取引は行わず、好みの指標を監視してトレンドの変化を追う。
    • 変化があったら、通知のみ行う。
  3. 取引用エージェントとトレンドチェックエージェントの両方を実行。
    • トレンドチェックエージェントからの通知をチェックしてエージェントを切り替えて運用する。
    • 運用するエージェントの切り替えも、スマホからリアルタイムにできる。

FX自動取引システム「jiji」のバージョンアップ構想

追記(2015-12-01):

FXシステムトレードフレームワーク「Jiji」の新バージョンをリリースしました!

jiji2.unageanu.net

使ってみて、ご意見など頂けるとうれしいです。



ContainerJSのメンテがひと段落したところで、次は jijiです。 初版をリリースしてから6年近く。いい加減 ruby2.x には対応しないとなー、今作るならこんな風にするかなー、というネタも入れて構想をまとめてみました。

こんな機能も欲しいとかあれば、コメントなどでご意見いただければ嬉しいです。 すでに少し実装しているので、反響があったらGitHubにPushするよ!!

スマホ対応と、エージェントとのインタラクション

  • スマホに対応。モバイルファーストに。

    • 外出先でも、スマホから手軽に取引状況をチェックできるようにする。
    • バックテストの開始やテスト結果の確認もスマホから空き時間にできるようにしたい。

  • エージェントとのインタラクションに対応する

    • スマホ時代になって、「システムからの通知をリアルタイムに受け取ってアクションを返す」ことが現実的にできるようになってきた。
    • jijiのエージェントにも、エージェントから通知を送ったり、命令を受け付ける仕組みを用意して、 プログラムによる完全自動取引に加えて、「裁量での取引をプログラムがアシストする」形のシステムも作れるようにしたい。
    • 具体的には、以下のような使い方ができるかと。

    • 1. 指標のPush通知で裁量トレード

      • カスタマイズ可能な汎用指標通知システムとして使うモデル。
      • エージェントで指標を監視して、取引のタイミングでPush通知を送る
      • 通知を受けて、人が判断して取引を実行

        f:id:unageanu:20150319164251p:plain
    • 2. ロスカットをシステム化して徹底

      • 裁量でトレードするけど、ポジションの管理とロスカットはシステムで強制的に実行
      • どうしてもロスカットできないあなたに

        f:id:unageanu:20150319164252p:plain
    • 3. 承認制システムトレード

      • エージェントが自動で取引をおこない、ポジションを持つ前に利用者に承認を得るモデル
      • 試験運転期間や、ダマシに弱いシステムを運用するときも安心

        f:id:unageanu:20150319164253p:plain
    • 4. トレンドにあわせて複数のシステムを用意して切り替え

      • あらゆるトレンドに動的に対応するシステムを作るのは難しいので、トレンドごとにシステムを用意
      • スマホからトレンドの変化を判断し、リアルタイムに切り替えて運用する

        f:id:unageanu:20150319164254p:plain
    • 5. 完全自動でのシステムトレード

クラウド運用のサポート

  • Heroku/AWSでの運用に対応して、運用コストを下げる。

    • 現行版は自宅サーバーでの利用を想定していたけど、セキュリティとかプロバイダの制約が厳しくなってきている感がある。
    • 逆に、HerokuやAWSなどのクラウド環境は、ここ数年で一気に進歩して、個人でも利用しやすくなってきた。
    • 自動取引システムだと、性能はでなくてもいいけど可用性は担保したい。なので、クラウド運用は向いていると思う。
      • 1サーバーあたりの利用人数は多くないので、性能はでなくてもOK
      • ただし、可用性は担保したい(ネットワーク断線とか停電によるサーバー停止は痛い)
    • 可用性を高めるため、プロバイダ2重契約してバックアップ回線を確保したり、UPS買ったりするよりコストは下げられるはず。
    • あとは、MT使ってる人だとWindowsVPS借りて運用というのは聞きますね。それと比べても安くできる見込み。

  • 無料枠でもそこそこ動くようにして、導入の敷居も低く。

    • Heroku なら1クリックデプロイができるので、インストールも簡単にできると期待。
    • AWS は Docker コンテナを用意すれば簡単かな?

複数ノードでのバックテスト実行

  • クラウドでちよっと心配なのはバックテスト。あれサーバーリソース喰うんですよね・・。 あと、無料枠だとストレージ容量が制限されるので、バックテスト用にレート情報を何年も残しておくのも厳しい。
  • ということで、 バックテストは別ノードで実行できる仕組み をいれたい。以下のような感じ。
    • 1.連続稼働が必要な実取引はクラウドサーバーで運用
    • 2.クラウドで収集したデータを、自宅サーバーのバックテストノードに定期的に同期
    • 3.同期したデータを使ってバックテストを実施
  • バックテストノードは、可用性低くていい & 安いストレージが使いたいので、自宅サーバーを想定。
    • もちろん、クラウドでも使えるようにする。

f:id:unageanu:20150319150921p:plain

  • ただ、これ、実装はかなり大変な気が・・・・。

WebインターフェイスをREST に変更

  • 時代の流れに従い、JSON-RPCはやめる。
  • 仕様も公開して、汎用のレート情報収集サーバーとしても使えるようにしたい。

その他、技術的なこと

  • ruby2.x で動作するようにする

    • これはさすがにやらないとヤバい。
  • データストレージをDBに

    • 導入のしやすさから旧バージョンはcsvにしたけど、ストレージ容量を食い過ぎ。(実装が富豪なのもあるけど)
    • herokuで使うならDBはMongoDBをあたりかな。
      • herokuで使えるデータストレージのうち、無料で使える容量が一番大きいので。
      • PostgreSQLも使えるけど、10,000行じゃさすがに足りないですからね。
  • チャートでFlash使ってるのも何とかしないと

  • クラウドに置くなら、認証の仕組みとかもいるかなー。

妄想は膨らむばかりです。

クリック証券デモ取引のURL変更に対応したclickclient_scrapをリリース

遅くなりましたが、TAKAさんよりご報告いただいた「クリック証券デモ取引でエラーになる」件を修正した clickclient_scrap 0.1.12 をリリースしました。

Github - unageanu / clickclient_scrap
RubyGems.org - clickclient_scrap

変更点

  • クリック証券デモ取引でエラーになる問題を修正。
    • ログイン画面のURLが変更になっていたようなので修正しました。

更新手順

以下の操作を実行してください。

$ gem update clickclient_scrap