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

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

            # 現在レンジ相場かどうか.
           isRange = self.isRange(df_candleStick, rangeTerm, rangeTh)

isRangeメソッドを呼んでいます。

    def isRange(self, df_candleStick, term, th):
       """
       レンジ相場かどうかをTrue,Falseの配列で返す.
       termは期間高値・安値の計算期間.thはレンジ判定閾値.
       """
       # 値幅での判定.
       if th != None:
           priceRange = self.calculatePriceRange(df_candleStick, term)
           isRange = [th > i for i in priceRange]
       # 終値の標準偏差の差分が正か負かでの判定.
       elif th == None and term != None:
           df_candleStick["std"] = [
               df_candleStick["close"][i - term + 1:i].std() for i in
               range(len(df_candleStick.index))]
           df_candleStick["std_slope"] = [
               df_candleStick["std"][i] - df_candleStick["std"][i - 1] for i in
               range(len(df_candleStick.index))]
           isRange = [i > 0 for i in df_candleStick["std_slope"]]
       else:
           isRange = [False for i in df_candleStick.index]
       return isRange

引数には、
df_candleStick=ローソク足情報、
term=コメントによると「期間高値・安値の計算期間」、
th=コメントによると「レンジ判定閾値」
が渡されています。

       # 値幅での判定.
       if th != None:
           priceRange = self.calculatePriceRange(df_candleStick, term)
           isRange = [th > i for i in priceRange]

レンジ判定閾値が渡されている場合にここの処理を行います。
calculatePriceRangeメソッドを呼んでいます。

    def calculatePriceRange(self, df_candleStick, term):
       """
       termの期間の値幅を計算.
       """
       low = [min([df_candleStick["close"][i - term + 1:i].min(),
                   df_candleStick["open"][i - term + 1:i].min()]) for i
              in range(len(df_candleStick.index))]
       high = [max([df_candleStick["close"][i - term + 1:i].max(),
                    df_candleStick["open"][i - term + 1:i].max()]) for i
               in range(len(df_candleStick.index))]
       low = pd.Series(low)
       high = pd.Series(high)
       priceRange = [high.iloc[i] - low.iloc[i] for i in
                     range(len(df_candleStick.index))]

引数には、
df_candleStick=ローソク足情報、
term=このメソッドで処理対象とする期間
が渡されています。

       low = [min([df_candleStick["close"][i - term + 1:i].min(),
                   df_candleStick["open"][i - term + 1:i].min()]) for i
              in range(len(df_candleStick.index))]

少し複雑ですが、後ろから読んでいきます。
`len(df_candleStick.index)` でdf_candleStickの要素数を算出します。
`for i in range(x)` で0からdf_candleStickの要素数-1までをiにloopして入れていきます。
`df_candleStick["close"][i - term + 1:i].min()` に上述のiが入ります。
term期間内のclose価格の最小値を取得しています。
例えばterm=5, i=1の時は df_candleStick["close"][1 - 5 + 1:1].min() となります。
この場合、値は `nan` が返ってきます。

>>> import pandas as pd
>>> a = [1,2,3,4,5,6,7,8,9]
>>> pd.DataFrame(a)
   0
0  1
1  2
2  3
3  4
4  5
5  6
6  7
7  8
8  9
>>> pd.DataFrame(a)[0][-3:1].min()
nan

他の例でterm=5, i=7の時は df_candleStick["close"][7 - 5 + 1:7].min() となります。
この場合はちゃんと数字が返ってきます。

>>> pd.DataFrame(a)[0][3:7].min()
4
dtype: int64

`df_candleStick["open"][i - term + 1:i].min()` も同様です。
これはterm期間内のopen価格の最小値を取得しています。

close価格の最小値とopen価格の最小値をさらにmin()で囲むことでその二つのうち小さいほうを選出しています。
これをdf_candleStickの要素数分繰り返してlow配列に入れています。
しかしここで気になるのは `nan` が返ってくるとmin()した際に必ず `nan` が返ってきてしまう点。

>>> min([pd.DataFrame(a)[0][-3:1].min(), pd.DataFrame(a)[0][3:7].min()])
nan

デフォルトでは `th=None` なのでこの分岐に来ないですが、もしかしたら `low` には必ずnanが入るようになっているかもしれないので注意ですね。

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

↓次


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