ヒストリカルデータの加工 (2017/04/11)

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

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

例として「~/historical_data」フォルダーに「AUDJPY.hst」、「AUDUSD.hst」、「EURCHF.hst」、「EURJPY.hst」、「EURUSD.hst」、「GBPJPY.hst」、「GBPUSD.hst」、「USDJPY.hst」の各ファイルがあるとする。これをcsvファイルに変換する。csvファイルは新たに生成され、hstファイルはそのまま残る。

import forex_system as fs
fs.convert_hst_to_csv --audjpy 1 --audusd 1 --eurchf 1 --eurjpy 1 --eurusd 1 --gbpjpy 1 --gbpusd 1 --usdjpy 1

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

例として「~/historical_data」フォルダーに「AUDJPY.csv」、「AUDUSD.csv」、「EURCHF.csv」、「EURJPY.csv」、「EURUSD.csv」、「GBPJPY.csv」、「GBPUSD.csv」、「USDJPY.csv」の各ファイルがあるとする。これを使って2007年1月1日から2017年1月1日までの各足を生成する。

import forex_system as fs
fs.get_historical_data --start 2007.01.01 --end 2017.01.01 --audjpy 1 --audusd 1 --eurchf 1 --eurjpy 1 --eurusd 1 --gbpjpy 1 --gbpusd 1 --usdjpy 1

備考

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

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

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

ヒストリカルデータのダウンロード (2017/04/11)

ヒストリカルデータを保存するフォルダーの作成

以下のコマンドを実行して「ホーム」フォルダーに「historical_data」フォルダーを作成する。

$ mkdir ~/historical_data

これをヒストリカルデータを保存するフォルダーとする。

古いヒストリカルデータの削除

初めてヒストリカルデータをダウンロードする場合、この手順はいらない。すでにヒストリカルデータをダウンロードしていて、新しいデータをダウンロードする場合に実行する。

以下のコマンドを実行して「~/historical_data」フォルダー内のファイルを削除する。

import forex_system as fs
fs.clean_historical_data_folder()

ヒストリカルデータのダウンロード

①JForexのツールバーで「ツール」をクリックする。

②「ヒストリカルデータ取得」をクリックし、下の方に「ヒストリカルデータ取得」タブを表示する。

③「ヒストリカルデータ取得」タブの「Undock this tab」ボタンをクリックし、「ヒストリカルデータ取得」タブを別ウィンドウにして見やすい大きさにする。

④「ヒストリカルデータ取得」の「開始日時」で2007年1月1日を選択する(なぜか日付が1日前後して表示されることがあるが気にしない)。

⑤「終了日時」で2017年1月1日を選択する(やはり日付が1日前後して表示されることがあるが気にしない)。

⑥「形式」で「CSV」を選択する。

⑦「日付形式」で「YYYY.MM.DD HH:MM:SS」を選択する。

⑧「区切り」で「,」(カンマ)を選択する。

⑨「ビッド/アスク」で「Bid」を選択する。

⑩「データ種類」で「分」を選択する。

⑪「値」で「1分」を選択する。

⑫「フィルター」で「フラット期間を非表示」を選択する。

⑬「データ出力先」で「参照」ボタンをクリックする。

⑭「ディレクトリを選択」で「/home/****/historical_data」を選択する。

⑮「選択」ボタンをクリックする。

⑯「ヒストリカルデータ取得」に戻って「銘柄」で、FXシステムに対応している下記の通貨ペアからダウンロードしたい通貨ペアにチェックを入れる。

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

⑰「開始」ボタンをクリックする。

⑱「ヒストリカル・テスターに関する免責事項」で一番下までスクロールする。

⑲「次回から表示しない」にチェックを入れる。

⑳「同意する」ボタンをクリックし、ダウンロードが「100%」になるのを待つ。

㉑「ヒストリカルデータ取得」タブの「×」ボタンをクリックして閉じる。

ファイル名に日付が入っているが、なぜかダウンロードした日付と1日前後することがある。よく分からないが気にしない。

ファイル名の変更

ファイル名には日付などが入っているが邪魔なので通貨ペア名以外の部分は削除する。

import forex_system as fs
rename_historical_data_filename()

JForexのインストール

ヒストリカルデータはデューカスコピー社のものを使う。そのためには先ずデューカスコピー社のデモ口座を解説し、JForexというツールをインストールする必要がある。以下にその手順などを説明する。なお、デモ口座は期限が1ヶ月だが、デューカスコピー社に連絡すれば無期限にしてもらうこともできる。

デモ口座の開設

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

https://www.dukascopy.jp/japan/japanese/home/

②「デモ口座開設」ボタンをクリックする。

③「デモ口座開設」の「デモ口座の申し込み」で必要事項にチェックを入れる、または入力する。

④「デモ口座を開設する」ボタンをクリックする。

⑤登録したメールアドレスに「デューカスコピー・ジャパン株式会社」からメールが来るので「ログイン」と「パスワード」を確認する。

JForexのダウンロード

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

https://www.dukascopy.jp/japan/japanese/home/

②「ログイン」をクリックする。

③「インストール版 JForex(推奨)」で「JForexをインストール」をクリックする(使用しているOSに合ったバージョンのファイルが自動的に選択される)。

④「JForex_unix_64_JRE_bundled.sh を開く」で「ファイルを保存する」を選択する。

⑤「OK」ボタンをクリックし、「JForex_unix_64_JRE_bundled.sh」ファイルを「~/ダウンロード」フォルダーに保存する。

JForexのインストール

①端末に以下のコマンドをコピー&ペーストして「Enter」キーを押す。

bash ~/ダウンロード/JForex_unix_64_JRE_bundled.sh

②「言語の選択」で「日本語」が選択されているのを確認する。

③「OK」をクリックする。

④「セットアップ - JForex Platform 1.3」の「ようこそ JForex Platform セットアッププログラムへ。」で「次へ」をクリックする。

⑤「ユーザー設定」で「このユーザー(****)のみにインストールする」が選択されているのを確認する。

⑥「次へ」をクリックする。

⑦「インストール先の選択」の「インストール先のディレクトリ」で「/home/****/JForex」が選択されているのを確認する。

⑧「次へ」をクリックする。

⑨「シンボリックリンクのためのディレクトリを選択」で「シンボリックリンクの作成」にチェックが入っているのを確認する。

⑩「インストール先のディレクトリ」で「/home/****/bin」が選択されているのを確認する。

⑪「次へ」をクリックする。

⑫「ショートカット作成オプションの選択」で「デスクトップアイコンを作成する」にテェックが入っているのを確認する。

⑬「次へ」をクリックする。

⑭「JForex Platformのセットアップ完了」で「JForex Platform を実行する」にチェックが入っているのを確認する。

⑮「終了」をクリックする。

JForexの起動

○デスクトップの「JForex Platform」をダブルクリックする。

JForexへのログイン

①JForexのログイン画面で「ログイン」にデューカスコピー社から送られた「ログイン」を入力する。

②「パスワード」に同じくデューカスコピー社から送られた「パスワード」を入力する。

③「環境」で「DEMO」を選択する。

④「言語」で「日本語」が選択されているのを確認する。

⑤「ログイン」ボタンをクリックする。

JForexからのログアウト

①JForexのメニューバーの「ファイル」をクリックする。

②「ログアウト」をクリックする。

(2017/01/26更新)

oandapyのインストール

oandapyをインストールする。oandapyはOANDAの口座からデータを取得するので、OANDAのデモ口座も開設しておく。

oandapyのインストール

○以下のコマンドを端末にコピー&ペーストして「Enter」キーを押す。

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

OANDAのデモ口座の開設

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

https://www.oanda.jp/

②右上の「デモ申込」ボタンをクリックする。

③「無料デモ口座開設フォーム」の「デモ口座利用規程及び個人情報のお取扱いについて」で「同意・承諾します」にチェックを入れる。

④「お申込みフォーム」の「お名前」の「姓」に姓を全角で入力する。

⑤「名」に名を全角で入力する。

⑥「フリガナ」の「セイ」に姓を全角カナで入力する。

⑦「メイ」に名を全角カナで入力する。

⑧「性別」で「男性」、あるいは「女性」を選択する。

⑨「連絡メールアドレス」でメールアドレスを入力する。

⑩「連絡メールアドレス(確認用)」でもう一度メールアドレスを入力する。

⑪「電話番号」で電話番号を入力する。

⑫「勧誘の受諾の意思の表明」で「同意・承諾します」にチェックを入れる。

⑬「勧誘招請について」で「同意・承諾します」にチェックを入れる。

⑭「デモ口座ID(fxTradePracticeID)を発行する」ボタンをクリックする。

⑮登録したメールアドレスに送られたIDとPWを確認する。

アカウントIDとアクセストークンの取得

上に続けて実行する。

①「無料デモ口座開設フォーム」で「デモ ログインへ」ボタンをクリックする。

②「デモ口座ログイン」で「お客様のIDを入力してください」にIDを入力する。

③「パスワードを入力してください」にPWを入力する。

④「デモ口座ログイン情報を記憶する」にチェックを入れる。

⑤「ログイン」ボタンをクリックする。

⑥(ブラウザがFirefoxの場合のみ)「このログイン情報を Firefox に記憶させますか?」で「記憶」ボタンをクリックする。

⑦「口座情報」の「アカウント」で「Primary」の右にある数字をメモする。

これがAPIアクセスに必要なアカウントIDとなる。メールアドレスに送られたIDではないので注意。

⑧「MT4/API関連」の「APIアクセスの管理」をクリックする。

⑨「REST APIアクセスの管理」で「発行する」ボタンをクリックする。

⑩「あなたのPersonal Access Tokenは下記となります。」の下のトークンをメモする。

これがAPIアクセスに必要なアクセストークンとなる。

(2017/02/08更新)

FXシステムの使い方(プログラム) (2017/04/11)

FXシステムのプログラムについて簡単に説明する。

FXシステムのインポート

FXシステムをインポートする。

import forex_system as fs

convert_minute_to_period()

分を計算期間に変換する。例として60分が5分足では足何本分になるかを表示する。

period = fs.convert_minute_to_period(60, 5)
print(period)


12

get_signal()

シグナルを求める。例としてZスコアが-0.5以下で買いエントリー、0以上で買いエグジット、+0.5以上で売りエントリー、0以下で売りエグジットとするシグナルを最初の5個のみ表示する。

symbol = 'USDJPY'
timeframe = 1440
sl = 0
tp = 0
zscore1 = fs.i_zscore(symbol, timeframe, 3, 'MODE_SMA', 1)
buy_entry = zscore1 <= -0.5
buy_exit = zscore1 >= 0.0
sell_entry = zscore1 >= 0.5
sell_exit = zscore1 <= 0.0
signal = fs.get_signal(buy_entry, buy_exit, sell_entry, sell_exit, symbol,
                       timeframe, sl, tp)
print(signal.head())


2007-01-01    0
2007-01-02    0
2007-01-03   -1
2007-01-04   -1
2007-01-05    0
Name: close, dtype: int64

「sl」は損切り(stop loss)、「tp」は利食い(take profit)の設定で、pips単位で設定する。「0」に設定した場合は、損切り、または利食いを行わない。

i_atr()

ATRを求める。例としてATR(USDJPY、日足、3本、1本前の足)を最初の10個のみ表示する。

atr1 = fs.i_atr('USDJPY', 1440, 3, 1)
print(atr1.head())


2007-01-01     0.000010
2007-01-02     0.000010
2007-01-03    39.899997
2007-01-04    40.249997
2007-01-05     0.736667
2007-01-08     0.893333
2007-01-09     0.783333
2007-01-10     0.896667
2007-01-11     0.755000
2007-01-12     0.908333
Freq: B, dtype: float64

2007年1月1日と1月2日は「0.00001」となっているが、存在する最初のデータより前はこの数値で埋めているので、ただの仕様である。他の関数でも同様である。

また、1月3日と1月4日は数値が大きすぎるが、最初に近いデータではこういうことがある。データは2007年からあるが、検証では2008年から使うようにすれば問題はないだろう。他の関数でもやはり同様である。

i_close()

終値を求める。例として終値(USDJPY、日足、1本前の足)を最初の5個のみ表示する。

close1 = fs.i_close('USDJPY', 1440, 1)
print(close1.head())


2007-01-01      0.00001
2007-01-02    119.05000
2007-01-03    118.83000
2007-01-04    119.37000
2007-01-05    119.05000
Name: close, dtype: float64

i_hl_band()

HLバンドを計算する。例としてHLバンド(USDJPY、日足、3本、1本前の足)を最初の5個のみ表示する。

hl_band1 = fs.i_hl_band('USDJPY', 1440, 3, 1)
print(hl_band1.head())


                 high        low      middle
2007-01-01    0.00001    0.00001    0.000010
2007-01-02    0.00001    0.00001    0.000010
2007-01-03  119.08000    0.00001   59.540005
2007-01-04  119.68000  118.45000  119.065000
2007-01-05  119.68000  118.45000  119.065000

i_highest()

高値の位置を求める。例として高値の位置(USDJPY、日足、3本、1本前の足)を最初の5個のみ表示する。

highest1 = fs.i_highest('USDJPY', 1440, 3, 1)
print(highest1.head())


2007-01-01    0
2007-01-02    0
2007-01-03    1
2007-01-04    0
2007-01-05    1
Name: high, dtype: int64

i_lowest()

安値の位置を求める。例として安値の位置(USDJPY、日足、3本、1本前の足)を最初の5個のみ表示する。

lowest1 = fs.i_lowest('USDJPY', 1440, 3, 1)
print(lowest1.head())


2007-01-01    0
2007-01-02    0
2007-01-03    2
2007-01-04    1
2007-01-05    2
Name: low, dtype: int64

i_roc()

変化率を求める。例として変化率(USDJPY、日足、1本、1本前の足)を最初の5個のみ表示する。

roc1 = fs.i_roc('USDJPY', 1440, 1, 1)
print(roc1.head())


2007-01-01    1.000000e-05
2007-01-02    1.190500e+09
2007-01-03   -1.847963e-01
2007-01-04    4.544307e-01
2007-01-05   -2.680741e-01
Name: close, dtype: float64

i_trend_duration()

トレンド継続期間を求める。トレンドについては様々な理解があるが、ここではレートが移動平均線より上なら上昇トレンド、下なら下落トレンドと見なすこととする。その継続期間(単位は足)を求め、符号は上昇トレンドならプラス、下落トレンドならマイナスとする。

例としてトレンド継続期間(USDJPY、日足、3本、単純移動平均、1本前の足)を最初の5個のみ表示する。

trend_duration1 = fs.i_trend_duration('USDJPY', 1440, 3, 'MODE_SMA', 1)
print(trend_duration1.head())


2007-01-01    0
2007-01-02    0
2007-01-03    1
2007-01-04    0
2007-01-05    0
dtype: int64

i_zscore()

Zスコアを求める。ここでのZスコアとは(終値-移動平均) / 移動標準偏差という式で求めたものである。

例としてZスコア(USDJPY、日足、3本、単純移動平均、1本前の足)を最初の5個のみ表示する。

zscore1 = fs.i_zscore('USDJPY', 1440, 3, 'MODE_SMA', 1)
print(zscore1.head())


2007-01-01    0.000010
2007-01-02    0.000010
2007-01-03    0.575748
2007-01-04    1.055712
2007-01-05   -0.122757
Name: close, dtype: float64

time_hour()

インデックスの時を返す。例としてインデックスの時(USDJPY、30分足)を最初の5個のみ表示する。

close1 = fs.i_close('USDJPY', 30, 1)
hour = fs.time_hour(close1.index)
print(hour.head())


2007-01-01 00:00:00    0
2007-01-01 00:30:00    0
2007-01-01 01:00:00    1
2007-01-01 01:30:00    1
2007-01-01 02:00:00    2
dtype: int32

time_month()

インデックスの月を返す。例としてインデックスの月(USDJPY、日足)を最初の5個のみ表示する。

close1 = fs.i_close('USDJPY', 1440, 1)
month = fs.time_month(close1.index)
print(month.head())


2007-01-01    1
2007-01-02    1
2007-01-03    1
2007-01-04    1
2007-01-05    1
dtype: int32