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分経ったので今日はここまで。

↓次


この記事が気に入ったらサポートをしてみませんか?