巧用findpeaks,精准捕捉股价指数的波峰波谷!

01

引言

在股市量化分析中,检测波峰波谷具有至关重要的应用意义。波峰和波谷作为股价波动的关键节点,不仅反映了市场的短期变化,还蕴含着市场趋势的重要信息。通过准确识别波峰和波谷,投资者能够更精准地把握市场趋势,判断买卖时机,进行有效的风险管理,并进一步优化量化交易策略。投资者可以直接观察股票价格走势图,通过肉眼识别波峰和波谷的位置。这种方法简单易行,但主观性较强,可能受到投资者个人经验和情绪的影响。随着量化投资的发展,越来越多的投资者开始采用量化分析方法来检测波峰和波谷。量化分析法通过构建数学模型和算法来自动识别股价走势中的波峰和波谷,具有高效、准确、客观等优点。然而,对于机器而言,这项看似简单的任务却可能变得极具挑战性。一般而言,波峰和波谷代表着(重要的)事件,如价格/成交量的突然增减,或需求的急剧上升。其中的一大挑战在于,波峰/波谷的定义可能因应用领域的不同而有所差异。本文基于findpeaks库,探讨检测波峰波谷在股市量化分析中的实践应用。findpeaks库在信号处理领域更为常见,但其核心思想同样可以类比应用于股市量化分析中,帮助我们更好地挖掘和利用股价波动带来的投资机会。

02

波峰与波谷概述

在股票市场中,检测指数或价格的波动,尤其是突发性变化,是投资决策中非常关键的任务。这些变化可以大致分为两类:“异常值”和“感兴趣的波峰或波谷”,它们在投资分析中具有不同的意义。异常值通常是指那些显著偏离正常市场走势的数据点,可能由于突发新闻、市场情绪的极端波动等因素引起。这些数据点虽然偏离了市场的常态,但往往不具备持久的趋势意义。何为感兴趣波峰?它是指一个点或区域,其数值大于其周围点。这既可以是局部最大值,也可以是全局最大值。同时,它也可以是重复的数据点,这些数据点并不一定需要偏离正常或预期值。

这种定义的灵活性使得波峰检测成为一项具有挑战性的任务。换句话说,如何确定波峰应该比其周围点高出多少?如何定义局部最大值?信号的噪声问题进一步增加了这一任务的复杂性。波峰检测有多种技术,包括简单的阈值设定,以及使用导数、小波分析和/或卷积等方法。波峰检测方法的吸引人之处在于其处理噪声的能力,以及不对信号波峰做出(过强的)假设。这是因为需要检测的局部最大值可能会因应用和上下文的不同而发生变化。例如,心电图(ECG)信号的形状和幅度与服务器负载测量数据就有所不同。SciPy中的find_peaks是一个众所周知的具有波峰检测功能的Python库。然而,这个函数无法对检测到的波峰进行排序或优先级排序,并且没有内置的噪声处理功能。

在接下来的部分中,本文将展示如何使用findpeaks库检测波峰和波谷、处理信号噪声、测量波峰强度以及对结果进行排序等。

03

Findpeaks应用实例

Findpeaks库旨在检测1维向量和2维数组(图像)中的波峰和波谷,而不对波峰形状或基线噪声做出假设。该库实现了四种不同的波峰和波谷检测与排序方法,包括Topology、Mask、Peakdetect、Caerus四种方法,每种方法都有其独特的优势,使其适用于特定的应用场景。由于Mask方法主要用于二维图像的监测,下面主要介绍其他三种方法的简单应用。

#获取数据包
import qstock as qs
#请先通过pip安装Findpeaks包。
from findpeaks import findpeaks
#获取上证指数2004年至20240808数据
X=qs.get_data('上证指数',start='20040101',end='20240808').close

01

拓扑方法(Topology Method)

d4e799a043779c7d40ccc46f32c8f3ed.png

是一种基于持续同调思想的高效解决方案,在函数值内部排序后,该方法以线性时间运行——事实上,它只有一个循环,持续同调的思想是直观的。

# 初始化
fp = findpeaks(method='topology')
#拟合
results = fp.fit(X)
#可视化
fp.plot()

263c859baa39a1e3f3d9173e46e3ecd7.png

这张图通过findpeaks方法(采用拓扑结构识别技术)深入分析了上证指数从2004年1月1日至2024年8月8日期间的收盘价数据,清晰地描绘了上证指数在这段时间内的整体波动情况,蓝色X标记特别突出了市场的重要高点,即波峰;黄色小圆圈标记市场的波谷,即低点。整体上呈现了四次大的波峰和波谷,分别使用不同颜色表示,如绿色、红色等,07年和15年的波峰波谷对应的大牛市和大熊市最为突出。

02

峰值检测方法(The Peakdetect Method)

1ab2055f144e572e5affdb3f7b17f704.png

即基于Billauer的方法,其优点是能够在噪声信号中找到局部最大值和最小值。噪声非常常见,通常的解决方案是使用一些低通滤波器来平滑曲线。然而,信号平滑的代价是可能会丢失或抑制原始信号中的峰值。这种方法需要设置前瞻参数,即从峰值候选点向前看的距离,以确定它是否是实际的峰值。默认值设置为200,但对于较小的数据集(即数据点少于50个)是可调的;

from findpeaks import findpeaks
#初始化设置
fp = findpeaks(method='peakdetect', lookahead=200, interpolate=None)
#拟合 peakdetect 方法
results = fp.fit(X)
#可视化
fp.plot()

87aaabd528c2e4a228823cefdb8d852c.png

上图显示,精确的峰值和谷值用十字和点突出显示,同时整个区域也被提取出来并以不同的颜色显示。使用该方法得到的波峰波谷明显比第一种方法要密集得多。

03

凯鲁斯方法(Caerus Method)

83887c23dc6cc4d929e18933395d7a51.png

该方法能够确定与相应局部最大值无关的局部最小值,且不受时间框架、尺度或趋势的影响,该方法基于一个前向滚动窗口,用于迭代地对数千个窗口进行评分。对于每个窗口,都会从起始位置到停止位置计算百分比。所得矩阵是一个窗口x长度的数据框,其中使用高于最低百分比的最高评分百分比。然后,将最佳评分百分比进行汇总。最终区域是根据起始位置的距离和百分比变化来确定的。这种方法在寻找如股票市场数据等波动数据中的峰值和谷值方面具有显著优势。

为了观察这种方法的效果,我们需要设置最小百分比(minperc)参数和窗口大小。minperc声明了一个起始位置,而窗口用于确定从起始点开始的百分比变化方面信号是否有所增加。使用较小的窗口大小(例如50)可以检测局部最小值,而较大的窗口大小(例如1000)则会更强调全局最小值。在接下来的代码部分中,我们将使用凯鲁斯方法进行初始化,并检测至少变化5%的峰值。

# 使用凯鲁斯方法初始化findpeaks
# 默认设置是只返回至少有5%差异的峰值和谷值
fp = findpeaks(method='caerus', params={'minperc':5, 'window':50})

#拟合数据
results = fp.fit(X)

#可视化
fp.plot()

f4f91677689c0ba329d7094d2ca4270b.png

c1c751acd9dccdd31fc9266d41f4e418.png

凯鲁斯方法的独特之处在于,它能够检测出不依赖于局部最大值的局部最小值,并且不受时间框架、尺度或市场趋势的影响。这种方法在股票市场中具有显著优势,通过适当的参数设置,能够帮助投资者在不同市场条件下做出更精准的买卖决策,尤其在市场剧烈波动时,通过捕捉潜在的市场底部,投资者可以抓住反弹机会,获得更高的投资回报。

04

结语

利用findpeaks函数识别股价指数的波峰波谷为投资者提供了一种直观而有效的技术手段,通过准确定位市场的关键转折点,投资者能够更好地把握买卖时机,优化投资决策。在实际应用中,findpeaks可以通过调整参数灵活适应不同的市场环境,从而提高市场分析的精准度,为投资者在复杂多变的股市中提供了重要的技术支持。当然,任何技术分析工具都应结合基本面分析和市场经验来综合判断,但findpeaks无疑是一个强大且灵活的辅助工具,值得在股价指数分析中广泛应用。

参考资料:A Step-by-Step Guide To Accurately Detect Peaks and Valleys.2024.Erdogan Taskesen.Medium.

60b299531c51088f450c6ccd8ef9098a.png

关于Python金融量化

4b317ee3f891358b4ad4edc8bf6e1f67.png

专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取qstock源代码、30多g的量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、与博主直接交流、答疑解惑等。添加个人微信sky2blue2可获取相关优惠。

47548b849763f0e58ec42b1a72ad65d7.jpeg

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值