本文是量化策略解析系列的第4篇,本系列的内容为各种量化策略的思路和实现代码,系列连载见:
# 导入需要使用的库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)

def get_llt(prices: pd.Series, alpha: float) -> pd.Series: llt = pd.Series(index=prices.index, dtype='float64')
# 需要至少两个价格点来计算LLT if len(prices) < 2: return prices
# 初始化LLT的前两个值 llt[0] = prices[0] llt[1] = prices[1]
# 使用给定的公式计算接下来的LLT值 for t in range(2, len(prices)): llt[t] = ((alpha - alpha**2 / 4) * prices[t] + (alpha**2 / 2) * prices[t-1] - (alpha - 3 * alpha**2 / 4) * prices[t-2] + 2 * (1 - alpha) * llt[t-1] - (1 - alpha)**2 * llt[t-2]) return llt
# 计算LLTd = 60 # 天数alpha = 2 / (d + 1)price_df['LLT'] = get_llt(price_df['close'], alpha)
# 比较:计算均线price_df['均线'] = ta.sma(price_df['close'], length=d, talib=False)# 可视化输出price_df[['close', 'LLT','均线']].plot(figsize=(10, 6))

# 择时信号:当日LLT值大于昨日则开仓,否则清仓timing_df = (price_df[['LLT']].diff()>0) * 1.timing_df['不择时'] = 1.
# 计算择时和不择时的每日收益率timing_ret = timing_df.mul(price_df['returns'], axis=0)# 计算累计收益率cumul_ret = (1 + timing_ret.fillna(0)).cumprod() - 1.
# 可视化输出cumul_ret.plot(figsize=(10, 6), title='LLT择时')

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