用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
- 结束语 在最后交互示例中,您可以通过 11% 的投资组合收益率与 9% 的市场投资组合收益率来战胜股市。在启动对冲基金之前,您可能需了解为什么市场投资组合获得 8% 的标准偏差,而您的投资组合只获得了 2% 的标准偏差。快速回答是,您冒了较大风险,而且只是幸运罢了。进一步的分析涉及到确定 alpha、beta、预期收益,以及进行 Fama-French 和有效边界优化之类的高级分析。 本文中,Python 用于执行临时应急的投资组合分析。Python 逐渐变成用于真实数据分析的首选语言。Pyomo、pandas、Numpy 和 IPython 之类的库使得在 Python 中应用高级数学知识变得更加轻松。
- java多线程下如何调用一个共同的内存单元(调用同一个对象)
- java之多线程(Thread)
- HDUOJ------3336 Count the string(kmp)
- hduoj------2594 Simpsons’ Hidden Talents
- 通过Xtrabackup日志来恢复检查点文件
- POJ--2158--------------Milking Grid(最小覆盖字符矩阵)---(开二维kmp)
- poj-------------(2752)Seek the Name, Seek the Fame(kmp)
- hust--------The Minimum Length (最短循环节)(kmp)
- hdu-----(3746)Cyclic Nacklace(kmp)
- javaSE之如何将一个文件复制到另一个文件
- 将文件字节输出流写入到文本中
- javaSE之如何将一个文档显示出来(,txt,.doc,.....)
- Git -- 分支与合并 (命令行+可视化工具p4merge)
- java之如何实现调用启动一个可执行文件,exe
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- c语言二级指针的使用,malloc内存申请
- istio部署模型
- 你所不知道的printf函数
- c语言之——整型的隐式转换与溢出检测
- Istio 的配置分析
- (C99)复合字面量
- 排障集锦:九九八十一难之第十三难!-------------史上最全MySQL 单实例故障排查
- c语言数组越界的避免方法
- 单片机的存储区范例
- 大点干!早点散----------Nginx+Tomcat动静分离
- 大点干!早点散----------深入剖析缓存加速--squid传统代理和透明代理
- stm32 HardFault_Handler调试及问题查找方法——飞思卡尔
- 堆栈的分布
- memset()函数的使用
- 质量保障的方法和实践