用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 用户进行交流。

(0)

相关推荐

  • Python pandas DataFrame 合并

    Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的数据模型,提供了高 ...

  • pandas教程:[1]DataFrame入门

    操作方法 01 pandas是python环境下最有名的数据统计包,而DataFrame翻译为数据框,是一种数据组织方式,这么说你可能无法从感性上认识它,举个例子,你大概用过Excel,而它也是一种数 ...

  • Python提示No module named pandas 解决方法

    python这种程序设计语言,得到很多程序员的喜欢,网络上很多现成的源程序及代码可以直接使用,比如说最近流行的微信跳一跳,有朋友就用python开发了工具,但在运行中发现会有些小问题,今天给大伙分享的 ...

  • window7下安装并使用python pandas

    在pandas中有两类非常重要的数据结构,即序列Series和数据框DataFrame.分析数据是比较好的 操作方法 01 视窗键+r调出输入命令行的窗口,填写cmd 02 执行命令pip insta ...

  • Windows系统安装Python数据分析库pandas

    pandas是一款强大的Python数据分析库.这里介绍下如何安装,以及安装过程中可能会出现的问题及其解决办法. 操作方法 01 搜索pandas,进入官网,查看简介.可以从官网下载安装包进行安装. ...

  • 如何使用Python的Pandas库绘制折线图

    我们经常会使用Python的Pandas绘制各种数据图形,那么如何使用它绘制折线图呢?下面小编给大家分享一下. 操作方法 01 首先我们需要打开Excel软件准备需要的数据,这里多准备几列数据,一列就 ...

  • 如何利用Python中的Pandas库绘制柱形图

    我们利用Python的Pandas库可以绘制很多图形,那么如何绘制柱形图呢?下面小编给大家分享演示一下. 操作方法 01 首先我们打开Excel文件,准备要生成柱形图的数据表,如下图所示 02 接下来 ...

  • Python中如何利用Pandas读取Excel中的数据

    我们利用Python操作Excel的时候,经常需要读取数据,这个时候就会用到Pandas库了,那么如何运用Pandas读取Excel中的数据呢?下面小编给大家分享一下. 操作方法 01 首先我们打开E ...

  • pandas读取某一行的数据(pandas数据可视化)

    导读:Pandas是一个基于Numpy库开发的更高级的结构化数据分析工具,提供了Series.DataFrame.Panel等数据结构,可以很方便地对序列.截面数据(二维表).面板数据进行处理.作者: ...