用Pandas估计股票收益,Pandas中的DataFrame
是一个兼有矩阵和字典特征的数据结构,其功能类似于R中的dataframe。实际上,DataFrame
是Pandas中的核心数据结构,你可以对其做各种操作。进行投资组合分析时,经常需要计算投资组合的相关矩阵,本攻略将对此予以介绍。
具体步骤
首先,创建一个字典对象,其成员是每支股票的日收益率数据。然后,以日期为行标签,创建DataFrame
对象。最后,计算相关矩阵并绘制结果。
- 创建
DataFrame
对象。
为了创建DataFrame
对象,需要先创建一个字典。该字典对象以股票代码为索引关键字(键),对应的值是该股的对数收益率。该DataFrame
对象以日期为索引(行标签),以股票代码为列标签。
data = {}
for i in xrange(len(symbols)):
data[symbols[i]] = numpy.diff(numpy.log(close[i]))
df = pandas.DataFrame(data,
index=dates[0][:-1], columns=symbols)
- 操作
DataFrame
对象。
现在可以对DataFrame
对象做各种操作,例如计算相关矩阵或绘图。
print df.corr()
df.plot()
包括下载股价数据在内的完整代码如下。
import pandas
from matplotlib.pyplot import show, legend
from datetime import datetime
from matplotlib import finance
import numpy
# 2011到2012
start = datetime(2011, 01, 01)
end = datetime(2012, 01, 01)
symbols = ["AA", "AXP", "BA", "BAC", "CAT"]
quotes = [finance.quotes_historical_yahoo(symbol, start, end, asobject=True)for symbol in symbols]
close = numpy.array([q.close for q in quotes]).astype(numpy.float)
dates = numpy.array([q.date for q in quotes])
data = {}
for i in xrange(len(symbols)):
data[symbols[i]] = numpy.diff(numpy.log(close[i]))
df = pandas.DataFrame(data, index=dates[0][:-1], columns=symbols)
print df.corr()
df.plot()
legend(symbols)
show()
相关矩阵的输出结果如下。
AA AXP BA BAC CAT
AA 1.000000 0.768484 0.758264 0.737625 0.837643
AXP 0.768484 1.000000 0.746898 0.760043 0.736337
BA 0.758264 0.746898 1.000000 0.657075 0.770696
BAC 0.737625 0.760043 0.657075 1.000000 0.657113
CAT 0.837643 0.736337 0.770696 0.657113 1.000000
上述五支股票的对数收益率图示如下: