股市涨涨跌跌,恰似人生起起落落。面对市场中的海量数据,有时候我们需要简化抽象出大的波动区间。相关的理论有艾略特波浪理论、缠论等等。下面,我们就来研究如何使用量化的方法,获得股票历史行情中的大级别波段。

首先使用akshare库获得上证50指数的历史行情。akshare是一个开源的金融数据接口库,提供了大量的金融数据,包括股票、期货、基金、外汇等。我们可以查看数据的格式如下:

1
import akshare as ak index_zh_a_hist_df = ak.index_zh_a_hist(symbol="000016", period="daily", start_date="19700101", end_date="22220101") index_zh_a_hist_df.head()

股票数据结构

为了更好地在展示数据,首先将字符串类型的日期设置成pandas中的datetime日期格式,并设置成index。同时,为了使用mplfinance对股票价格进行绘图,将价格和成交等进行重新命名。

1
index_zh_a_hist_df['日期'] = pd.to_datetime(index_zh_a_hist_df['日期']) index_zh_a_hist_df = index_zh_a_hist_df.set_index('日期') index_zh_a_hist_df = index_zh_a_hist_df.rename(columns={'开盘':'open', '收盘':'close', '最高':'high', '最低':'low', '成交量':'volume1','成交额':'volume'})

这里补充一下,mplfinance是一个专门为金融数据可视化分析而开发的库,前身是matplotlib中的mpl_finance,由matplotlib的开发团队创建。这个库基于matplotlib,用于简化金融数据的绘图过程,同时支持直接在Pandas DataFrame中可视化数据。想掌握这个工具的,可以关注我后续的文章。

利用如下代码,我们可以使用mplfinence绘制出上证50指数的价格和成交的图像。

1
import mplfinance as mpf mpf.plot( index_zh_a_hist_df, type='line', volume=True, datetime_format='%Y-%m', figsize =(16,8), )

收盘价与成交量

下面我们想要从上面他图像中,识别出大波段的趋势。我们使用scipy中的argrelextrema方法,来识别波峰和波谷。

1
import numpy as np from scipy.signal import argrelextrema peak_idx = argrelextrema(index_zh_a_hist_df['close'].values, np.greater, order=200) valley_idx = argrelextrema(index_zh_a_hist_df['close'].values, np.less, order=200)

波峰波谷的坐标

argrelextrema根据一定准则来识别波峰和波谷的坐标位置。其中的参数order表示两个波峰或波谷中的最小距离,order越大,波峰波谷越稀疏,order越小,波峰波谷越密集。

我们使用如下代码,将波峰和波谷合并成一个列表,并准备好mplfinance绘图中的addplot和alines参数,这两个参数分别在K线图中添加点和直线。

1
index_zh_a_hist_df['极小值'] = np.nan index_zh_a_hist_df.loc[index_zh_a_hist_df.index[valley_idx], '极小值'] = index_zh_a_hist_df.loc[index_zh_a_hist_df.index[valley_idx], 'close'] index_zh_a_hist_df['极大值'] = np.nan index_zh_a_hist_df.loc[index_zh_a_hist_df.index[peak_idx], '极大值'] = index_zh_a_hist_df.loc[index_zh_a_hist_df.index[peak_idx], 'close'] apds=[ mpf.make_addplot(index_zh_a_hist_df['极小值'],type='scatter',markersize=100,marker='^'), mpf.make_addplot(index_zh_a_hist_df['极大值'],type='scatter',markersize=100,marker='v'), ] allpoint = sorted(list(peak_idx[0]) + list(valley_idx[0])) my_alines = [[(index_zh_a_hist_df.index[allpoint[i]],index_zh_a_hist_df['close'].iloc[allpoint[i]]),(index_zh_a_hist_df.index[allpoint[i+1]],index_zh_a_hist_df['close'].iloc[allpoint[i+1]])] for i in range(len(allpoint)-1)]

最后,我们可以画出最终的图像,这个图像将小波动聚合成大趋势,有利于我们对股市进行更加宏观的分析。

1
mpf.plot( index_zh_a_hist_df, type='line', volume=False, datetime_format='%Y-%m', figsize =(16,8), alines=dict( alines=my_alines, colors='r', ), addplot=apds, )

包含波段的图像