見出し画像

平均足を使った戦略

へーキン様戦略を分析して得た知見共有。

平均足の定義

pandasで平均足計算

df['heikin_cl'] = 0.25 * (df['op'] + df['hi'] + df['lo'] + df['cl'])
df['heikin_op'] = df['heikin_cl'].ewm(1, adjust=False).mean().shift(1)

df['heikin_op'] = (df['op'] + df['cl]).shift(1) * 0.5としている記事もありますが違うと思います

へーキン様戦略

BTCUSDの日足更新時に平均足を用いてポジションをとるスイングbotです
 前日の平均足が陽線ならロング、陰線ならショートを保有します

へーキン様戦略はモメンタム戦略

平均足の式から以下のようになります。

df['heikin_cl'] - df['heikin_op'] = 2 * df['heikin_cl'].diff(1).ewm(1, adjust=False).mean()

df['heikin_cl'].diff(1)は価格差分です。ewmは指数平均です。もしewmが単純移動平均だと、↑はheikin_clのモメンタムになります。つまり、この式はモメンタムの指数平均版です。

直前は逆張り

一方、BTCUSDでは、1日前の価格変化率と1日後の価格変化率は逆張りの関係になる気がします。普通にclでモメンタム戦略を作ると、1日前の価格変化率に対して順張りをしてしまい、成績が劣化しますが、平均足を使うとcl成分が減るので、ちょうど直前のデータだけ抜いたモメンタム戦略みたいになって、成績が向上する気がします。

戦略バリエーション

いろいろ試して、↑の仮説通りの結果が得られました。コスト無視

へーキン様と同じ

pos = np.where(df['heikin_cl'] - df['heikin_op'] > 0, 1, -1)

スクリーンショット 2021-05-26 1.19.49

直前も含めた終値モメンタム

pos = np.where(df['ln_cl'].diff(1).ewm(1, adjust=False).mean().fillna(0) > 0, 1, -1)

スクリーンショット 2021-05-26 1.20.57

直前を含めた始値モメンタム

pos = np.where(df['ln_op'].diff(1).ewm(1, adjust=False).mean().fillna(0) > 0, 1, -1)

スクリーンショット 2021-05-26 1.22.20

直前を除いた終値モメンタム

pos = np.where(df['ln_cl'].diff(1).shift(1).ewm(1, adjust=False).mean().fillna(0) > 0, 1, -1)

スクリーンショット 2021-05-26 1.23.39

直前だけ逆張りにした終値モメンタム

pos = np.where((-df['ln_cl'].diff(1) + df['ln_cl'].diff(1).shift(1).ewm(1, adjust=False).mean()).fillna(0) > 0, 1, -1)

スクリーンショット 2021-05-26 1.24.10

直前だけ逆張りにした終値モメンタム (係数違うバージョン)

np.where((-df['ln_cl'].diff(1) * 0.5 + df['ln_cl'].diff(1).shift(1).ewm(1, adjust=False).mean()).fillna(0) > 0, 1, -1)

スクリーンショット 2021-05-26 1.24.59

直前逆張り

pos = np.where(df['ln_cl'].diff(1).fillna(0) < 0, 1, -1)

スクリーンショット 2021-05-26 1.26.05

まとめ

記事中コードのライセンス: CC0