在上一篇文章《ICU均线(上):使用稳健回归方法,突破传统均线》中,我们参考中泰证券的研报《“ICU均线”下的择时策略:“均线”才是绝对收益利器?》,介绍了一种基于稳健回归算法的新型均线——ICU均线,它能够更好地处理异常值,提供更稳健的趋势信号,并且具有更快的反应速度和更高的稳健性。本文以沪深300指数为例,介绍如何用Python实现ICU均线,并观察用ICU均线来进行择时的效果。
# 导入需要使用的库
import akshare as ak
import pandas as pd
import numpy as np
# 在matplotlib绘图中显示中文和负号
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.family'] = 'STKAITI' # 中文字体'STKAITI'
plt.rcParams['axes.unicode_minus'] = False # 解决坐标轴负数的负号显示问题
# 关闭警告信息
import warnings
warnings.filterwarnings('ignore')
# 获取指数数据
index_code = 'sh000300'
start_date = pd.to_datetime('2005-01-01')
end_date = pd.to_datetime('2023-12-31')
price_df = ak.stock_zh_index_daily(symbol=index_code)
price_df['date'] = pd.to_datetime(price_df['date'])
price_df = price_df[(price_df['date']>=start_date) & (price_df['date']<=end_date)]
price_df = price_df.sort_values('date').set_index('date')

def repeated_median_regression(x, y):
n = len(x)
[] =
# 计算所有点对的斜率
for i in range(n):
for j in range(i + 1, n):
if x[j] != x[i]:
- y[i]) / (x[j] - x[i]))
# 计算所有斜率的中位数
np.median(slopes) =
# 计算所有截距的中位数
intercepts = y - median_slope * x
median_intercept = np.median(intercepts)
return median_slope, median_intercept
def calculate_icu_ma(prices, window):
icu_ma = []
for i in range(len(prices)):
if i < window - 1:
icu_ma.append(np.nan) # 前window-1个点无法计算均线
else:
x = np.arange(window)
y = prices[i - window + 1:i + 1].values
slope, intercept = repeated_median_regression(x, y)
icu_ma.append(intercept + slope * (window - 1)) # 计算窗口最后一个点的均线值
return pd.Series(icu_ma, index=prices.index)
# 计算ICU均线
window = 10
price_df['icu_ma'] = calculate_icu_ma(price_df['close'], window)
# ICU均线择时信号:当日 close 值大于 icu_ma 值则开仓,否则清仓
timing_df = pd.DataFrame()
timing_df['icu择时'] = (price_df['close']>price_df['icu_ma']) * 1.
timing_df['不择时'] = 1.
# 计算指数每日的收益率
price_df['returns'] = price_df['close'].pct_change().shift(-1).fillna(0)
# 计算择时后的每日收益率
timing_ret = timing_df.mul(price_df['returns'], axis=0).dropna()
# 计算择时后的累计收益率
cumul_ret = (1 + timing_ret.fillna(0)).cumprod() - 1.
# 可视化输出
cumul_ret.plot(figsize=(10, 6), title='ICU择时')

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/105941
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!