本文是量化策略解析系列的第4篇,本系列的内容为各种量化策略的思路和实现代码,系列连载见:
# 导入需要使用的库
import akshare as ak
import pandas as pd
import numpy as np
import pandas_ta as ta
# 在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 = '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.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')
计算每日的收益率
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
# 计算LLT
d = 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
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!