本文是量化策略解析系列的第2篇。系列连载见:
# 导入需要使用的库import akshare as akimport pandas as pdimport numpy as npimport pandas_ta as ta# 在matplotlib绘图中显示中文和负号import matplotlib.pyplot as pltimport matplotlib as mplmpl.rcParams['font.family'] = 'STKAITI' # 中文字体'STKAITI'plt.rcParams['axes.unicode_minus'] = False # 解决坐标轴负数的负号显示问题# 关闭警告信息import warningswarnings.filterwarnings('ignore')
# 获取上证指数数据index_code = 'sh000001'start_date = pd.to_datetime('2014-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']).dt.dateprice_df = price_df[(price_df['date']>=start_date) & (price_df['date']<=end_date)]price_df = price_df.sort_values('date').set_index('date')
计算每日的收益率price_df['returns'] = price_df['close'].pct_change().shift(-1).fillna(0)

# 计算移动平均线值days = 20price_df[f'ma_{days}'] = ta.sma(price_df['close'], length=days)
# 择时信号:当日均线值大于昨日则开仓,否则清仓timing_df = (price_df[[f'ma_{days}']].diff()>0) * 1.timing_df['不择时'] = 1.
# 计算每日收益率timing_ret = timing_df.mul(price_df['returns'], axis=0)timing_ret['超额收益'] = (1+timing_ret[f'ma_{days}']).div(1+timing_ret['不择时'], axis=0) - 1.# 计算累计收益率cumul_ret = (1 + timing_ret.fillna(0)).cumprod() - 1.
# 可视化输出cumul_ret.plot(figsize=(10, 6), title='单均线择时')

days_s = 5days_l = 60price_df['ma_s'] = ta.sma(price_df['close'], length=days_s)price_df['ma_l'] = ta.sma(price_df['close'], length=days_l)
# 择时信号:当日短期均线值大于长期均线值则开仓,否则清仓timing_df = pd.DataFrame()timing_df['择时'] = (price_df['ma_s']>price_df['ma_l']) * 1.timing_df['不择时'] = 1.
# 计算择时后的每日收益率timing_ret = timing_df.mul(price_df['returns'], axis=0)timing_ret['超额收益'] = (1+timing_ret['择时']).div(1+timing_ret['不择时'], axis=0) - 1.
# 计算累计收益率cumul_ret = (1 + timing_ret.fillna(0)).cumprod() - 1.
# 可视化输出cumul_ret.plot(figsize=(10, 6), title='双均线择时')

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