让我们进行一个常见的分析,您可能自己就可以完成这个分析。假设您想分析股票绩效,那么您可以:
很好,但本文为您展示一种更简单、更直观、功能更强大的方法,使用 IPython 和 pandas 进行同种分析。
工具准备
方法/步骤
Pandas 组合数据的导入
In [1]: import pandas.io.data as web
In [2]: from pandas import DataFrame
In [3]: data_feed = {}
In [4]: symbols=['AAPL','FB', 'GOOG', 'SPLK', 'YELP', 'GG','BP','SCPJ','JNJ', 'OMG']
In [5]: for ticker in symbols:
...: data_feed[ticker] = web.get_data_yahoo(ticker, '05/21/2012', '11/1/2012')
...:
In [6]: price = DataFrame({tic: data['Adj Close']
...: for tic, data in data_feed.iteritems()})
In [7]: volume = DataFrame({tic: data['Volume']
...: for tic, data in data_feed.iteritems()})
In [8]: returns = price.pct_change()
年收益率
要确定年收益率百分比并进行分析,可以调用 return DataFrame 方法和 plot 方法。这可以通过调用 sum 对 DataFrame 中的各列求和来实现,该函数执行了大量工作来创建图 1 中所示的图表。
In [9]: import matplotlib.pyplot as plt
In [10]: returns.sum().plot(kind='bar',title="% return For Year")
Out[10]: <matplotlib.axes.AxesSubplot at 0x10c1b0350>
In [11]: plt.show()
如 图 1 所示,Facebook 进行了 IPO,并且年初至今它的损失接近 IPO 值的 40%。相比之下,Yelp(在同一个行业中)获利几乎为 40%。事后看来,卖空 Facebook 而买进 Yelp 几乎可以让原始投资翻倍。
原始输出总和
sum() 命令的文本输出在该代码中展示了年收益的实际原始值:
In [12]: returns.sum()
Out[12]:
AAPL 0.077139
BP 0.155668
FB -0.376935
GG 0.285309
GOOG 0.124510
JNJ 0.140735
OMG 0.145005
SCPJ 0.189855
SPLK 0.021382
YELP 0.357202
创建一幅日收益率柱状图
考虑数据的另一个方法是创建全年日收益率率变化的柱状图,了解这是否反映了数据的底层洞察。幸运的是,这非常简单,如下列代码所示:
In [13]: returns.diff().hist()
Out[13]:
array([[Axes(0.125,0.677778;0.158163x0.222222), Axes(0.330612,0.677778;0.158163x0.222222), Axes(0.536224,0.677778;0.158163x0.222222), Axes(0.741837,0.677778;0.158163x0.222222)], [Axes(0.125,0.388889;0.158163x0.222222), Axes(0.330612,0.388889;0.158163x0.222222), Axes(0.536224,0.388889;0.158163x0.222222), Axes(0.741837,0.388889;0.158163x0.222222)], [Axes(0.125,0.1;0.158163x0.222222) Axes(0.330612,0.1;0.158163x0.222222), Axes(0.536224,0.1;0.158163x0.222222), Axes(0.741837,0.1;0.158163x0.222222)]], dtype=object)
In [14]: plt.show()
Pandas 投资组合相关性的年度线性图 另一个查看数据的方法是记下日收益率并绘制年度线性图。下面的代码样例展示了如何操作:
In [15]: returns.plot(title="% Daily Change For Year")
Out[15]: <matplotlib.axes.AxesSubplot at 0x10b56e850>
In [16]: plt.show()
步骤阅读
累计和 这种简单图表存在的问题是不太容易理解图中的信息。处理时间系列数据的方法是使用 cumsum 函数,将数据绘成图表:
In [17]: ts = returns.cumsum()
In [18]: plt.figure(); ts.plot(); plt.legend(loc='upper left')
Out[18]: <matplotlib.legend.Legend at 0x10c69cb50>
In [19]: plt.show()
图 4 所示的结果告诉了我们关于您的投资组合的更多信息。通过进行时间系列分析并绘制结果图标,Facebook 显然面临着比原来想象的更加困难的时刻,年收益下降了 40%,九月份甚至一度下降了 60%。有关股票走势的其他数据表明,Facebook 的标准偏差相当高。因为标准偏差是风险的大致表现,所以,在制订该组合并确定权重时,应重点关注这个地方。
Pandas 组合相关性的百分比变化 确定十种股票间百分比变化的相关性与调用 DataFrame 收益 corr 的方法一样简单:
In [9]: returns.corr()
Out[9]:
AAPL BP FB GG GOOG JNJ OMG SCPJ SPLK YELP
AAPL 1.000000 0.169053 0.094286 0.134131 0.376466 0.163904 0.411568 0.117152 0.368266 0.124856
BP 0.169053 1.000000 0.011832 0.294994 0.291391 0.437816 0.436781 -0.009499 0.224151 0.084014
FB 0.094286 0.011832 1.000000 -0.065156 0.081912 0.020755 0.130815 0.039980 0.038010 0.343646
GG 0.134131 0.294994 -0.065156 1.000000 0.302844 0.138329 0.206255 -0.066144 0.148690 -0.006135
GOOG 0.376466 0.291391 0.081912 0.302844 1.000000 0.144882 0.305486 -0.001538 0.226364 0.154207
JNJ 0.163904 0.437816 0.020755 0.138329 0.144882 1.000000 0.268308 0.021108 0.190023 -0.009803
OMG 0.411568 0.436781 0.130815 0.206255 0.305486 0.268308 1.000000 0.117257 0.279653 0.146944
SCPJ 0.117152 -0.009499 0.039980 -0.066144 - 0.001538 0.021108 0.117257 1.000000 -0.017114 0.058541
SPLK 0.368266 0.224151 0.038010 0.148690 0.226364 0.190023 0.279653 -0.017114 1.000000 0.215260
YELP 0.124856 0.084014 0.343646 -0.006135 0.154207 -0.009803 0.146944 0.058541 0.215260 1.000000
In [58]: plt.show()
SPY 的累积时间图 该示例中,创建了另一个 DataFrame,在同一时间周期内,它可以充当您的 “市场投资组合”。图 5 中的图表展示了 SPY 生成的收益率,SPY 是标准普尔 500 指数的代理:
In [116]: market_data_feed = {}
In [117]: market_symbols=['SPY']
In [118]: for ticker in market_symbols: .....: market_data_feed[ticker] = web.get_data_yahoo (ticker, '05/21/2012', '11/1/2012') .....:
In [119]: market_price = DataFrame({tic: data['Adj Close'] .....: for tic, data in market_data_feed.iteritems()}) In [120]:
In [120]: market_volume = DataFrame({tic: data['Volume'] .....: for tic, data in market_data_feed.iteritems()})
In [121]:
In [121]: market_returns = market_price.pct_change()
In [122]: market_returns.cumsum()
In [123]: mts = market_returns.cumsum()
In [124]: plt.figure(); mts.plot(); plt.legend(loc='upper left')
Out[124]: <matplotlib.legend.Legend at 0x10b8f4650>
In [125]: plt.show()
战胜股市 在完成两个时间系列的图表后,下一步分析是查看与市场投资组合相对的产品投资组合。两种临时应急的方法是 (a) 查看您的组合与市场投资组合的平均收益率,(b) 查看标准偏差 (stdev),这是一种关于您的投资组合与市场投资组合的大致风险代理:
In [126]: sum_returns = returns.sum()
In [127]: sum_returns.mean()
Out[127]: 0.11198689337482581
In [128]: market_returns.sum().mean()
Out[128]: 0.093679854637400028
In [239]: market_returns.std()
Out[239]: minor SPY 0.008511
In [240]: returns.std().mean()
Out[240]: 0.025706773344634132