用pandas 进行投资分析

时间:2022-05-03
本文章向大家介绍用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 中应用高级数学知识变得更加轻松。