一、设计要求
选三只股票2024年2月1日至2024年5月30日的数据进行如下分析:
1.分析三只股票的价格走势,并对未来价格走势进行预测。
(1)从公司、行业、宏观角度进行分析:
(2)从技术指标角度定性预测其走势并。
2.对所选数据,利用马科维茨资产组合理论求其最小方差前沿。
(1)对其收益率进行作图和相关系数分析;(5分)
(2)绘制最小方差前沿曲线;
(3)将数据分为测试集与训练集,用训练集的数据得到最优资产配比,利用测试集来验证最优资产配比是否有效并进行分析。
3.选取其中一只股票进行时间序列分析
(1)对股票数据进行分析,建立适合的模型
(2)对该股票未来一个月的价格进行预测
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 量化策略 ” 获取。👈👈👈
4.以上述股票进行配对交易
(1)设定形成期和交易期,在形成期对两只股票对数价格进行协整检验
(2)找出配对比例和配对价差,计算价差的平均值和标准差;
(3)设定阈值,构造开平仓区间;
(4)模拟交易并进行分析。
5.使用“聚宽”量化投资平台,回测三因子策略,并对回测结果进行分析。
(1)选取2024年2月1日至2024年5月30日为回测区间,展示三因子策略的回测收益图。
(2)分析三因子策略的回测收益,包含策略收益、策略阿尔法值、贝塔值、夏普比率、最大回撤等指标。
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 量化策略 ” 获取。👈👈👈
二、设计思路
预测股票走势
数据预处理
转换交易日期为datetime格式
df1['trade_date'] = pd.to_datetime(df1['trade_date'], format='%Y%m%d') df2['trade_date'] = pd.to_datetime(df2['trade_date'], format='%Y%m%d') df3['trade_date'] = pd.to_datetime(df3['trade_date'], format='%Y%m%d')
这里的pd.to_datetime函数将三只股票的交易日期字段从字符串格式转换为datetime格式。这一步非常重要,因为它将日期字符串转换为pandas可以理解和操作的日期时间对象,这对后续的时间序列分析非常有用。
设置交易日期为索引
df1.set_index('trade_date', inplace=True) df2.set_index('trade_date', inplace=True) df3.set_index('trade_date', inplace=True)
接着将交易日期设置为数据框的索引。这一步的目的是为了方便后续的时间序列操作,比如绘图和时间序列分析。通过将日期设为索引,可以更容易地按照时间顺序来处理和展示数据。
绘制股票收盘价格走势
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 量化策略 ” 获取。👈👈👈
plt.figure(figsize=(14, 7)) plt.plot(df1['close'], label='平安银行') plt.plot(df2['close'], label='国农科技') plt.plot(df3['close'], label='世纪星源') plt.title('股票收盘价格走势') plt.xlabel('日期') plt.ylabel('收盘价格') plt.legend() plt.show()
绘制了三只股票的收盘价格走势图:
1.创建绘图窗口
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 量化策略 ” 获取。👈👈👈
plt.figure(figsize=(14, 7)) plt.figure函数创建一个新的绘图窗口,并设置图形的大小为14x7英寸。
2.绘制每只股票的收盘价格
plt.plot(df1['close'], label='平安银行') plt.plot(df2['close'], label='国农科技') plt.plot(df3['close'], label='世纪星源')
plt.plot函数绘制三只股票的收盘价格曲线,并使用label参数为每条曲线添加标签。
3.设置图形标题和轴标签
plt.title('股票收盘价格走势') plt.xlabel('日期') plt.ylabel('收盘价格') plt.title函数设置图形的标题,plt.xlabel和plt.ylabel函数分别设置X轴和Y轴的标签。
4.添加图例
plt.legend() plt.legend函数显示图例,以便区分不同股票的价格走势。
5.显示图形
plt.show() plt.show函数显示图形。
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 量化策略 ” 获取。👈👈👈
马科维茨资产组合理论
收益率作图和相关系数分析
plt.figure(figsize=(14, 7)) plt.plot(returns) plt.title('股票每日收益率') plt.xlabel('日期') plt.ylabel('收益率') plt.legend(returns.columns) plt.show()
这部分代码绘制了三只股票的每日收益率图表,以直观地展示不同股票在各个时间点上的收益变化情况。
计算相关系数矩阵
corr_matrix = returns.corr() print('相关系数矩阵:')
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 量化策略 ” 获取。👈👈👈
2.2.3 最小方差组合
mean_returns = returns.mean() cov_matrix = returns.cov() num_assets = len(returns.columns) args = (mean_returns, cov_matrix) def min_variance(weights): return portfolio_statistics(weights, mean_returns, cov_matrix)[1] # 略.... # 略....# 略.... # 略.... opt_results = minimize(min_variance, init_weights, method='SLSQP', bounds=bounds, constraints=constraints) min_var_weights = opt_results.x min_var_return, min_var_volatility, _ = portfolio_statistics(min_var_weights, mean_returns, cov_matrix)
通过优化函数minimize求解最小方差组合的权重。设置约束条件保证权重和为1,设置权重边界在0到1之间。最终得到最小方差组合的权重、收益和波动率。
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 量化策略 ” 获取。👈👈👈
2.2.4绘制最小方差前沿曲线
def efficient_frontier(mean_returns, cov_matrix, returns_range): efficient_results = [] for ret in returns_range: constraints = ( {'type': 'eq', 'fun': lambda x: portfolio_return(x, mean_returns) - ret}, {'type': 'eq', 'fun': lambda x: np.sum(x) - 1} ) result = minimize(lambda w: portfolio_volatility(w, cov_matrix), init_weights, method='SLSQP', bounds=bounds, constraints=constraints) efficient_results.append(result) return efficient_results # 略.... # 略.... plt.figure(figsize=(14, 7)) plt.scatter(efficient_volatilities, returns_range, c='blue', marker='o') plt.scatter(min_var_volatility, min_var_return, c='red', marker='*', s=100) plt.title('最小方差前沿曲线') plt.xlabel('波动率') plt.ylabel('收益率') plt.show()
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 量化策略 ” 获取。👈👈👈
print(f'训练集最优资产配比: {train_min_var_weights}') print(f'测试集投资组合的预期收益率: {test_portfolio_return}') print(f'测试集投资组合的预期波动率: {test_portfolio_volatility}')
时间序列分析
代码的目的是绘制平安银行的收盘价格时间序列图。通过将交易日期作为横坐标,收盘价格作为纵坐标,直观展示了股票价格随时间的变化情况。这一步有助于初步了解股票价格的趋势和波动情况。
建立ARIMA模型
使用ARIMA模型对平安银行的股票价格进行拟合。ARIMA(df1[‘close’], order=(5, 1, 0)):指定ARIMA模型的参数(p, d, q),其中p=5表示自回归部分的阶数,d=1表示差分次数,q=0表示移动平均部分的阶数。
使用ARIMA模型进行拟合 model = ARIMA(df1['close'], order=(5, 1, 0)) model_fit = model.fit()
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 量化策略 ” 获取。👈👈👈
plt.figure(figsize=(14, 7)) plt.plot(df1['close'], label='原始数据') plt.plot(model_fit.fittedvalues, color='red', label='拟合值') plt.title('平安银行收盘价格与 ARIMA 模型拟合结果') plt.xlabel('日期') plt.ylabel('收盘价格') plt.legend() plt.show()
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 量化策略 ” 获取。👈👈👈
绘制了原始数据和ARIMA模型拟合值的对比图。通过可视化展示模型的拟合效果,可以直观地看到模型是否能够较好地捕捉股票价格的变化趋势。
预测未来价格
预测未来一个月的价格
forecast_steps = 30 forecast = model_fit.forecast(steps=forecast_steps)
在这里,使用ARIMA模型预测未来30天(一个月)的股票价格。
model_fit.forecast(steps=forecast_steps):生成未来30天的价格预测值。
绘制预测结果
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 量化策略 ” 获取。👈👈👈
plt.figure(figsize=(14, 7)) plt.plot(df1['close'], label='原始数据') plt.plot(pd.date_range(start=df1.index[-1], periods=forecast_steps, freq='D'), forecast, color='red', label='预测值') plt.title('平安银行未来一个月的价格预测') plt.xlabel('日期') plt.ylabel('收盘价格') plt.legend() plt.show()
绘制了原始数据和预测值的对比图。通过这张图,可以直观地看到模型对未来一个月股票价格的预测情况。
1.绘制时间序列图:直观展示平安银行股票收盘价格的历史变化情况。
2.建立ARIMA模型:对股票数据进行拟合,并评估模型的拟合效果。
3.预测未来价格:使用ARIMA模型预测未来一个月的股票价格,并绘制预测结果图。
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 量化策略 ” 获取。👈👈👈
设计逻辑清晰,步骤完整,通过对股票价格进行时间序列分析和预测,为进一步的投资决策提供了科学依据。
配对交易
log_price1 = np.log(df1_formation) log_price2 = np.log(df2_formation) l
这里使用自然对数转换股票的收盘价格,以便进行协整检验。对数转换有助于平滑时间序列数据,并使得结果更具稳定性。
协整检验
score, pvalue, _ = coint(log_price1, log_price2) print(f'协整检验 p-value: {pvalue}')
计算价差的平均值和标准差
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 量化策略 ” 获取。👈👈👈
mean_spread = spread.mean() std_spread = spread.std() print(f'配对比例: {hedge_ratio}') print(f'价差平均值: {mean_spread}') print(f'价差标准差: {std_spread}')
通过计算价差的平均值和标准差,可以得到价差的统计特性。这些统计特性在后续的开平仓决策中非常重要。
1.设定形成期和交易期:划分时间段用于计算配对比例和价差的统计特性,以及进行实际交易。
2.计算对数价格并进行协整检验:确定两只股票是否存在长期均衡关系。
3.找出配对比例和价差,计算价差的统计特性:通过线性回归计算配对比例,并得到价差的平均值和标准差。
这些步骤为后续的配对交易策略提供了坚实的基础,特别是在确定开平仓区间和进行模拟交易时,这些统计特性将发挥关键作用。
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 量化策略 ” 获取。👈👈👈
回测三因子策略
合并收益率数据
returns = pd.concat([df1['returns'], df2['returns'], df3['returns']], axis=1) returns.columns = ['平安银行', '国农科技', '世纪星源'] returns = returns.dropna()
合并了三只股票的收益率数据,并去掉了缺失值。这样可以得到一个包含所有股票收益率的完整数据框,方便后续的计算和分析。
2. 三因子策略回测
平等分配权重
weights = np.array([1/3, 1/3, 1/3]) returns['组合收益'] = returns.dot(weights)
这里三只股票在组合中的权重相等,每只股票的权重为1/3,并计算组合的收益率。展示三因子策略的回测收益图
这里使用平安银行作为市场基准,通过线性回归计算组合收益与市场收益之间的关系,得到阿尔法值和贝塔值。
add_constant函数为回归模型添加常数项。
OLS函数进行线性回归分析,得到回归模型。
alpha表示策略的超额收益,beta表示策略的市场风险。
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 量化策略 ” 获取。👈👈👈
计算夏普比率
sharpe_ratio = returns['组合收益'].mean() / returns['组合收益'].std() * np.sqrt(252)
夏普比率用于衡量单位风险所获得的超额回报。这里使用年化收益率和标准差来计算夏普比
print(f'策略收益: {cumulative_returns[-1]}') print(f'阿尔法值: {alpha}') print(f'贝塔值: {beta}') print(f'夏普比率: {sharpe_ratio}') print(f'最大回撤: {max_drawdown}')
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 量化策略 ” 获取。👈👈👈