チャネルブレイクアウトbotコード(by スナフキン氏)読解メモ29

の続きです。
題材コードは https://sshuhei.com/entry/channelbreakout/ です。

バックテストを読んでいきます。

    # バックテスト
   channelBreakOut.describeResult(entryTerm=channelBreakOut.entryTerm,
                                  closeTerm=channelBreakOut.closeTerm,
                                  rangeTh=channelBreakOut.rangeTh,
                                  rangeTerm=channelBreakOut.rangeTerm,
                                  originalWaitTerm=channelBreakOut.waitTerm,
                                  waitTh=channelBreakOut.waitTh,
                                  candleTerm=channelBreakOut.candleTerm,
                                  showFigure=True, cost=channelBreakOut.cost)

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

    def describeResult(self, entryTerm, closeTerm, fileName=None,
                      candleTerm=None, rangeTh=5000, rangeTerm=15,
                      originalWaitTerm=10, waitTh=10000, showFigure=True,
                      cost=0):
        """
        signalsは買い,売り,中立が入った配列
        """

引数たくさん渡していますが一旦スルーして読み進めます。
コメントも引数に関することではなさそうなので一旦スルー。

        import matplotlib.pyplot as plt

matplotlibをimportしています。
グラフを出力する処理があるのでしょう。

       if fileName == None:
           s_hour = 0
           s_min = 0
           e_hour = 23
           e_min = 59
           number = int((e_hour - s_hour) * 60 + e_min - s_min)
           start_timestamp = datetime.datetime(2018, 3, 24, s_hour, s_min, 0,
                                               0).timestamp()
           end_timestamp = datetime.datetime(2018, 3, 24, e_hour, e_min, 0,
                                             0).timestamp()
           candleStick = self.getSpecifiedCandlestick(number, "60",
                                                      start_timestamp,
                                                      end_timestamp)

引数で渡されたfileNameがNoneの場合の処理です。
numberは一日の「分」の個数を入れています。
1分ローソク足の個数計算です。
start_timestampは2018/3/24 00:00、end_timestampは2018/3/24 23:59のdatetimegが入ります。
ここの日付を変更することで任意の日のテストができそうです。

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

   def getSpecifiedCandlestick(self, number, period, start_timestamp,
                               end_timestamp):
       """
       number:ローソク足の数.period:ローソク足の期間(文字列で秒数を指定,
       Ex:1分足なら"60").cryptowatchはときどきおかしなデータ(price=0)が含まれるので
       それを除く
       """
       # ローソク足の時間を指定
       periods = [period]
       # クエリパラメータを指定
       query = {"periods": ','.join(periods),
                "after": str(int(start_timestamp)),
                "before": str(int(end_timestamp))}
       # ローソク足取得
       try:
           res = json.loads(requests.get(
               "https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc",
               params=query).text)
           res = res["result"]
       except:
           print(res)
       # ローソク足のデータを入れる配列.
       data = []
       for i in periods:
           row = res[i]
           length = len(row)
           for column in row[:length - (number + 1):-1]:
               # dataへローソク足データを追加.
               if column[4] != 0:
                   column = column[0:6]
                   data.append(column)
       return data[::-1]

コメントによると、
numberはローソク足の数、
periodはローソク足の期間で単位は秒
です。
start_timestampとend_timestampは先ほど求めたもので、テスト区間指定です。

       # ローソク足の時間を指定
       periods = [period]
       # クエリパラメータを指定
       query = {"periods": ','.join(periods),
                "after": str(int(start_timestamp)),
                "before": str(int(end_timestamp))}

cryptowatchのAPIを参照するためのクエリを作ります。

       # ローソク足取得
       try:
           res = json.loads(requests.get(
               "https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc",
               params=query).text)
           res = res["result"]
       except:
           print(res)

APIを叩いてresponseを取得します。
例外が飛んだ場合はprintするだけです。
バックテストなので例外にそこまで慎重になる必要はないということでしょう。

       # ローソク足のデータを入れる配列.
       data = []
       for i in periods:
           row = res[i]
           length = len(row)
           for column in row[:length - (number + 1):-1]:
               # dataへローソク足データを追加.
               if column[4] != 0:
                   column = column[0:6]
                   data.append(column)

data配列にローソク足データを入れていきます。
cryptowatchのレスポンスはperiod毎に分かれているのでまずres[i]で指定したperiodのデータを取得します。

例: https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc?periods=60

{"result":{"60":[
    [1535809500,788350,788485,788301,788317,60.575665,47757932],
    [1535809560,788313,788361,788100,788198,88.702934,69917100],
    [1535809620,788211,788309,788000,788074,168.90063,133109690],
    [1535809680,788060,788171,787746,787769,139.782,110128250],
    [1535809740,787778,787940,787600,787697,142.46576,112227800],
    ...
]}}

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

↓次


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