用pandas 进行投资分析
让我们进行一个常见的分析,您可能自己就可以完成这个分析。假设您想分析股票绩效,那么您可以:
在 Yahoo 金融专区找一支股票。。
下载历史数据,保存为 CSV 文件格式。
将 CSV 文件导入 Excel。
进行数学分析:回归、描述性统计或使用 Excel Solver 工具进行线性优化。
很好,但本文为您展示一种更简单、更直观、功能更强大的方法,使用 IPython 和 pandas 进行同种分析。
操作方法
- 01
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()
- 02
年收益率 要确定年收益率百分比并进行分析,可以调用 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 几乎可以让原始投资翻倍。
- 03
原始输出总和 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
- 04
创建一幅日收益率柱状图 考虑数据的另一个方法是创建全年日收益率率变化的柱状图,了解这是否反映了数据的底层洞察。幸运的是,这非常简单,如下列代码所示: 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()
- 05
Pandas 投资组合相关性的年度线性图 另一个查看数据的方法是记下日收益率并绘制年度线性图。下面的代码样例展示了如何操作: In [15]: returns.plot(title="% Daily Change For Year") Out[15]: <matplotlib.axes.AxesSubplot at 0x10b56e850> In [16]: plt.show()
- 06
累计和 这种简单图表存在的问题是不太容易理解图中的信息。处理时间系列数据的方法是使用 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 的标准偏差相当高。因为标准偏差是风险的大致表现,所以,在制订该组合并确定权重时,应重点关注这个地方。
- 07
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()
- 08
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()
- 09
战胜股市 在完成两个时间系列的图表后,下一步分析是查看与市场投资组合相对的产品投资组合。两种临时应急的方法是 (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
- 10
结束语 在最后交互示例中,您可以通过 11% 的投资组合收益率与 9% 的市场投资组合收益率来战胜股市。在启动对冲基金之前,您可能需了解为什么市场投资组合获得 8% 的标准偏差,而您的投资组合只获得了 2% 的标准偏差。快速回答是,您冒了较大风险,而且只是幸运罢了。进一步的分析涉及到确定 alpha、beta、预期收益,以及进行 Fama-French 和有效边界优化之类的高级分析。 本文中,Python 用于执行临时应急的投资组合分析。Python 逐渐变成用于真实数据分析的首选语言。Pyomo、pandas、Numpy 和 IPython 之类的库使得在 Python 中应用高级数学知识变得更加轻松。如果您想了解更多关于投资组合分析的信息,请参阅 参考资料 中的阅读建议。
- 11
参考资料 学习 在 Noah Gift 和 Jeremy Jones(O'Reily Media,2008 年)撰写的书籍 Python For Unix and Linux System Administration 中,第 2 章讨论了 IPython。 访问 IPython 网站。 在 Eli Bressert(O'Reilly Media,2012 年)撰写的书籍 SciPy and Numpy 中,了解如何将 NumPy 用作数值处理,包括数组索引、数学操作、加载数据和存储数据。了解如何使用 SciPy 及高级数学函数进行处理,如优化、插值、集成、集群、统计和其他科学编程工具。 Statusmodels 是一种允许用户研究数据、评估统计模式并进行统计测试的 Python 模块。 Wes McKinney(O'Reilly Media,2012 年) 撰写的书籍 Python for Data Analysis 是为数据密集型应用程序定制的 Python 科学计算实用入门指南。 强烈推荐 W. E. Hart et al 撰写的书籍 Pyomo – Optimization Modeling in Python。 在 Jay O. Light(Harvard Business School,1993 年)撰写的书籍 Harvard Business School Case Study: Dimensional Fund Advisors 中,您可以阅读关于投资组合管理的更多信息。 还可以参阅由 A. Bodie、A. Kane 和 A. Marcus(McGraw-Hill/Irwin,2010 年)合著的Investments (McGraw-Hill/Irwin Series in Finance, Insurance and Real Estate)。 Statistics for Management and Economics 介绍了如何将统计应用到实际的业务问题中。 在 Nate Silver 撰写的书籍 The Signal and the Noise: Why So Many Predictions Fail - but Some Don't(Penguin Press,2012 年)中,他查看了预测方面的知识,并调查我们如何从噪声数据中分辨出真实信号。 Robert Kabacoff(Manning Publications,2011 年)撰写的书籍 R in Action 介绍了 R 系统,一种功能强大的统计计算和制图语言。 研究 E. T. Jaynes(剑桥大学出版社,2003 年)撰写的书籍 Probability Theory: The Logic of Science。 在 developerWorks 上云计算专区 中了解更多关于云计算技术的信息。 访问 IBM SmartCloud Enterprise。 关注 Twitter 上的 developerWorks。 developerWorks 演示中心:观看演示,从为初学者准备的产品安装,到为经验丰富的开发人员准备的高级功能。 讨论 加入 developerWorks 中文社区。探索由开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户进行交流。