平均足を使った戦略
へーキン様戦略を分析して得た知見共有。
平均足の定義
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)
直前も含めた終値モメンタム
pos = np.where(df['ln_cl'].diff(1).ewm(1, adjust=False).mean().fillna(0) > 0, 1, -1)
直前を含めた始値モメンタム
pos = np.where(df['ln_op'].diff(1).ewm(1, adjust=False).mean().fillna(0) > 0, 1, -1)
直前を除いた終値モメンタム
pos = np.where(df['ln_cl'].diff(1).shift(1).ewm(1, adjust=False).mean().fillna(0) > 0, 1, -1)
直前だけ逆張りにした終値モメンタム
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)
直前だけ逆張りにした終値モメンタム (係数違うバージョン)
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)
直前逆張り
pos = np.where(df['ln_cl'].diff(1).fillna(0) < 0, 1, -1)
まとめ
記事中コードのライセンス: CC0