Channel Breakout Bot for bitflyer-FX (by Connie-Wild氏)読解メモ50

の続きです。
題材は https://github.com/Connie-Wild/ChannelBreakoutBot です。

machineLearning.pyの続きから。

   #最適化
   start = time.time()
   optimization(cost=config["cost"], fileName=config["fileName"], hyperopt=config["hyperopt"], mlMode=config["mlMode"], showTradeDetail=config["showTradeDetail"])

テスト開始時刻を記録してoptimizationメソッドを実行します。

optimizationメソッドを見ていきます。

def optimization(cost, fileName, hyperopt, mlMode, showTradeDetail):
    #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"]

optimizeList.jsonから設定を読み込みます。

    if "COMB" in linePattern:
        entryAndCloseTerm = list(itertools.product(range(2,termUpper), range(2,termUpper)))

    total = len(entryAndCloseTerm) * len(rangeThAndrangeTerm) * len(waitTermAndwaitTh) * len(rangePercentList) * len(candleTerm)

linePattern設定がCOMBであればtermUpperの組み合わせをentryAndCloseTermに入れます。
試行する組み合わせの総数をtotalに入れます。
ここまではoptimization.pyと同じです。

    logging.info('Total pattern:%s Searches:%s',total,hyperopt)
    logging.info("======Optimization start======")
    #hyperoptによる最適値の算出
    space = [hp.choice('i',entryAndCloseTerm), hp.choice('j',rangeThAndrangeTerm), hp.choice('k',waitTermAndwaitTh), hp.choice('l',rangePercentList), hp.choice('m',candleTerm), cost, mlMode, fileName]
    result = fmin(describe,space,algo=tpe.suggest,max_evals=hyperopt)

ここがoptimizationと一番異なるところです。
変数hyperoptにはREADMEにある通り、

機械学習によるoptimizationにて試行するテスト数を指定する。

です。
組み合わせ総数とhyperoptの数値をログ出力します。
最適化を開始する旨ログに出します。
hpは冒頭のimport文でimportされています。

from hyperopt import fmin, tpe, hp

hp.choiceが何をやっているか調べましたがなかなか判然としません。
参考: https://qiita.com/nazoking@github/items/f67f92dc60001a43b7dc#2%E6%A4%9C%E7%B4%A2%E7%A9%BA%E9%96%93%E3%81%AE%E5%AE%9A%E7%BE%A9
一旦↑に書いてあることに沿って書いてみると、

>>> from hyperopt import hp
>>> space = hp.choice("a", [1,2,3,4,5])
>>> print(space)
0 switch
1   hyperopt_param
2     Literal{a}
3     randint
4       Literal{5}
5   Literal{1}
6   Literal{2}
7   Literal{3}
8   Literal{4}
9   Literal{5}
実際にサンプリングされたものは何もありません。ポイントをサンプリングする方法を記述した単なるグラフです。

たしかにサンプリングされてはいない。spaceにはグラフが入っているようです。

>>> print(hyperopt.pyll.stochastic.sample(space))
2
>>> print(hyperopt.pyll.stochastic.sample(space))
3
>>> print(hyperopt.pyll.stochastic.sample(space))
2
>>> print(hyperopt.pyll.stochastic.sample(space))
3
>>> print(hyperopt.pyll.stochastic.sample(space))
3
>>> print(hyperopt.pyll.stochastic.sample(space))
3
>>> print(hyperopt.pyll.stochastic.sample(space))
2
>>> print(hyperopt.pyll.stochastic.sample(space))
1
>>> print(hyperopt.pyll.stochastic.sample(space))
1
>>> print(hyperopt.pyll.stochastic.sample(space))
3
>>> print(hyperopt.pyll.stochastic.sample(space))
2
>>> print(hyperopt.pyll.stochastic.sample(space))
4

サンプリングできました。
何となく、ランダムで返して来るように見えます。
choiceの特色の一つに関数を候補に含めることができるというのがあるようなので、それを使うともっと頭のいいことができるのかもしれませんが分かりません。
ちょっとこれを理解するのは前提知識がだいぶ欠けているので難しいです。
hyperoptについては上辺だけを追いかけることになりそうです。

15分経ったので今日はここまで。

↓次


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