关于rolling函数的探索,以及对北向资金能否预示股市涨跌的修正

举报
darkpard 发表于 2022/04/07 20:25:16 2022/04/07
【摘要】 在北向资金能否预示股市涨跌?中用到了pandas的rolling函数,但只是依葫芦画瓢,对rolling函数的原理并未深入学习,是否正确使用了这个函数决定了我们对北向资金能否预示股市涨跌的判断是否正确。因此,我们先对pandas.DataFrame.rolling函数进行一些探索,进而对北向资金能否预示股市涨跌?进行修正。1. rolling的入参rolling(self, window, ...

北向资金能否预示股市涨跌?中用到了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

图片

从结果可以看到,北向资金对于预测股市涨跌几乎没有任何作用,似乎我们仅仅修正了个寂寞。

但是,不管是数据分析还是量化投资,很多规律的探索都不可能一蹴而就,至少我们熟悉了一种新的方法,证伪了一个假设。

参考文献:

  1. https://vimsky.com/zh-tw/examples/usage/python-cusignal.windows.windows.boxcar-rp.html
  2. https://vimsky.com/examples/usage/python-cusignal.windows.windows.triang-rp.html
  3. https://www.cjavapy.com/article/768/
  4. https://vimsky.com/zh-tw/examples/usage/python-cusignal.windows.windows.blackman-rp.html
  5. https://blog.csdn.net/weixin_43773093/article/details/87897876
  6. https://vimsky.com/zh-tw/examples/usage/python-cusignal.windows.windows.bartlett-rp.html
  7. https://blog.csdn.net/chinacmt/article/details/104757646
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。