加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

pandas金融时间序列处理

(2018-04-11 10:29:52)
标签:

ai

金融

分类: python从零实现AI量化投资系统

pandas本身就是为金融时间序列而生,它的思考借鉴自R语言的Dataframe。

可以这么说,python有了numpy,基本就和matlab的矩阵运算功能对齐了;而有了pandas,数据类型和操作方便性上,已超过了matlab。

pandas的功能非常强大,可以简单认为,就是一个内存里的excel,而且是加上VBA编程功能的excel。

 

重建索引:reindex

金融的时间序列,有一个常见的现象,就是某支股票会在某些时间段停牌,这时是没有交易数据的。但对于回测这样的应用,这个时间段的数据不能为0吧,正常的逻辑,需要使用停牌前的数据,也就是需要数据向后填充

pandas的reindex函数,可以对index重建,缺失值是使用NA填充,可以自行指定,比如0.0

import pandas as pd
import unittest

class TestPandas(unittest.TestCase):
    def test_reindex(self):
        df = pd.Series([4.5, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c'])
        print(df)

        df_fillNA = df.reindex(['a', 'b', 'c', 'd', 'e'])
        print(df_fillNA)

        df_fill0 = df.reindex(['a', 'b', 'c', 'd', 'e'],fill_value=0.0)
        print(df_fill0)

打印出来的结果如下:

d    4.5
b    7.2
a   -5.3
c    3.6
dtype: float64
a   -5.3
b    7.2
c    3.6
d    4.5
e    NaN
dtype: float64
a   -5.3
b    7.2
c    3.6
d    4.5
e    0.0
dtype: float64

 

插值功能:

上前文提到,时间序列,比如股票的交易数据不能默认填充为Na或0.0,而是需要使用前一期或后一期的数据来填充。可以使用method这个参数。ffill为向前(时间小的往大的填充)

def test_fill(self):
    raw = pd.Series(['blue', 'red', 'yellow'], index=[0, 2, 4])
    print(raw)

    ffill = raw.reindex(range(6), method='ffill')
    print('ffill:',ffill)

    bfill = raw.reindex(range(6), method='bfill')
    print('bfill',bfill)

这里会有一个问题就是,起点缺失的问题,比如bfill的最后一个日期,没有数据,那还是使用默认值Na。

0      blue
2       red
4    yellow

dtype: object
ffill:

0      blue
1      blue
2       red
3       red
4    yellow
5    yellow
dtype: object
bfill

0      blue
1       red
2       red
3    yellow
4    yellow
5       NaN

一个实际应用的例子:

对金融时间序列做填充,比如万科,2015年12月18号开始停牌,到2016年7月4号才复牌。这中间的数据,都使用2015年12月8号的。

def get_symbol_dataframe(self,symbol):
    if symbol not in self.all_symbol_dfs.keys():
        logger.debug('symbol未发现,从服务器获取。')
        df_get = query_data.query_symbol_dataframe(symbol, start_date=self.start_date,
                                                                        end_date=self.end_date)
        print('raw',df_get)
        if self.trade_days is not None:
            df_get = df_get.reindex(self.trade_days,method='ffill',fill_value=0.0)
        self.all_symbol_dfs[symbol] = df_get
    df = self.all_symbol_dfs[symbol]
    return df

填充前:

2015-12-14  20.08  000002  118.416  20.48  19.01  19.60  1.392194e+08
2015-12-15  21.08  000002  118.416  21.46  19.60  19.60  1.673876e+08
2015-12-16  20.19  000002  118.416  20.99  20.01  20.63  1.185364e+08
2015-12-17  22.21  000002  118.416  22.21  20.35  20.38  2.583393e+08
2015-12-18  24.43  000002  118.416  24.43  21.66  22.40  2.238984e+08
2016-07-04  21.99  000002  118.416  21.99  21.99  21.99  4.266300e+06
2016-07-05  19.79  000002  118.417  19.79  19.79  19.79  1.990576e+08
2016-07-06  19.80  000002  118.416  20.78  19.10  19.10  1.028373e+09
2016-07-07  18.82  000002  118.416  19.22  18.71  19.10  4.300226e+08

填充后:

2015-12-15  21.08  000002  118.416  21.46  19.60  19.60  1.673876e+08
2015-12-16  20.19  000002  118.416  20.99  20.01  20.63  1.185364e+08
2015-12-17  22.21  000002  118.416  22.21  20.35  20.38  2.583393e+08
2015-12-18  24.43  000002  118.416  24.43  21.66  22.40  2.238984e+08
2015-12-21  24.43  000002  118.416  24.43  21.66  22.40  2.238984e+08
2015-12-22  24.43  000002  118.416  24.43  21.66  22.40  2.238984e+08
2015-12-23  24.43  000002  118.416  24.43  21.66  22.40  2.238984e+08
2015-12-24  24.43  000002  118.416  24.43  21.66  22.40  2.238984e+08
2015-12-25  24.43  000002  118.416  24.43  21.66  22.40  2.238984e+08
2015-12-28  24.43  000002  118.416  24.43  21.66  22.40  2.238984e+08
2015-12-29  24.43  000002  118.416  24.43  21.66  22.40  2.238984e+08
2015-12-30  24.43  000002  118.416  24.43  21.66  22.40  2.238984e+08
2015-12-31  24.43  000002  118.416  24.43  21.66  22.40  2.238984e+08
2016-01-04  24.43  000002  118.416  24.43  21.66  22.40  2.238984e+08


原文出自:

Ai量化实验室

原文链接

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有