【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}')

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

相关文章
|
2月前
|
JSON 开发工具 git
基于Python和pygame的植物大战僵尸游戏设计源码
本项目是基于Python和pygame开发的植物大战僵尸游戏,包含125个文件,如PNG图像、Python源码等,提供丰富的游戏开发学习素材。游戏设计源码可从提供的链接下载。关键词:Python游戏开发、pygame、植物大战僵尸、源码分享。
|
3月前
|
数据采集 前端开发 Python
Python pygame 实现游戏 彩色 五子棋 详细注释 附源码 单机版
Python pygame 实现游戏 彩色 五子棋 详细注释 附源码 单机版
108 0
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
1月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
1月前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
121 80
|
4天前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
33 6
Python高性能编程:五种核心优化技术的原理与Python代码
|
2月前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
166 59
|
1月前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
45 14
|
1月前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
93 2
|
1月前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
61 10

热门文章

最新文章