【python】python股票量化交易策略分析可视化(源码+数据集+论文)【独一无二】

简介: 【python】python股票量化交易策略分析可视化(源码+数据集+论文)【独一无二】

一、设计要求

选三只股票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}')

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 量化策略 ” 获取。👈👈👈

相关文章
|
14天前
|
数据采集 数据可视化 数据挖掘
基于Python的数据分析与可视化实战
本文将引导读者通过Python进行数据分析和可视化,从基础的数据操作到高级的数据可视化技巧。我们将使用Pandas库处理数据,并利用Matplotlib和Seaborn库创建直观的图表。文章不仅提供代码示例,还将解释每个步骤的重要性和目的,帮助读者理解背后的逻辑。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供有价值的见解和技能。
38 0
|
9天前
|
机器学习/深度学习 数据可视化 Python
Python实用记录(三):通过netron可视化模型
使用Netron工具在Python中可视化神经网络模型,包括安装Netron、创建文件和运行文件的步骤。
14 2
Python实用记录(三):通过netron可视化模型
|
8天前
|
数据采集 Web App开发 数据可视化
Python爬虫教程:Selenium可视化爬虫的快速入门
Python爬虫教程:Selenium可视化爬虫的快速入门
|
3天前
|
数据采集 数据可视化 数据挖掘
使用Python进行数据处理与可视化——以气温数据分析为例
【10月更文挑战第12天】使用Python进行数据处理与可视化——以气温数据分析为例
50 0
|
12天前
|
数据采集 数据可视化 数据挖掘
Python 数据分析实战:使用 Pandas 进行数据清洗与可视化
【10月更文挑战第3天】Python 数据分析实战:使用 Pandas 进行数据清洗与可视化
49 0
|
自然语言处理 算法 Python
|
自然语言处理 算法 索引
|
7天前
|
存储 程序员 开发者
Python编程基础:从入门到实践
【10月更文挑战第8天】在本文中,我们将一起探索Python编程的奇妙世界。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息。我们将从Python的基本概念开始,然后逐步深入到更复杂的主题,如数据结构、函数和类。最后,我们将通过一些实际的代码示例来巩固我们的知识。让我们一起开始这段Python编程之旅吧!
|
8天前
|
机器学习/深度学习 数据采集 数据挖掘
探索Python编程的奥秘
【10月更文挑战第7天】本文将带你走进Python的世界,探索其背后的逻辑与魅力。我们将从基础语法开始,逐步深入到函数、面向对象编程等高级特性,最后通过实际项目案例,让你体验Python的强大与便捷。无论你是编程新手,还是有一定基础的开发者,都能在这篇文章中找到你需要的信息和启发。
|
9天前
|
IDE 开发工具 Python
Python 编程入门:打造你的第一个程序
【10月更文挑战第6天】编程,这个听起来高大上又充满神秘感的领域,其实就像学习骑自行车一样。一开始你可能会觉得难以掌握平衡,但一旦你学会了,就能自由地穿梭在广阔的道路上。本文将带你走进 Python 的世界,用最简单的方式让你体验编写代码的乐趣。不需要复杂的理论,我们将通过一个简单的例子——制作一个猜数字游戏,来实践学习。准备好了吗?让我们开始吧!