金融经济数据方面应用Python非常广泛,也可以算是用Python进行数据分析的一个实际应用。
数据规整化方面的应用
时间序列与截面对齐
在处理金融数据时,最费神的一个问题就是所谓的“数据对齐” (data alignment)问题。两个相关的时间序列的索引可能没有很好的对齐,或两个DataFrame对象可能含有不匹配的列或行。
Pandas可以在算术运算中自动对齐数据。在实际工作中,这不仅能为你带来极大自由度,而且还能提升工作效率。如下,看这个两个DataFrame分别含有股票价格和成交量的时间序列:
假设你想要用所有有效数据计算一个成交量加权平均价格(为了简单起见,假设成交量数据是价格数据的子集)。由于pandas会在算术运算过程中自动将数据对齐,并在sum这样的函数中排除缺失数据,所以我们只需编写下面这条简洁的表达式即可:
由于SPX在volume中找不到,所以你随时可以显式地将其丢弃。如果希望手工进行对齐,可以使用DataFrame的align方法,它返回的是一个元组,含有两个对象的重索引版本:
另一个不可或缺的功能是,通过一组索引可能不同的Series构建一个DataFrame。
跟前面一样,这里也可以显式定义结果的索引(丢弃其余的数据):
时间和“最当前”数据选取
假设你有一个很长的盘中市场数据时间序列,现在希望抽取其中每天特定时间的价格数据。如果数据不规整(观测值没有精确地落在期望的时间点上),该怎么办?在实际工作当中,如果不够小心仔细的话,很容易导致错误的数据规整化。看看下面这个例子:
利用Python的datetime.time对象进行索引即可抽取出这些时间点上的值:
实际上,该操作用到了实例方法at_time(各时间序列以及类似的DataFrame对象都有):
还有一个between_time方法,它用于选取两个Time对象之间的值:
正如之前提到的那样,可能刚好就没有任何数据落在某个具体的时间上(比如上午10点)。这时,你可能会希望得到上午10点之前最后出现的那个值:
如果将一组Timestamp传入asof方法,就能得到这些时间点处(或其之前最近)的有效值(非NA)。例如,我们构造一个日期范围(每天上午10点),然后将其传入asof:
拼接多个数据源
在金融或经济领域中,还有几个经常出现的合并两个相关数据集的情况:
·在一个特定的时间点上,从一个数据源切换到另一个数据源。
·用另一个时间序列对当前时间序列中的缺失值“打补丁”。
·将数据中的符号(国家、资产代码等)替换为实际数据。
第一种情况:其实就是用pandas.concat将两个TimeSeries或DataFrame对象合并到一起:
其他:假设data1缺失了data2中存在的某个时间序列:
combine_first可以引入合并点之前的数据,这样也就扩展了‘d’项的历史:
DataFrame也有一个类似的方法update,它可以实现就地更新。如果只想填充空洞,则必须传入overwrite=False才行:
上面所讲的这些技术都可实现将数据中的符号替换为实际数据,但有时利用DataFrame的索引机制直接对列进行设置会更简单一些:
收益指数和累计收益
在金融领域中,收益(return)通常指的是某资产价格的百分比变化。一般计算两个时间点之间的累计百分比回报只需计算价格的百分比变化即可:对于其他那些派发股息的股票,要计算你在某只股票上赚了多少钱就比较复杂了。不过,这里所使用的已调整收盘价已经对拆分和股息做出了调整。不管什么样的情况,通常都会先算出一个收益指数,它是一个表示单位投资(比如1美元)收益的时间序列。
从收益指数中可以得出许多假设。例如,人们可以决定是否进行利润再投资。我们可以利用cumprod计算出一个简单的收益指数:
得到收益指数之后,计算指定时期内的累计收益就很简单了:
当然了,就这个简单的例子而言(没有股息也没有其他需要考虑的调整),上面的结果也能通过重采样聚合(这里聚合为时期)从日百分比变化中计算得出:
如果知道了股息的派发日和支付率,就可以将它们计入到每日总收益中,如下所示: