チャネルブレイクアウト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分経ったので今日はここまで。
↓次
この記事が気に入ったらサポートをしてみませんか?