金融时间序列
金融时间序列:以日期或时间为索引的数据
股价、美元-欧元汇率就表现为金融时间序列数据
python中处理时间序列的主要工具是pandas库
pandas基础
- pandas是在numPy的基础上构建的
inport numpy as np
import pandas as pd
使用DateFrame类第一步
-
DateFrame类设计用来管理具有索引和标签的数据
-
DateFrame在存储数据上的特性:
- 数据
可以用不同组成及类型提供(列表,元组,字典对象,ndarray) - 标签
数据组织为列,可以自定义列名
3.索引
可以采用字符串,数值,时间信息
-
一般来说,可以类似于ndarray那样来对DateFrame对象实现相同的向量化操作。
-
可以在两个维度上同时扩增DateFrame对象(加列)
-
也可以取整个DataFrame对象定义一个新列,在这种情况下,索引自动分配
-
追加数据的工作是类似的,但是在这里会有一个副作用,就是索引被替代为一个单一的数字索引。
-
因此通常在给一个DataFrame对象进行追加的时候,都应当提供合适的索引信息。这会保持索引。
总结:加列用[],加行用{}
处理缺漏的信息
eg:添加的新列中有一个不存在的索引
- 使用join方法会忽略掉索引不存在的位置的数据。
- 为了保持数据,我们需要提供一个参数how=outer,这样在缺失数据的位置,会使用NaN来代替。
- 虽然存在缺失值,但是大多数方法仍然是可以工作的。
使用DateFrame类第二步
从现在开始,我们讨论的都是数值型的数据。
- 为了分析,我们需要首先生成一个分析序列,也就是一个numpy.ndarray,例如,这里我们生成9行4列的伪随机数,呈现标准正态分布。
- 虽然可以直接生成DataFrame对象,通常在实践中还会使用一个ndarray对象来生成,因为这个时候pandas会保持其基本的结构而且仅仅加入meta信息(例如:索引数值)。这同样是代表了金融应用和一般科学研究的一种典型应用方式。
- DateFrame函数使用的参数:
- 与结构化数组一样,DataFrame对象有列名属性,可以通过list来进行赋值,同时这个列名还提供了访问DataFrame对象的一种有效机制。
处理时间索引
-
为了有效的处理时间序列数据
-
例如,假设我们的9行4列的数据对应于月末的数据,开始于2015年1月,那么可以按照下述方式来生成日期
用date_range生成一个DatetimeIndex对象
-
date_range函数参数
其中freq有多种选择。 -
与其他列相同,我们将新生成的DatetimeIndex列作为DataFrame对象的索引
也可以使用numPy的array()函数从DateFrame生成一个ndarray
基本分析
-
和NumPy.ndarray类似,Pandas的DataFrame类也提供了大量方便的方法。
按列总和:df.sum()
按列平均值:df.mean()
累计总和:df.cumsum()(每一行分别加前一行) -
还提供了一个数据集常用统计指标获取的函数,describe方法。
-
可以对DataFrame对象应用大多数的NumPy一般函数。
-
Pandas具有一定的容错特性,在这个条件下,如果数学运算失败,它会将放置一个NaN值,不仅如此,正如我们刚刚介绍的那样,处理这种不完全的数据集与完整数据集是一样的。通常,pandas会忽略掉缺失的错误数据而只针对可得数据进行处理。
-
作图:可以直接应用matplotlib的函数,而且还提供了一些特别的方法。
Series类
- Pandas还提供了series类,如果从DataFrame对象中选取一列,则获得了一个Series对象。
- 大多数的针对DataFrame的方法对于Series对象也是成立的。
GroupBy操作
- Pandas提供了强大而灵活的分组功能,这与SQL中的分组以及excel中的数据透视表类似。
- groups = df.groupby('groupColomnName');
- 分组也可以针对多列进行.
金融数据
- 今天的互联网提供了大量的金融信息,大的网站诸如Google或Yahoo有着丰富的金融数据提供。虽然数据的质量有的时候不能满足专业化的需求。关于这方面的一个例子是股票分拆,这样的数据比较适合于描述pandas的“金融能力”。
- 使用pandas的内置函数DataReader来从Yahoo Finance获取金融数据,分析数据并且生成数据图表。所需要的函数需要引入pandas的一个子库。
import pandas_datareader.data as web
df_stockload = web.DataReader("600797.SS", "yahoo", datetime.datetime(2018, 1, 1), datetime.datetime(2019, 1, 1))
- tail()方法提供数据集的最后五行
- 和NumPy.ndarray类似, pandas 允许在整个甚至复杂的 DataFrame 对象上进行向量化数学运算
eg:根据每天的收盘价返回对数收益率- 添加包含对应信息的列,首先生成1个新的空列,然后在所有指数上进行循环,逐步计算单个对数收益率值
- 也可以使用向量化代码,在不使用循环的情况下得到相同的结果,在这方面, shift方法很有用;它相对于索引向前或者向后移动 Series 或者整个 DataFrame 对象
- 股票收益的两个事实:
1. 波动率聚类
2. 杠杆效应
- 移动平均值很容易用 pandas的 rolling_mean 函数计算
DAX['Close'].rolling(window=42,center=False).mean()
- 回到期权交易者更喜欢的话题,对数收益率的移动历史标准差一一即移动历史波动率可能更有趣。
### 回归分析
- 杠杆效应是权益市场收益率的典型事实。使用 pandas ,还可以在更正式的统计学基础上进行分析。
- (线性)普通最小二乘回归/ (OLS) 方法
- 我们现在(间接)使用隐含波动率,这与未来波动率发展的预期相关,而之前的 DAX 分析使用的是历史波动率计量