#author("2021-11-29T22:26:33+00:00","","") #author("2021-11-29T22:39:45+00:00","","") [[技術資料]] #Contents *システムの概要 [#m9c9b9e0] +MT5からTickデータを取得,指定した時間足ごとにリサンプリングし,csvファイルに保存. #ref(detaget.png,,75%) +csvファイルから時間足データを取得し,15個のインジケーターそれぞれを同時に最適化,最適なパラメータをそれぞれ保存. #ref(paraopt.png,,75%) +全てのパラメータにおける最適な値をファイルから取得,そのパラメーターを使用し直交表に基づいた16個のルールについてバックテスト,そのときの評価指標を取得.~ 直交表と評価指標を回帰分析しそれぞれのインジケーターの主効果を算出し,それらをもちいて2^15通りの組み合わせに対して評価の予測値を算出.~ 全ての評価値を用いて最適なルールの組み合わせを選択する. #ref(ruleselect.png,,75%) +最適なルールの組み合わせで実際に売買を行う. *動作を確認している環境 [#t0064c54] 以下の環境で,動作を確認している.~ ''OS:Windows 10 Home(Version 20H2)''~ ''Python:Version 3.8.10''~ *準備する [#k6cdbfdb] **MetaTrader 5 [#ya5de976] 「MetaTrader 5」(以下,「MT5」)は,外国為替市場(FX)などを取引するためのプラットフォームである.~ ***ダウンロードとインストール [#u5c54cc5] ''[[【公式サイト】:https://www.metatrader5.com/ja/download]]''からインストーラをダウンロードし,インストールする.~ **Python [#ece37e57] 「Python」は,インタープリタ型のプログラミング言語であり,ほかのプログラミング言語よりも,「ライブラリ」と呼ばれる拡張機能を簡単にダウンロード,インストールし,自身のプログラムに組みこめることが特徴である. ***ダウンロードとインストール [#o75393de] ''[[【公式サイト】:https://www.python.org/downloads/]]''から,適切なインストーラをダウンロードし,インストールする.~ バージョンは,サポート期間中のものであればどれでもよいと思われるが,~ この記事を執筆したときのバージョンは,前述のとおり「3.8.10」である.~ くわしい手順は,''[[【このページ】:https://www.javadrive.jp/python/install/index1.html]]''あたりを参考にするとよいだろう. 正しくインストールされていれば,コマンドプロンプトで''「py -V」''とコマンドを実行すると,~ インストールされているバージョンが表示されるはずである. **Pythonのライブラリ [#i5fc50d1] 以下は,プログラムで使用しているPythonのライブラリである.~ - ''&color(green){MetaTrader5};'' - ''&color(green){datetime};'' - ''&color(green){pandas};'' - ''&color(green){numpy};'' - ''&color(green){mplfinance};'' - ''&color(green){backtesting};'' - ''&color(green){scikit-learn};'' - ''&color(green){pulp};'' - ''&color(red){talib};'' ''&color(green){みどりで書かれたライブラリ};''は,コマンドプロンプトで「''py -m pip install [パッケージ名]''」を実行すると,Pythonに標準で付属しているソフトウェア「pip」が,便利なことに,インターネットから勝手にダウンロードしてインストールしてくれる.~ ''&color(red){あかで書かれたライブラリ};(talib)''は,「pip」でもインターネットから拾ってこられないため((厳密にいうと,「pip」でダウンロードできるライブラリは,「Python Package Index(PyPI)」に登録されているものだけであり,「talib」はそこに登録されていない.)),手動でダウンロードする必要がある.~ ***TA-Lib(talib)のダウンロードとインストール [#n55fdf8c] ''[[【公式サイト】:https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib]]''から,適切なものをダウンロードする.~ 例外もあるが,基本的には以下のようなファイル名になっている.~ ''TA_Lib-&color(blue){x.x.x};-cp&color(red){yy};-cp&color(red){yy};-win&color(green){z};.whl''~ ・&color(blue){x.x.x};:TA-Libのバージョン(「0.4.21」など)~ ・''&color(red){yy};:Pythonのバージョン(たとえば,「&color(red){3};.&color(red){8};.10」であれば「&color(red){38};」)''~ ・''&color(green){z};:Windows OSのビット数(64ビットであれば「&color(green){_amd64};」,32ビットであれば「&color(green){32};」)''~ Pythonのバージョン,およびWindows OSのビット数は,コマンドプロンプトで,~ それぞれ「''py -V''」,「''echo %PROCESSOR_ARCHITECTURE%''」を実行することで,確認できる. ダウンロードしたら,コマンドプロンプトで,~ 「''py -m pip install .\Downloads\TA_Lib-&color(blue){x.x.x};-cp&color(red){yy};-cp&color(red){yy};-win&color(green){z};.whl''」~ を実行する.正しくインストールされれば,「''Successfully installed~~~''」と表示される.~ **プログラム [#uab55c35] 以下のフォルダに,卒論に記載されているシステムのプログラムなどがある.~ ――――――――――~ #ref(MT5.zip) ――――――――――~ ダウンロードののち,解凍して,「C:\Users\[ユーザ名]\」など,~ 分かりやすいところに置くとよいだろう.~ フォルダのなかは,以下のようになっている.~ - ''src'' -- ''&color(red){tick_data.py};'' MT5を介してTickを取得するプログラム -- ''indi'' 各インジケータごとに,パラメータを最適化するプログラム --- ''&color(red){indi_AROON.py};'' --- ''&color(red){indi_BBAND.py};'' --- ''&color(red){indi_CCI.py};'' --- ''&color(red){indi_DMI.py};'' --- ''&color(red){indi_EMA.py};'' --- ''&color(red){indi_MACD.py};'' --- ''&color(red){indi_MFI.py};'' --- ''&color(red){indi_MOM.py};'' --- ''&color(red){indi_ROC.py};'' --- ''&color(red){indi_RSI.py};'' --- ''&color(red){indi_STOCH.py};'' --- ''&color(red){indi_TRIX.py};'' --- ''&color(red){indi_TSF.py};'' --- ''&color(red){indi_ULTOSC.py};'' --- ''&color(red){indi_WillR.py};'' -- ''&color(red){rule_generator.py};'' 最適なルールを選択するプログラム -- ''&color(red){auto_trade.py};'' MT5上で取引を行うプログラム - ''in_dat'' -- ''&color(green){common.csv};'' -- ''tick.csv'' -- ''USDJPY1M.csv'' -- ''long'' --- ''OHLCV_long.csv'' --- ''OHLCV_long_AROON.csv'' --- ''...'' -- ''short'' --- ''OHLC_short.scv'' --- ''OHLC_short.csv'' --- ''...'' - ''out_dat'' -- ''Entry_long.csv'' -- ''Entry_short.csv'' -- ''Position.csv'' -- ''rule.csv'' -- ''Strategy.csv'' -- ''long'' --- ''opt'' --- ''para'' -- ''short'' --- ''opt'' --- ''para'' &br; ***プログラムを修正する [#mc7aff8b] 上記で''&color(red){あかで書かれているプログラム};''は,~ 「in_dat」内や「out_dat」内のcsvファイルを書きこんだり,読みこんだりするときに,絶対パスを使ってあるが,~ そのままでは,「''C:/Users/xi/''MT5/...」になっているはずである.~ その「''C:/Users/xi/''」のところを,''すべてのプログラムにおいて,すべての箇所で,''~ 上記でフォルダ「MT5」を置いた絶対パスに修正する必要がある.~ 「Visual Studio Code」では,特定の文字列をすべて別の文字列に~ 置換する機能があるので,それを利用しよう.~ **MT5の準備 [#ece37e47] 以下のファイルをダウンロードする~ #ref(initmql4.mqh) #ref(stdlib.mqh) #ref(stderror.mqh) #ref(Trade.csv) #ref(TradeAI.mq5) #ref(MQL5.zip)~ ただし,Trade.csvは以下の手順で保存する.~ 「右クリック」→「名前を付けてリンク先を保存」~ ファイル名は変えずにそのまま保存する.~ 各ファイルの配置を以下に示す.~ MQL5→includeにinitmq4.mqh, stdlib.mqh, stderror.mqhの三つを入れる. MQL5→scriptsにTradeAI.mq5を入れる.~ MQL5→FilesにTrade.csvを入れる.~ *システムを実行する [#k6cdbfvb] ** 1台のPCで実行する [#h7db44b0] *** &color(green){common.csv};を確認する [#td08c96b] 「''&color(green){common.csv};''」は,システムの動作を設定するものである.~ そのままでは,以下のようになっているはずである.~ #ref(common.jpg,,50%) 以下の項目の値が,次のようになっているか確認する.異なっているときは,変更する.~ ・「''use_data''」:「''short''」または「''long''」~ インジケータを計算する期間を選択する~ ・「''data_short''」/「''data_long''」:「''10S''」,「''1T''」など~ 「use_data」が「short」のときは,「data_short」の値を,~ 「long」のときは,「data_long」の値を期間として,インジケータの計算を行う ・「''indi_number''」:「''7''」または「''15''」~ 計算を行うインジケータの数~ &color(red){インジケータの計算には,ある程度の処理能力を必要とする.};~ &color(red){「15」個は,相当のマシンパワーを必要とするので,基本的には「7」個でよい.};~ ・「''trend_frag''」:「''2''」~ ''1台のPCで実行するときは,上記の画像のままでよい.''~ *** 各プログラムを実行する [#g8df52b0] 各プログラムを,以下のとおり,''&color(red){順番に};''実行する.~ ――――――――――――――~ ''1. tick_data.py''~ ''2. 各インジケータを計算するプログラム(順不同)''~ 「indi_number」が「''7''」のとき~ '' ・indi_EMA.py''~ '' ・indi_BBAND.py''~ '' ・indi_MACD.py''~ '' ・indi_RSI.py''~ '' ・indi_STOCH.py''~ '' ・indi_DMI.py''~ '' ・indi_ULTOSC.py''~ 「indi_number」が「''15''」のとき~ '' ・indi_AROON.py''~ '' ・indi_BBAND.py''~ '' ・indi_CCI.py''~ '' ・indi_DMI.py''~ '' ・indi_EMA.py''~ '' ・indi_MACD.py''~ '' ・indi_MFI.py''~ '' ・indi_MOM.py''~ '' ・indi_ROC.py''~ '' ・indi_RSI.py''~ '' ・indi_STOCH.py''~ '' ・indi_TRIX.py''~ '' ・indi_TSF.py''~ '' ・indi_ULTOSC.py''~ '' ・indi_WillR.py''~ ''3. rule_generator.py''~ ''4. auto_trade.py''~ ――――――――――――――~ ** 2台のPCで実行する [#zb6967f9] このシステムでは,PCを2台使い,インジケータの計算に用いる期間を,~ 一方で長期,もう一方で短期にし,それによって出力されるcsvファイルを,LANを介して共有することで,~ 長期と短期を組みあわせた取引を行うことができる.~ *** ''&color(skyblue){短期側};'':ファイルをLAN上で公開する [#g34e8jgf] まず,短期側と長期側が,どちらとも同じルータに接続されていることを確認する.~ 「エクスプローラ」を開き,フォルダ「MT5」で右クリックし,~ 「''アクセスを許可する''」から「''特定のユーザ...''」に進む.~ #ref(01.jpg,,50%) 「共有する相手」から「''Everyone''」を選択し,「''追加''」する.~ #ref(02.jpg,,50%) さらに,「Everyone」の「アクセス許可レベル」を「''読み取り/書き込み''」にし,~ 「''共有''」する.~ #ref(02-1.jpg,,50%) 「ユーザのフォルダーは共有されています.」と表示されたら,完了である.~ ここで,''以下の画像で,オレンジの枠で囲われたパスは,のちに使うため,''~ ''転記しておくとよいだろう.''~ #ref(03.jpg,,50%) &br; *** &color(orange){長期側};:共有されたフォルダにアクセスできるか確認する [#k93b98d7] ''「Windows」+「R」''を押し,~ 「ファイル名を指定して実行」で,上記で転記したパスを入力する.~ #ref(04.jpg,,70%) 「ネットワーク資格情報の入力」を求められるため,~ 通常どおり,''&color(skyblue){短期側};''でデスクトップにログインするときの,''ユーザ名''と''パスワード''を入力する.~ #ref(05.jpg,,50%) エクスプローラで,''&color(skyblue){短期側};''に保存されているフォルダ「MT5」が,~ ''&color(orange){長期側};''から閲覧できれば,完了である.~ #ref(06.jpg,,50%) &br; *** &color(orange){長期側};:プログラムを修正する [#d2a6e4e0] 以下のプログラムの,以下の行にある絶対パスのうち,~ 「MT5」以上を,''&color(skyblue){短期側};''の絶対パスに変更する.~ ・''indi_EMA.py''(''25''行目)~ ・''indi_BBAND.py''(''26''行目)~ ・''indi_MACD.py''(''25''行目)~ ・''indi_RSI.py''(''25''行目)~ ・''indi_STOCH.py''(''25''行目)~ ・''indi_DMI.py''(''25''行目)~ ・''indi_ULTOSC.py''(''25''行目)~ ・''rule_generator.py''(''37''行目)~ ・''auto_trade.py''(''26'',''43'',''44''行目)~ たとえば,以下の画像のように変更する.~ #ref(07.jpg,,70%) &br; *** &color(orange){長期側};:&color(green){common.csv};を確認する [#sf86fb01] &color(green){common.csv};のうち,以下の項目の値が,~ 次のようになっているか確認する.異なっているときは,変更する.~ ・「use_data」:「''long''」~ ・「data_short」:「''10S''」~ ・「data_long」:「''1T''」~ ・「indi_number」:「''7''」~ ・「trend_frag」:「''1''」~ *** &color(skyblue){短期側};:&color(green){common.csv};を変更する [#oc3c6221] &color(green){common.csv};のうち,以下の項目の値が,~ 次のようになっているか確認する.異なっているときは,変更する.~ ・「use_data」:「''short''」~ ・「data_short」:「''10S''」~ ・「data_long」:「''1T''」~ ・「indi_number」:「''7''」~ ・「trend_frag」:「''0''」~ *** &color(skyblue){短期側};・&color(orange){長期側};:各プログラムを実行する [#d3acc759] 各プログラムを,&color(skyblue){短期側};と&color(orange){長期側};それぞれにおいて,~ 以下のとおり,''&color(red){順番に};''実行する.~ ――――――――――――――~ ''1. tick_data.py''~ ''2. 各インジケータを計算するプログラム(順不同)''~ 「indi_number」が「''7''」のとき~ '' ・indi_EMA.py''~ '' ・indi_BBAND.py''~ '' ・indi_MACD.py''~ '' ・indi_RSI.py''~ '' ・indi_STOCH.py''~ '' ・indi_DMI.py''~ '' ・indi_ULTOSC.py''~ 「indi_number」が「''15''」のとき~ '' ・indi_AROON.py''~ '' ・indi_BBAND.py''~ '' ・indi_CCI.py''~ '' ・indi_DMI.py''~ '' ・indi_EMA.py''~ '' ・indi_MACD.py''~ '' ・indi_MFI.py''~ '' ・indi_MOM.py''~ '' ・indi_ROC.py''~ '' ・indi_RSI.py''~ '' ・indi_STOCH.py''~ '' ・indi_TRIX.py''~ '' ・indi_TSF.py''~ '' ・indi_ULTOSC.py''~ '' ・indi_WillR.py''~ ''3. rule_generator.py''~ ''4. auto_trade.py''~ ――――――――――――――~