ランダムウォーク・データの作成

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

In [1]:
%run -t ~/py/make_randomwalk_data.py

IPython CPU timings (estimated):
  User   :     120.23 s.
  System :       5.85 s.
Wall time:     129.34 s.

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

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

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

In [2]:
%run -t ~/py/make_randomwalk_data.py --mean -0.00001 --std 0.0005 --skew 1.0

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

(2017/03/17更新)

FXシステムの使い方(トレード)

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

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

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

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

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

単一戦略の場合

「トレード戦略」カテゴリの「基本的な平均回帰戦略」にある「basic_mean_reversion」という戦略を用いた場合には以下のようにする。

$ python ~/py/trade.py --ea1 basic_mean_reversion --symbol1 USDJPY --timeframe1 5 --mail 1 --mt4 0
2017.03.05 14:17:15 basic_mean_reversion USDJPY 5 0
2017.03.05 14:17:16 basic_mean_reversion USDJPY 5 0
2017.03.05 14:17:17 basic_mean_reversion USDJPY 5 0
2017.03.05 14:17:18 basic_mean_reversion USDJPY 5 0
2017.03.05 14:17:19 basic_mean_reversion USDJPY 5 0
2017.03.05 14:17:20 basic_mean_reversion USDJPY 5 0
2017.03.05 14:17:21 basic_mean_reversion USDJPY 5 0
2017.03.05 14:17:22 basic_mean_reversion USDJPY 5 0
2017.03.05 14:17:23 basic_mean_reversion USDJPY 5 0
2017.03.05 14:17:24 basic_mean_reversion USDJPY 5 0


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

トレードでは「~/py/trade.py」ファイルを使う。

「--ea1」で1個目の戦略を指定する。戦略を記述したファイル名から「.py」を除いた部分が戦略名となる。また、最大5個の戦略を同時にトレードできる。

「--symbol1」で1個目の戦略でトレードする通貨ペアを指定する。

「--timeframe1」で1個目の戦略で使用する足の種類を指定する。足の種類は分単位である。例えば1時間足なら「60」、日足なら「1440」と指定する。バックテストのときとは違い、複数の戦略で別々の足を使うことができる。

「--mail」でシグナルの発生をメールで通知するかどうかを指定する。「0」で通知しない、「1」で通知するとなる。複数の戦略で共通である。

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

「--mt4」でシグナルをMT4のEAに送信するかどうかを指定する。「0」で送信しない、「1」で送信するとなる。複数の戦略で共通である。

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

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

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

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

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

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

複数戦略の場合

上の単一戦略にもう1つ戦略を加えた場合は以下のようにする。

$ python ~/py/trade.py --ea1 basic_mean_reversion --symbol1 USDJPY --timeframe1 5 --ea2 basic_mean_reversion --symbol2 EURUSD --timeframe2 5 --mail 1 --mt4 0
2017.03.05 14:19:02 basic_mean_reversion USDJPY 5 0
2017.03.05 14:19:03 basic_mean_reversion USDJPY 5 0
2017.03.05 14:19:03 basic_mean_reversion USDJPY 5 0
2017.03.05 14:19:08 basic_mean_reversion EURUSD 5 0
2017.03.05 14:19:09 basic_mean_reversion EURUSD 5 0
2017.03.05 14:19:09 basic_mean_reversion EURUSD 5 0
2017.03.05 14:19:10 basic_mean_reversion USDJPY 5 0
2017.03.05 14:19:11 basic_mean_reversion USDJPY 5 0
2017.03.05 14:19:11 basic_mean_reversion USDJPY 5 0
2017.03.05 14:19:12 basic_mean_reversion EURUSD 5 0


上の例のように同じ戦略を別々の通貨ペアに適用してもいい。もちろん、別々の戦略を同じ通貨ペアに適用してもいいし、別々の戦略を別々の通貨ペアに適用してもいい。

他は単一戦略の場合と同様である。

(2017/03/05更新)

FXシステムの使い方(バックテスト)

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

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

最適化なしのバックテストを行う場合のコマンドの書式は以下の通りである。

%run ~/py/backtest.py --ea1 戦略 --symbol1 通貨ペア --spread1 スプレッド --timeframe 足の種類 --start 開始日 --end 終了日

バックテストでは「~/py/backtest.py」ファイルを使う。

「--ea1」で1個目の戦略を設定することになる。最大5個の戦略を同時にバックテストできる。例えば、2つの戦略を同時にバックテストする場合は

%run ~/py/backtest.py --ea1 戦略 --symbol1 通貨ペア --spread1 スプレッド --ea2 戦略 --symbol2 通貨ペア --spread2 スプレッド --timeframe 足の種類 --start 開始日 --end 終了日

のようにする。ただし、足と日付をそろえてバックテストするので、「足の種類」、「開始日」、「終了日」は1つしか設定しない。

「戦略」には戦略プログラムのファイル名(拡張子は不要)を入れる。ファイルはFXシステムと同じフォルダー(ここでは「~/py」フォルダー)に置く必要がある。

「通貨ペア」は

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

の中から選ぶ。

「開始日」は「yyyy.MM.dd」の形式で入力する。

「終了日」も同様である。

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

最適化ありのバックテストを行う場合のコマンドの書式は以下の通りである。

%run ~/py/backtest.py --ea1 戦略 --symbol1 通貨ペア --spread1 スプレッド --timeframe 足の種類 --start 開始日 --end 終了日 --optimization 最適化の設定

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

最適化ありのバックテストも最大5個の戦略を同時に実行できる。例えば、2つの戦略を同時にバックテストする場合は

%run ~/py/backtest.py --ea1 戦略 --symbol1 通貨ペア --spread1 スプレッド --ea2 戦略 --symbol2 通貨ペア --spread2 スプレッド --timeframe 足の種類 --start 開始日 --end 終了日 --optimization 1

のようにする。

「最適化の設定」は

0: 最適化なしのバックテスト
1: 最適化ありのバックテスト
2: ウォークフォワードテスト
3: 機械学習を用いたバックウォークテスト

となっている。デフォルトは「0」なので、省略した場合は最適化なしとなる。ここでは最適化ありのバックテストなので、「1」を設定する。「最適化の設定」は1つしか設定しない。

ウォークフォワードテスト

ウォークフォワードテストを行う場合のコマンドの書式は最適化ありのバックテストと同じである。ただ、「最適化の設定」には「2」を設定する。

ウォークフォワードテストも最大5個の戦略を同時に実行できる。

デフォルトの設定(変更可能)としてインサンプル期間を360日、アウトオブサンプル期間を30日としている。

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

機械学習を用いたバックテスト

最後に機械学習を用いたバックテストだが、これは機械学習用に作成した戦略に使う必要があるので、ここでは簡単に説明する。

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

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

機械学習を用いたバックテストを行うには「最適化の設定」に「3」を設定する。

やはり最大5個の戦略を同時に実行できる。

ポートフォリオの設定

複数の戦略でバックテストを行った場合、それぞれの戦略のリターンに対してウェイトが乗じてある。ウェイトの合計は1.0である。デフォルトの設定では等ウェイトとなっている。例えば2つの戦略でバックテストした場合、等ウェイトではそれぞれのリターンに0.5を乗じた上で合計している。つまりリターンの単純平均である。

効率的フロンティアによるウェイト配分を行うこともでき、その場合はコマンドに「--portfolio 1」を加える。この場合はシャープレシオを最大化するようなウェイト配分で、リターンの加重平均となる。

ウォークフォワードテスト、機械学習を用いたバックテストではウェイト配分はインサンプル期間のリターンに基づく。このため、アウトオブサンプル期間のシャープレシオが等ウェイトより劣化することもありうる。

(2017/02/27更新)

Pythonのインストール

Ubuntuには初めからPythonがインストールされている。しかし、ここではAnacondaをインストールして、その中のPythonを使うことにする。いくつかのライブラリはAnacondaからのほうが導入が楽だからである。

Anacondaのインストール

①以下のアドレスをクリックする。

https://www.continuum.io/downloads#linux

②「Anaconda 4.3.1 For Linux」で「Python 3.6 version」の「64-BIT INSTALLER (474M)」ボタンをクリックする。

③「Anaconda3-4.3.1-Linux-x86_64.sh を開く」で「ファイルを保存する」を選択する。

④「OK」ボタンをクリックする。

ファイルは「~/ダウンロード」フォルダーに保存される。

⑤「THANK YOU FOR DOWNLOADING ANACONDA!」という表示が出たら、「×」ボタンをクリックして閉じる。

⑥端末で以下を実行する。

$ bash ~/ダウンロード/Anaconda3-4.3.1-Linux-x86_64.sh ⏎


⑦「Please answer 'yes' or 'no':」と表示されるまで「Enter」キーを押し続ける。

Welcome to Anaconda3 4.3.1 (by Continuum Analytics, Inc.)

In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
>>> ⏎


⑧端末で以下を実行する。

Please answer 'yes' or 'no':
>>> yes ⏎


⑨端末で以下を実行する。

Anaconda3 will now be installed into this location:
/home/****/anaconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

[/home/****/anaconda3] >>> ⏎


⑩端末で以下を実行する。

Do you wish the installer to prepend the Anaconda3 install location
to PATH in your /home/****/.bashrc ? [yes|no]
[no] >>> yes ⏎


⑪端末を再起動して設定を反映させる。

Anacondaのアップデート

①端末で以下を実行する。

$ conda update conda ⏎


②端末で以下を実行する(アップデートがある場合のみ)。

Proceed ([y]/n)? ⏎


③端末で以下を実行する。

$ conda update anaconda ⏎


④端末で以下を実行する(アップデートがある場合のみ)。

Proceed ([y]/n)? ⏎


⑤端末で以下を実行する。

$ conda update --all ⏎


⑥端末で以下を実行する(アップデートがある場合のみ)。

Proceed ([y]/n)? ⏎


ライブラリのインストール

Anacondaにデフォルトでは含まれていないが、使うことのあるライブラリをインストールする。

OANDA API

○端末で以下を実行する。

$ pip install git+https://github.com/oanda/oandapy.git ⏎


TensorFlow

ここではPython 3.6対応、CPUのみのバージョンをインストールする。

①端末で以下を実行する。

$ pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.0.1-cp36-cp36m-linux_x86_64.whl ⏎


②端末で以下を実行する(アップデートがある場合のみ)。

Proceed ([y]/n)? ⏎


CVXOPT

①端末で以下を実行する。

$ conda install cvxopt ⏎


②端末で以下を実行する(アップデートがある場合のみ)。

Proceed ([y]/n)? ⏎


pandas-datareader

①端末で以下を実行する。

$ conda install pandas-datareader ⏎


②端末で以下を実行する(アップデートがある場合のみ)。

Proceed ([y]/n)? ⏎


作業用フォルダーの作成

「ホーム」フォルダーに「py」フォルダーを作成して、これを作業用フォルダーとする。

○端末で以下を実行する。

$ mkdir ~/py ⏎


SpyderのLauncherへの登録

①端末で以下を実行する。

$ spyder ⏎


②Launcher上の「Spyder (Python 3.4)」を右クリックする。

③「Launcherに登録」を選択する。

Spyderの設定

①Spyderのメニューバーで「ツール」をクリックする。

②「設定」をクリックする。

③「設定」で「グローバル作業ディレクトリ」をクリックする。

④「スタートアップ」で「以下のディレクトリ」を選択する。

⑤続いて「/home/****/py」を選択する。

⑥「ファイルを開く」で「グローバル作業ディレクトリ」を選択する。

⑦「新規ファイル」で「グローバル作業ディレクトリ」を選択する。

⑧「設定」で「IPythonコンソール」をクリックする。

⑨「グラフィックス」タブをクリックする。

⑩「画像のサポート(Matplotlib)」で「サポートを有効化」にチェックを入れる。

⑪「OK」ボタンをクリックする。

ライブラリのチュートリアル

pandas

http://pandas.pydata.org/pandas-docs/stable/tutorials.html

scikit-learn

http://scikit-learn.org/stable/tutorial/index.html

TensorFlow

https://www.tensorflow.org/tutorials/mandelbrot

tf.contrib.learn

https://www.tensorflow.org/get_started/tflearn

(2017/03/27更新)

ヒストリカルデータの加工

hstファイルをcsvファイルに変換

この手順はhstファイルを保存して、それをcsvファイルに変換したい場合のみである。

○以下のコマンドをSpyderの「IPython console」にコピー&ペーストして「Enter」キーを押し、「~/historical_data」フォルダーにhstファイルを変換したcsvファイルを生成する(変換したい通貨ペアがAUDJPY、AUDUSD、EURAUD、EURGBP、EURJPY、EURUSD、GBPAUD、GBPJPY、GBPUSD、USDJPYである場合の例)。

%run -t ~/py/convert_hst2csv.py --audjpy 1 --audusd 1 --euraud 1 --eurgbp 1 --eurjpy 1 --eurusd 1 --gbpaud 1 --gbpjpy 1 --gbpusd 1 --usdjpy 1

ヒストリカルデータの加工と他の足の作成

○以下のコマンドをSpyderの「IPython console」にコピー&ペーストして「Enter」キーを押す(加工したい通貨ペアがAUDJPY、AUDUSD、EURAUD、EURGBP、EURJPY、EURUSD、GBPAUD、GBPJPY、GBPUSD、USDJPY、期間が2007年1月1日〜2016年12月31日である場合の例)。

%run -t ~/py/make_historical_data.py --audjpy 1 --audusd 1 --euraud 1 --eurgbp 1 --eurjpy 1 --eurusd 1 --gbpaud 1 --gbpjpy 1 --gbpusd 1 --usdjpy 1 --start 2007.01.01 --end 2015.12.31

備考

①デューカスコピーのヒストリカルデータはGMT基準であるように思われるが(夏時間があるようなのでUTCではない)、NYクロージング基準に変更するため、元データから2時間進ませている。

②土日以外のすべての足を作成し、データが欠けている場合は前の足のデータで補間している。データが欠けている場合はデータに変動がないと考えれば前の足の終値を使うことには問題ないが、始値、高値、安値、出来高ではそうはいかない。テクニカル指標なども、元データを使った場合と若干の違いが出ることもある。

③1分足データを元に2分、3分、4分、5分、6分、10分、12分、15分、20分、30分、1時間、2時間、3時間、4時間、6時間、8時間、12時間、1日の各足を作成している。

(2017/02/02更新)