OANDA用設定ファイルの作成 (2017/05/10)

OANDA用の設定ファイルを作成する。設定は毎回、コマンド入力してもいいのだが、それでは面倒臭い。そこで毎回使う設定はファイルに記述しておく。

①以下の設定を「settings.ini」ファイルとして「~/py」フォルダーに保存する。

[DEFAULT]
environment = practice
account_id = 1234567
access_token = 1234567890123456789012345678901-2345678901234567890123456789012
fromaddr = abcd@yahoo.co.jp
password = 12345678
toaddr =abcd@example.com
folder_ea = .wine/drive_c/"Program Files (x86)"/"OANDA - MetaTrader"/mql4/Files

②自分の環境に合わせて設定内容を変更し、保存する。

  • environment: 口座の種類を設定するもので、デモ口座の場合は「practice」と入力する。
  • account_id: 「OANDA REST APIの準備」でメモしたアカウントIDを入力する。
  • access_token: 同じく「OANDA REST APIの準備」でメモしたアクセストークンを入力する。
  • fromaddr: 送信元メールアドレスを入力する。戦略のシグナルをメールで送信したい場合、このアドレスで送信する。また、ここではyahooメールを利用することとする。
  • password: 送信元メールアドレスのパスワードを入力する。
  • toaddr: 送信先メールアドレスを入力する。戦略のシグナルをメールで受信したい場合、このアドレスで受信する。これはどこのメールでも構わない。
  • folder_ea: MT4の「Files」フォルダーのパスを入力する。パスはMT4のインストール先によって設定例と違う場合もある。これは戦略のシグナルをEAに送信し、EAで執行したい場合に使う。

FXシステムのダウンロード (2017/04/13)

ここで言う「FXシステム」とは私が作成した「forex_system.py」ファイルのことである。

以下のコマンドを実行して「forex_system.py」ファイルを「~/py」フォルダーにダウンロードする。

$ wget -P ~/py https://raw.githubusercontent.com/fxst24/fxst24/master/forex_system/forex_system.py

ランダムウォーク・データの作成 (2017/04/11)

ランダムウォークのデータを作成する。作成にあたってはUSDJPYのデータの日時を利用しているので、あらかじめ「ヒストリカルデータの加工」でデータを作成しておく必要がある。

import forex_system as fs
fs.get_randomwalk_data()

開始日と終了日はUSDJPYと同じになるので指定する必要はない。作成される足の種類もUSDJPYと同じである。

デフォルトの設定では1分足の単位で平均=0.0、標準偏差=0.01 / sqrt(1440)、歪度=0.0の正規分布に従うランダムウォークのデータが作成される。日足での標準偏差が0.01(1%)となるイメージである。

デフォルトとは違う設定で作成したい場合は以下のようにする。

import forex_system as fs
fs.get_randomwalk_data(mean=-0.00001, std=0.0005, skew=1.0)

この場合、平均=-0.00001、標準偏差=0.0005、歪度=1.0の非正規分布に従うランダムウォークのデータが作成される。歪度が0ではないのでランダムウォークと呼ぶのは正しくないかもしれないが、ここではランダムウォークとして扱う。

FXシステムの使い方(トレード) (2014/04/11)

FXシステムを用いたトレードのやり方について簡単に説明する。

例として「~/py/sample_strategy.py」というファイルに戦略(トレードルール)が書かれているとする。通貨ペアはUSDJPY、足の種類は5分足とする。

ライブ口座で絶対に使用してはならない

初めに断っておくが、ライブ口座では絶対に使用してはならない。トレード機能は試験的なものである。トレード中に起こりうる様々な障害に対し、必ずしも対応していない。

実際、サーバー側で障害が起きたときなどにエラーとなって、そのまま復帰できないことがある。その頻度は数日に1回程度はある。したがって、安心して資金を預けられるようなレベルのものではない。

私自身はデモ口座で稼働し、シグナルをメールで送信させ、それを参考に手動でトレードしている。

トレード

$ python ~/py/sample_strategy.py --mode trade --symbol USDJPY --timeframe 5

トレードはバックテストのときとは違って端末を使う。SpyderやJupyderからでも実行できるが、途中で止まってしまうことがある。

トレードの場合、「--mode trade」と設定する。スプレッドや検証期間は必要ないので設定しない。

デフォルトの設定ではロット数は0.1、損切り、利食いはしない、となっている。変更したい場合は「--lots 1.0」、「--sl 5.0」、「--tp 5.0」などのようにする。損切り、利食いの単位はpipsである。

また、やはりデフォルトの設定ではメール通知あり、MT4への通知なしとなっている。変更したい場合は「--mail 0」(メール通知なし)、「--mt4 1」(MT4への通知あり)とする。

メールで通知する設定にした場合、買いエントリー、買いエグジット、売りエントリー、売りエグジットが発生したタイミングで指定したメールアドレスにメールが送信される。その場合、件名は戦略名となっており、本文は「[通貨ペア]を[レート]で買い(売り)エントリー(エグジット)です。」となっている。

MT4へ通知する設定にした場合、MT4の「MQL4/Files」フォルダーに戦略名と同じ名前のcsvファイルを作成し、シグナルを書き込む。シグナルは売りの場合は「1」、ノーポジションの場合は「2」、買いの場合は「3」が書き込まれる。

初めは-1、0、1のようにするつもりであった。だが、シグナルが書き込まれると同時にMT4のEAがそれを読み込もうとした場合、EAは読み込めずにすべて「0」と判断してしまうようだ。

「0」をノーポジションに設定すると、EAは間違えて保有しているポジションを決済してしまう。そういうこともあって、それぞれに2を加えて0を使わないようにした。

出力は「年.月.日 時:分:秒 戦略 通貨ペア 足の種類 シグナル」となっている。

「シグナル」は売りなら「-1」、ノーポジションなら「0」、買いなら「1」と表示される。単にシグナルがそうなっている、というだけであって、実際のポジション状況を反映しているわけではない。

トレードを終了する場合は単に端末を閉じればいい。

FXシステムの使い方(バックテスト) (2017/04/11)

FXシステムを使ったバックテストのやり方などを簡単に説明する。

例として「~/py/sample_strategy.py」というファイルに戦略(トレードルール)が書かれているとする。通貨ペアはUSDJPY、足の種類は5分足、スプレッドは0.4、検証期間は2016年1月1日から2017年1月1日までとする。

バックテスト(最適化なし)

以下のコマンドを実行して最適化なしのバックテストを行う。

%run ~/py/sample_strategy.py --mode backtest --symbol USDJPY --timeframe 5 --spread 0.4 --start 2016.01.01 --end 2017.01.01

通貨ペアは

AUDCAD AUDCHF AUDJPY AUDNZD AUDUSD CADCHF CADJPY
CHFJPY EURAUD EURCAD EURCHF EURGBP EURJPY EURNZD
EURUSD GBPAUD GBPCAD GBPCHF GBPJPY GBPNZD GBPUSD
NZDCAD NZDCHF NZDJPY NZDUSD USDCAD USDCHF USDJPY

の28通貨ペアの中から選ぶ。もちろん、ヒストリカルデータを準備していることが前提である。

足の種類は分単位で

  1    2    3    4    5
  6   10   12   15   20
 30   60  120  180  240
360  480  720 1440

の中から選ぶ。

バックテスト(最適化あり)

以下のコマンドを実行して最適化ありのバックテストを行う。

%run ~/py/sample_strategy.py --mode backtest --symbol USDJPY --timeframe 5 --spread 0.4 --start 2016.01.01 --end 2017.01.01 --optimization 1

「--optimization 1」を加えると最適化ありのバックテストになる。

最適化の基準はシャープレシオである。なお、デフォルトの設定(変更可能)として最低トレード数は260となっており、トレード数が1年当たり260回以下のシャープレシオは無視される。サンプル数の少ない結果を排除するためである。変更したい場合は「--min_trade 130」のようにする。

ウォークフォワードテスト(通常)

以下のコマンドを実行して通常のウォークフォワードテストを行う。

%run ~/py/sample_strategy.py --mode backtest --symbol USDJPY --timeframe 5 --spread 0.4 --start 2015.01.01 --end 2017.01.01 --optimization 2

「--optimization 2」を加えると通常のウォークフォワードテストになる。

なお、上の例では検証期間を2015年1月1日からにしている。前倒ししたのはインサンプル期間として使いたいからである。デフォルトの設定(変更可能)としてインサンプル期間を360日、アウトオブサンプル期間を30日としている。変更したい場合は「--in_sample_period 15」、「--out_of_sample_period 180」のようにする。

最低トレード数の設定は最適化ありのバックテストと同じである。

ウォークフォワードテスト(機会学習)

以下のコマンドを実行して機械学習を用いたウォークフォワードテストを行う。

%run ~/py/sample_strategy.py --mode backtest --symbol USDJPY --timeframe 5 --spread 0.4 --start 2015.01.01 --end 2017.01.01 --optimization 2

「--optimization 3」を加えると機械学習を用いたウォークフォワードテストになる。

基本的に通常のウォークフォワードテストと同じだが、違うのはインサンプル期間でモデル作成、アウトオブサンプル期間でバックテストとしている点である。

最適化は行わない。モデル作成自体が最適化のようなものだからである。このため、最低トレード数の設定もない。