用pandas 进行投资分析

让我们进行一个常见的分析,您可能自己就可以完成这个分析。假设您想分析股票绩效,那么您可以:

  • 在 Yahoo 金融专区找一支股票。
  • 下载历史数据,保存为 CSV 文件格式。
  • 将 CSV 文件导入 Excel。
  • 进行数学分析:回归、描述性统计或使用 Excel Solver 工具进行线性优化。

很好,但本文为您展示一种更简单、更直观、功能更强大的方法,使用 IPython 和 pandas 进行同种分析。

工具准备

  • IPython 库是使用 Python 的数据科学家的重要工具之一。该工具与 Excel 的最大不同在于,您可以使用它以交互方式探索来自某个交互式提示符的数据和分析。本文中的示例主要使用 IPython 作为机制来运行它们。
  • Python Data Analysis Library (pandas) 是一个拥有 BSD 许可证的开源库,为 Python 编程语言提供了高性能的、易于使用的数据结构和数据分析工具。

方法/步骤

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
  1. 结束语 在最后交互示例中,您可以通过 11% 的投资组合收益率与 9% 的市场投资组合收益率来战胜股市。在启动对冲基金之前,您可能需了解为什么市场投资组合获得 8% 的标准偏差,而您的投资组合只获得了 2% 的标准偏差。快速回答是,您冒了较大风险,而且只是幸运罢了。进一步的分析涉及到确定 alpha、beta、预期收益,以及进行 Fama-French 和有效边界优化之类的高级分析。 本文中,Python 用于执行临时应急的投资组合分析。Python 逐渐变成用于真实数据分析的首选语言。Pyomo、pandas、Numpy 和 IPython 之类的库使得在 Python 中应用高级数学知识变得更加轻松。

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2015-06-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小石不识月

用粒子群优化算法求解旅行商问题

粒子群优化算法采用一种人工智能的形式来解决问题。这种算法对于求解那些使用了多个连续变化的值的函数来说,尤为有效。这篇文章将会介绍如何修改粒子群算法,以使用离散固...

3808
来自专栏SDNLAB

5G革命的技术,一个都不能少

第五代移动网络简称5G是产业界即将实现的移动技术革命,是LTE-A网络的深层演进技术。5G网络中的关键技术包括MIMO、OFDM、SC-FDMA等。 超密集微型...

42212
来自专栏大数据风控

数据分析中非常实用的自编函数和代码模块整理

大家周末好! 搞了接近四个周的模型开发工作,今天整理代码文件,评分卡模型基本告一段落了。那么在模型开发或者是我们日常的数据分析工作中,根据我们具体的业务需求,经...

23710
来自专栏数据结构与算法

HDU 1847 Good Luck in CET-4 Everybody!(找规律版巴什博奕)

Problem Description 大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和...

3598
来自专栏鹅厂优文

游戏人工智能 读书笔记 (四) AI算法简介——Ad-Hoc 行为编程

本书英文版: Artificial Intelligence and Games - A Springer Textbook

23310
来自专栏大数据文摘

简单易学多维数据可视化R实现:神奇的卡通脸谱图Chernoff faces

3675
来自专栏小鹏的专栏

是AI就躲个飞机-纯Python实现人工智能

代码下载:Here。 很久以前微信流行过一个小游戏:打飞机,这个游戏简单又无聊。在2017年来临之际,我就实现一个超级弱智的人工智能(AI),这货可以躲避从...

9805
来自专栏数据科学与人工智能

【数据挖掘】数据挖掘 特异群组挖掘的框架与应用

特异群组挖掘在证券金融、医疗保险、智能交通、社会网络和生命科学研究等领域具有重要应用价值。特异群组挖掘与聚类、异常挖掘都属于根据数据对象的相似性来划分数据集的数...

26410
来自专栏机器之心

入门 | 玩转词向量:用fastText预训练向量做个智能小程序

5769
来自专栏iOSDevLog

机器学习研究和开发所需的组件列表

Here is a list of components that are needed for the successful machine learning...

952

扫码关注云+社区