https://mp.weixin.qq.com/s/udYseLr-t_etz8AZqkzErg
Python金融笔记,公众号:Python金融笔记拒绝盲目猜测:用 Python 回测 5 年数据,揭秘螺纹钢跨期套利的“黄金区间




Z-score =(当前价差 - 历史均值)÷ 历史标准差mean_09_01 = long_df_09_01['spread_value'].mean()std_09_01 = long_df_09_01['spread_value'].std()long_df_09_01['zscore'] = (long_df_09_01['spread_value'] - mean_09_01) / std_09_01courrent = long_df_09_01.iloc[-1]['zscore']print(f"历史均值:{mean_09_01:.2f}")print(f"历史标准差:{std_09_01:.2f}")print(f"当前Z-score:{courrent:.2f}")
计算滚动zscorelong_df_09_01['roll_mean'] = long_df_09_01['spread_value'].rolling(window=30).mean()long_df_09_01['roll_std'] = long_df_09_01['spread_value'].rolling(window=30).std()long_df_09_01['roll_zscore'] = ( long_df_09_01['spread_value'] - long_df_09_01['roll_mean']) / long_df_09_01['roll_std']courrent = long_df_09_01.iloc[-1]['roll_zscore']fig, ax = plt.subplots(figsize=(14, 7))ax.plot(long_df_09_01['date_text'], long_df_09_01['roll_zscore'], label='滚动Z-score')ax.axhline(0, color='black', linestyle='--', linewidth=1)N = 50for i, label inenumerate(ax.get_xticklabels()): label.set_visible(i % N == 0)# 标出最新值ax.scatter(long_df_09_01['date_text'].iloc[-1], long_df_09_01['roll_zscore'].iloc[-1], color='red', zorder=5, label=f'最新值={courrent:.2f}')ax.legend()plt.tight_layout()plt.show()
