关于rolling函数的探索,以及对北向资金能否预示股市涨跌的修正
在北向资金能否预示股市涨跌?中用到了pandas的rolling函数,但只是依葫芦画瓢,对rolling函数的原理并未深入学习,是否正确使用了这个函数决定了我们对北向资金能否预示股市涨跌的判断是否正确。因此,我们先对pandas.DataFrame.rolling函数进行一些探索,进而对北向资金能否预示股市涨跌?进行修正。
1. rolling的入参
rolling(self, window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
可以看到rolling共有两个必备参数,六个关键字参数(可参见python基础——华为AI学习笔记7)
self
这是对象本身
window
可以是int,offset,或者BaseIndexer的子类。
它主要用来定义移动窗口的大小,每个窗口的大小都是固定的。
如果是int,窗口是以观察值的数量来定义的,比如3个观察值;
如果是offset,窗口是以观察时间段来定义的,比如1个月;
如果是BaseIndexer的子类,则需要结合min_periods、center和closed等参数,通过get_window_bounds来计算窗口的大小。
min_periods
可以是int型,默认为None。
它用来定义计算窗口中观察值的最少个数,如果观察值少于最少个数,结果将为NA。
当window为int时,min_periods默认为window;
当window为offset时,min_periods默认为1。
center
bool型,默认为False。
设定当前观察值处于窗口中间,或处于窗口最后,默认为最后。
win_type
str型,默认为None。
包含以下类型:
boxcar:矩形窗口
triang:三角形窗口
blackman:布莱克曼窗口
hamming:汉明窗口
bartlett:
此外,还有parzen、bohman、blackmanharris、nuttall、barthann、kaiser、gaussian、general_gaussian、slepian、exponential等。
on
可以是str型,它是可选参数。
计算日期型或level型时使用。
axis
可以是int或str,默认为0。
closed
可以是right、left、both或neither,默认为None。
如果window为offset时,默认为right。
当固定窗口时,closed只能是both。
2. rolling的出参
rolling的出参是针对特定操作的窗口或rolling子类。
3. 关于rolling的简单案例
先创建一个DataFrame。
import pandas as pd
a = pd.DataFrame({'a':[1, 2, 3, 3, 5, 8], 'b':[3, 5, 5, 7, 9, 1]})
简单地求和。
a.rolling(2).sum()
4. 基于rolling的相关系数
a.rolling(2).corr()
a.rolling(3).corr()
a.loc[0:2].corr()
可以看到,这里相关系数是基于每一个窗口去计算的。因此,我们在北向资金能否预示股市涨跌?里的rolling函数的使用明显是错的,它其实只是计算最后的120个北向资金与每个大盘后120项数据的相关系数。
5. 北向资金对股市涨跌的启示修正
从提前一天的北向资金与大盘指数的时间序列出发,阶段性生成代码如下,更多过程请参见北向资金能否预示股市涨跌?。
data_return = data.copy()
data_return[data.columns[2:]] = data_return[data.columns[2:]]/data_return[data.columns[2:]].shift(1)-1
data_return['north_money'] = data_return['north_money'].shift(1)
data_return.drop(0, axis=0, inplace=True)
data_return
先用rolling来生成滚动累计值。
data_return['north_money10'] = data_return.rolling(10).sum()['north_money']
data_return['north_money20'] = data_return.rolling(20).sum()['north_money']
data_return['north_money30'] = data_return.rolling(30).sum()['north_money']
data_return['north_money60'] = data_return.rolling(60).sum()['north_money']
data_return['north_money120'] = data_return.rolling(120).sum()['north_money']
data_return[['north_money', 'north_money10', 'north_money20', 'north_money30', 'north_money60', 'north_money120']]
计算各滚动累计值与大盘指数的相关性。
c = data_return.loc[:, ['north_money', ] + list(data_return.columns[2:11])].corr().iloc[:2, 1:]
c = c.append(data_return.loc[10:, ['north_money10', ] + list(data_return.columns[2:11])].corr().iloc[0, 1:10])
c = c.append(data_return.loc[20:, ['north_money20', ] + list(data_return.columns[2:11])].corr().iloc[0, 1:10])
c = c.append(data_return.loc[30:, ['north_money30', ] + list(data_return.columns[2:11])].corr().iloc[0, 1:10])
c = c.append(data_return.loc[60:, ['north_money60', ] + list(data_return.columns[2:11])].corr().iloc[0, 1:10])
c = c.append(data_return.loc[120:, ['north_money120', ] + list(data_return.columns[2:11])].corr().iloc[0, 1:10])
c.drop('上证指数', inplace=True)
c
从结果可以看到,北向资金对于预测股市涨跌几乎没有任何作用,似乎我们仅仅修正了个寂寞。
但是,不管是数据分析还是量化投资,很多规律的探索都不可能一蹴而就,至少我们熟悉了一种新的方法,证伪了一个假设。
参考文献:
-
https://vimsky.com/zh-tw/examples/usage/python-cusignal.windows.windows.boxcar-rp.html -
https://vimsky.com/examples/usage/python-cusignal.windows.windows.triang-rp.html -
https://www.cjavapy.com/article/768/ -
https://vimsky.com/zh-tw/examples/usage/python-cusignal.windows.windows.blackman-rp.html -
https://blog.csdn.net/weixin_43773093/article/details/87897876 -
https://vimsky.com/zh-tw/examples/usage/python-cusignal.windows.windows.bartlett-rp.html -
https://blog.csdn.net/chinacmt/article/details/104757646
- 点赞
- 收藏
- 关注作者
评论(0)