Channel Breakout Bot for bitflyer-FX (by Connie-Wild氏)読解メモ41
の続きです。
題材は https://github.com/Connie-Wild/ChannelBreakoutBot です。
optimization.pyを見ていきます。
#_*_ coding: utf-8 _*_
#https://sshuhei.com
import os.path
import json
import logging
import time
import itertools
import pandas as pd
from src import channel
from concurrent.futures import ProcessPoolExecutor
スナフキン氏への感謝とimportたちです。
ファイル末尾の実行処理から見ていきます。
if __name__ == '__main__':
#logging設定
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s %(levelname)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
logfile=logging.handlers.TimedRotatingFileHandler(
filename = 'log/optimization.log',
when = 'midnight'
)
logfile.setLevel(logging.INFO)
logfile.setFormatter(logging.Formatter(
fmt='%(asctime)s %(levelname)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'))
logging.getLogger('').addHandler(logfile)
logging.info('Wait...')
まずログの設定をします。
この辺はtrade.pyとほぼ同じです。
#config.jsonの読み込み
f = open('config/config.json', 'r', encoding="utf-8")
config = json.load(f)
logging.info('cost:%s core:%s fileName:%s',config["cost"],config["core"],config["fileName"])
configを読み込みます。
cost, core, fileNameをlogで出力しています。
optimizeに当たって重要な設定であると考えられます。
costは
バックテストおよび、optimizationで利用。遅延等で1トレード毎にcost円分のコストが発生するものとして評価を行う。
で、coreは
optimizationで使用するCPUコア数を指定。nullの場合、全てのコアを利用する。1の場合、パラメータ毎の詳細実行結果を表示するが、2以上またはnullの場合は、パラメータ毎の実行結果は簡易表示となる。(全てのコアを利用するとCPU使用率が100%に張り付くため、全体コア数-1の値を設定する事をオススメする。)
で、fileNameは
バックテストおよび、optimizationで使用するOHLCデータのファイル名を指定する。デフォルトはchart.csv。指定が無い場合は都度取得する。
です。
READMEより。
#最適化
start = time.time()
optimization(cost=config["cost"], fileName=config["fileName"], core=config["core"], useBlackList=config["useBlackList"])
処理開始時刻をstart変数に記録してoptimization処理を開始します。
optimizationメソッドを見てみます。
def optimization(cost, fileName, core, useBlackList):
cost, fileName, core, useBlackListを受け取ります。
前の3つは見た通りです。
useBlackListもconfigに定義されています。
optimization時にブラックリストを使用する。
マイナス収益のパラメータをブラックリストに登録し、次回以降該当パラメータはスキップする。
とのことで、明らかにダメなパラメータがわかっている場合はこれを登録しておくとそのパラメータの検証をskipするようです。
#optimizeList.jsonの読み込み
f = open('config/optimizeList.json', 'r', encoding="utf-8")
config = json.load(f)
entryAndCloseTerm = config["entryAndCloseTerm"]
rangeThAndrangeTerm = config["rangeThAndrangeTerm"]
waitTermAndwaitTh = config["waitTermAndwaitTh"]
rangePercentList = config["rangePercentList"]
linePattern = config["linePattern"]
termUpper = config["termUpper"]
candleTerm = config["candleTerm"]
optimizationlist.jsonを開き、各種設定を読み込みます。
それぞれの変数は https://github.com/Connie-Wild/ChannelBreakoutBot#optimization%E7%94%A8%E3%81%AE%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E7%94%A8%E6%84%8F に記載された通りです。
if "COMB" in linePattern:
entryAndCloseTerm = list(itertools.product(range(2,termUpper), range(2,termUpper)))
linePatternに COMB が指定されている場合は itertools.product で range(2,termUpper) 同士の直積を取ります。
参考: https://qiita.com/junkls/items/10384950963056cc8e08#%E7%9B%B4%E7%A9%8D
例えばtermUpper=4の場合は
>>> list(itertools.product(range(2,4), range(2,4)))
[(2, 2), (2, 3), (3, 2), (3, 3)]
このようになります。
この出力結果がentryAndCloseTermに入ります。
15分経ったので今日はここまで。
↓次
この記事が気に入ったらサポートをしてみませんか?