社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python量化策略:基于Stumpy与Dask的股票投资组合构建

灵度智能 • 5 月前 • 158 次点击  

免责声明:本文所有内容‬仅用于交流学习‬,不构成任何投资建议!投资有风险,入市需谨慎!

策略介绍


Stumpy:高效的时间序列分析利器


Stumpy是一个专为时间序列分析设计的Python库,其核心功能是计算矩阵轮廓(Matrix Profile),这是一种强大的时间序列数据挖掘技术。矩阵轮廓能够高效识别时间序列中的 motifs(重复模式)和 discords(异常片段),而无需预设窗口大小或模式形状。该库采用高度优化的算法,计算复杂度仅为O(n²),在单机环境下就能处理百万级数据点。


Stumpy的主要优势在于其卓越的计算效率和易用性。它提供了简洁的API接口,只需几行代码就能完成复杂的时间序列相似性搜索、模式发现和异常检测。在金融领域,这些功能特别适用于寻找相似的价格走势模式、检测市场异常事件以及发现历史中的重复规律。例如,投资者可以使用Stumpy在当前股价曲线中快速查找与历史中特定盈利模式相似的片段,为交易决策提供数据支持。


Dask:灵活的并行计算框架


Dask是一个用于并行计算的灵活库,它无缝扩展了NumPy、Pandas和Scikit-learn等流行库,使这些工具能够处理超过内存容量的大型数据集。Dask的核心价值在于其动态任务调度能力,它能够将大型计算任务分解为许多小任务,然后并行执行这些任务,无论是单机多核还是跨集群计算。


在金融数据分析中,Dask特别适合处理多只股票的高频历史数据。传统的Pandas DataFrame在处理数千只股票的多年分钟级数据时会遇到内存不足的问题,而Dask通过延迟计算和智能分区技术,允许用户以类似Pandas的语法操作远超内存大小的数据集。此外,Dask的并行能力可以显著加速计算密集型任务,如同时计算数百只股票的技术指标或相关性矩阵。


结合Stumpy与Dask构建股票投资组合


核心思路:


结合Stumpy的模式识别能力和Dask的并行处理优势,可以快速构建基于模式相似性的股票投资组合策略:


想象你在管理一个果园:

  • Stumpy帮你找出每棵果树(股票)当前的生长模式与过去何时最相似

  • Dask像多个园丁同时工作,快速检查所有果树

  • 基于相似模式的历史表现,选择最可能结果实(上涨)的果树



1)数据准备阶段:使用Dask读取和处理多只股票的历史价格数据。Dask能够并行加载多个CSV文件或数据库查询结果,将数据转换为适合时间序列分析的格式。


2)并行模式匹配:利用Dask的并行能力,同时计算多只股票的矩阵轮廓。通过将不同股票或不同时间段的计算任务分配到多个核心或节点,显著缩短计算时间。


3)模式筛选与组合构建:

  • 使用Stumpy识别每只股票中的特定模式(如特定的价格走势形态)

  • 通过Dask并行计算不同股票模式之间的相似性

  • 筛选出具有相似有利模式的股票组,构建多元化投资组合


4)实时监控与调整:结合Dask的流处理能力和Stumpy的实时矩阵轮廓更新算法,持续监控投资组合中股票的模式变化,及时调整持仓。


这种结合方式特别适合寻找“历史重演”型投资机会。例如,可以寻找当前显示与历史牛股启动前相似模式的股票,构建潜在上涨概率较高的投资组合。与传统方法相比,这种基于数据驱动模式识别的方法减少了对主观技术分析的依赖,同时Dask的并行处理使得分析数百只股票成为可能,而无需昂贵的硬件投资。


最佳实践:

  • 使用标准化后的收益率序列而非原始价格进行计算;

  • 适当选择子序列长度以平衡敏感性和计算成本;

  • 利用Dask的持久化机制存储中间结果以避免重复计算。


这种技术组合为量化投资者提供了一个强大而高效的工具集,用于发现和利用市场中的统计规律。


策略实现


【 扫描文末二维码加入星球获取完整源码 


核心源码


1. 获取股票数据(示例用随机数据)


prices = np.cumsum(np.random.randn(1000) * 0.01) + 100


2. 使用Stumpy分析模式


window = 30  # 看30天的模式matrix_profile = stumpy.stump(prices, m=window)


3. 解读结果


latest_distance = matrix_profile[-10]  # 最新模式的距离similar_index = int(matrix_profile[-11])  # 最相似的历史位置print(f"当前模式与历史上第 {similar_index} 天的模式最相似")print(f"相似度距离: {latest_distance:.2f}")print(f"距离越小,说明当前走势越常见")


4. 投资启发


if latest_distance < 20:  # 阈值可调整    print("当前走势在历史上很常见")    print("可参考相似历史时期后的表现做决策")else:    print("当前走势比较特殊,历史上少见")    print("建议谨慎操作")


6. 风险控制:


# 增加基本的风控def add_risk_control(portfolio, stock_data):     # 计算每只股票波动率     volatilities = stock_data[portfolio.index].pct_change().std()     # 波动率高的权重降低     portfolio['risk_weight'] = 1 / (1 + volatilities * 100)     portfolio['final_weight'] = portfolio['weight'] * portfolio['risk_weight']     portfolio['final_weight'] = portfolio['final_weight'] / portfolio['final_weight'].sum()     return portfolio


回测效果


构建组合:选择评分最高的4只,每只25%资金



投资组合历史回测




▌关于我们

我们致力于人工智能、量化交易领域前沿研究,分享前沿论文、模型代码、策略实现。如有相关需求,请私信与我们联系。

▌商务合作

请加微信“LingDuTech163”,或公众号后台私信“联系方式”。


关注【灵度智能】公众号,获取更多AI资讯。




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/192755