时间是阻止所有事情同时发生的力量。——雷•卡明斯

本节使用的是以CSV文件形式在本地存储的金融数据集形式为本地存储的CSV文件。从技术上讲,CSV文件是包含数据行结构的文本文件,其特征是以逗号分隔单个值。在导入数据之前,导入一些软件包并进行定制:

In [1]: import numpy as npimport pandas as pdfrom pylab import mpl, pltplt.style.use('seaborn')mpl.rcParams['font.family'] = 'serif'%matplotlib inline

8.1.1 数据导入

pandas提供不同的函数和DataFrame方法,以导入不同存储格式(CSV、SQL、Excel等)的数据,并将数据导出为不同格式(详见第9章)。下面的代码通过pd.read_csv()函数导入CSV[1]文件中的时间序列数据:

In [2]: filename = '../../source/tr_eikon_eod_data.csv' ❶In [3]: f = open(filename, 'r') ❷f.readlines()[:5] ❷
Out[3]: ['Date,AAPL.O,MSFT.O,INTC.O,AMZN.O,GS.N,SPY,.SPX,.VIX,EUR=,XAU=,GDX,,GLD\n','2010-01-01,,,,,,,,,1.4323,1096.35,,\n','2010-01-04,30.57282657,30.95,20.88,133.9,173.08,113.33,1132.99,20.04,,1.4411,1120.0,47.71,109.8\n','2010-01-05,30.625683660000004,30.96,20.87,134.69,176.14,113.63,1136.52,,19.35,1.4368,1118.65,48.17,109.7\n','2010-01-06,30.138541290000003,30.77,20.8,132.25,174.26,113.71,1137.14,,19.16,1.4412,1138.5,49.34,111.51\n']
In [4]: data = pd.read_csv(filename, ❸index_col=0, ❹parse_dates=True) ❺In [5]: data.info() ❻<class 'pandas.core.frame.DataFrame'>DatetimeIndex: 2216 entries, 2010-01-01 to 2018-06-29Data columns (total 12 columns):AAPL.O    2138 non-null float64MSFT.O    2138 non-null float64INTC.O    2138 non-null float64AMZN.O    2138 non-null float64GS.N      2138 non-null float64SPY       2138 non-null float64.SPX      2138 non-null float64.VIX      2138 non-null float64EUR=      2216 non-null float64XAU=      2211 non-null float64GDX       2138 non-null float64GLD       2138 non-null float64dtypes: float64(12)memory usage: 225.1 KB

❶ 指定路径和文件名。

❷ 显示原始数据(Linux/Mac)的前5行。

❸ 传递给pd.read_scv()函数的文件名。

❹ 指定第一列作为索引处理。

❺ 指定索引值为datetime类型。

❻ 结果为DataFrame对象。

在这一阶段,金融分析师可能首先观察数据,对其进行检查或者可视化(见图8-1):

In [6]: data.head() ❶
Out[6]:AAPL.O MSFT.O INTC.O AMZN.O  GS.N   SPY   .SPX .VIX \Date2010-01-01        NaN    NaN    NaN    NaN   NaN   NaN    NaN  NaN2010-01-04  30.572827 30.950  20.88 133.90 173.08 113.33 1132.99 20.042010-01-05  30.625684 30.960  20.87 134.69 176.14 113.63 1136.52 19.352010-01-06  30.138541 30.770  20.80 132.25 174.26 113.71 1137.14 19.162010-01-07  30.082827 30.452  20.60 130.00 177.67 114.19 1141.69 19.06EUR=    XAU=   GDX    GLDDate2010-01-01  1.4323 1096.35   NaN    NaN2010-01-04  1.4411 1120.00 47.71 109.802010-01-05  1.4368 1118.65 48.17 109.702010-01-06  1.4412 1138.50 49.34 111.512010-01-07  1.4318 1131.90 49.10 110.82In [7]: data.tail() ❷
Out[7]:AAPL.O MSFT.O INTC.O  AMZN.O   GS.N    SPY   .SPX.VIX \Date2018-06-25  182.17  98.39  50.71 1663.15 221.54 271.00 2717.07 17.332018-06-26  184.43  99.08  49.67 1691.09 221.58 271.60 2723.06 15.922018-06-27  184.16  97.54  48.76 1660.51 220.18 269.35 2699.63 17.912018-06-28  185.50  98.63  49.25 1701.45 223.42 270.89 2716.31 16.852018-06-29  185.11  98.61  49.71 1699.80 220.57 271.28 2718.37 16.09EUR=    XAU=   GDX    GLDDate2018-06-25  1.1702 1265.00 22.01 119.892018-06-26  1.1645 1258.64 21.95 119.262018-06-27  1.1552 1251.62 21.81 118.582018-06-28  1.1567 1247.88 21.93 118.222018-06-29  1.1683 1252.25 22.31 118.65In [8]: data.plot(figsize=(10, 12), subplots=True); ❸

图8-1 以线图表示的金融时间序列数据

❶ 前5行。

❷最后5行显示。

❸ 这个语句通过多个子图来可视化整个数据集。

这里使用的数据来自Thomson Reuters (TR) Eikon Data API。TR金融工具代码称作路透金融工具代码(RIC)。RIC表示的金融工具为:

In [9]: instruments = ['Apple Stock', 'Microsoft Stock','Intel Stock', 'Amazon Stock', 'Goldman Sachs Stock','SPDR S&P 500 ETF Trust', 'S&P 500 Index','VIX Volatility Index', 'EUR/USD Exchange Rate','Gold Price', 'VanEck Vectors Gold Miners ETF','SPDR Gold Trust']In [10]: for ric, name in zip(data.columns, instruments):print('{:8s} | {}'.format(ric, name))AAPL.O   | Apple StockMSFT.O   | Microsoft StockINTC.O   | Intel StockAMZN.O   | Amazon StockGS.N     | Goldman Sachs StockSPY      | SPDR S&P 500 ETF Trust.SPX     | S&P 500 Index.VIX     | VIX Volatility IndexEUR=     | EUR/USD Exchange RateXAU=     | Gold PriceGDX      | VanEck Vectors Gold Miners ETFGLD      | SPDR Gold Trust

8.1.2 汇总统计

金融分析师采取的下一个步骤是观察不同的数据集汇总统计,从而对其有个总体的“感觉”:

In [11]: data.info() ❶<class 'pandas.core.frame.DataFrame'>DatetimeIndex: 2216 entries, 2010-01-01 to 2018-06-29Data columns (total 12 columns):AAPL.O    2138 non-null float64MSFT.O    2138 non-null float64INTC.O    2138 non-null float64AMZN.O    2138 non-null float64GS.N      2138 non-null float64SPY       2138 non-null float64.SPX      2138 non-null float64.VIX      2138 non-null float64EUR=      2216 non-null float64XAU=      2211 non-null float64GDX       2138 non-null float64GLD       2138 non-null float64dtypes: float64(12)memory usage: 225.1 KBIn [12]: data.describe().round(2) ❷
Out[12]:AAPL.O  MSFT.O  INTC.O AMZN.O    GS.N    SPY   .SPX .VIX \Count  2138.00 2138.00 2138.00 2138.00 2138.00 2138.00 2138.00 2138.00mean     93.46   44.56   29.36 480.46  170.22 180.32 1802.71  17.03std      40.55   19.53    8.17 372.31   42.48  48.19 483.34   5.88min      27.44   23.01   17.66 108.61   87.70 102.20 1022.58   9.1425%      60.29   28.57   22.51 213.60  146.61 133.99 1338.57  13.0750%      90.55   39.66   27.33 322.06  164.43 186.32 1863.08  15.5875%     117.24   54.37   34.71 698.85  192.13 210.99 2108.94  19.07max     193.98  102.49   57.08 1750.08  273.38 286.58 2872.87  48.00EUR=    XAU=     GDX     GLDcount   2216.00 2211.00 2138.00 2138.00mean       1.25 1349.01   33.57  130.09std        0.11 188.75    15.17   18.78min        1.04 1051.36   12.47  100.5025%        1.13 1221.53   22.14  117.4050%        1.27 1292.61   25.62  124.0075%        1.35 1428.24   48.34  139.00max        1.48 1898.99   66.63  184.59

❶ info()给出DataFrame对象的相关元信息。

❷ describe()提供每列的实用标准统计量。

 

敏锐的洞察力

pandas提供了许多方法如info和describe(),可以获得新导入的金融时间序列数据集的简单概况。它们还能快捷地检查导入程序是否按照要求进行(例如,DataFrame对象是否真正包含DatetimeIndex类型的索引)。

当然,pandas也提供自定义统计类型及显示方式的选项:

In [13]: data.mean() ❶
Out[13]: AAPL.O     93.455973MSFT.O     44.561115INTC.O     29.364192AMZN.O    480.461251GS.N      170.216221SPY       180.323029.SPX     1802.713106.VIX       17.027133EUR=        1.248587XAU=     1349.014130GDX        33.566525GLD       130.086590dtype: float64In [14]: data.aggregate([min, ❷np.mean, ❸np.std, ❹np.median, ❺max] ❻).round(2)
Out[14]:AAPL.O MSFT.O INTC.O  AMZN.O   GS.N    SPY    .SPX.VIX EUR= \min     27.44  23.01  17.66  108.61  87.70 102.20 1022.58 9.14 1.04mean    93.46  44.56  29.36  480.46 170.22 180.32 1802.71 17.03 1.25std     40.55  19.53   8.17  372.31  42.48  48.19  483.34 5.88 0.11median  90.55  39.66  27.33  322.06 164.43 186.32 1863.08 15.58 1.27max    193.98 102.49  57.08 1750.08 273.38 286.58 2872.87 48.00 1.48XAU=   GDX    GLDmin    1051.36 12.47 100.50mean   1349.01 33.57 130.09std     188.75 15.17  18.78median 1292.61 25.62 124.00max    1898.99 66.63 184.59

❶ 每列均值。

❷ 每列最小值。

❸ 每列均值。

❹ 每列标准差。

❺ 每列中位数。

❻ 每列最大值。

使用aggregate方法还可以传递自定义函数。

8.1.3 随时间推移的变化

统计分析方法往往基于随时间推移的变化,而不是绝对值。计算时间序列中的随时变化有多种选择,包括绝对偏差、变化率和对数回报率。

首先介绍绝对偏差,pandas为此提供了一个特殊的方法:

In [15]: data.diff().head() ❶
Out[15]:AAPL.O MSFT.O INTC.O AMZN.O  GS.N SPY .SPX .VIX EUR= \Date2010-01-01       NaN    NaN    NaN    NaN   NaN NaN NaN NaN NaN2010-01-04       NaN    NaN    NaN    NaN   NaN NaN NaN NaN 0.00882010-01-05  0.052857  0.010  -0.01   0.79  3.06 0.30 3.53 -0.69 -0.00432010-01-06 -0.487142 -0.190  -0.07  -2.44 -1.88 0.08 0.62 -0.19 0.00442010-01-07 -0.055714 -0.318  -0.20  -2.25  3.41 0.48 4.55 -0.10 -0.0094XAU=  GDX   GLDDate2010-01-01   NaN   NaN   NaN2010-01-04 23.65   NaN   NaN2010-01-05 -1.35  0.46 -0.102010-01-06 19.85  1.17  1.812010-01-07 -6.60 -0.24 -0.69
In [16]: data.diff().mean() ❷
Out[16]: AAPL.O    0.064737MSFT.O    0.031246INTC.O    0.013540AMZN.O    0.706608GS.N      0.028224SPY       0.072103.SPX      0.732659.VIX     -0.019583EUR=     -0.000119XAU=      0.041887GDX      -0.015071GLD      -0.003455dtype: float64

❶ diff提供两个索引值之间的绝对变化。

❷ 当然,还可以应用聚合运算。

从统计学角度讲,绝对变化不是最优的,因为它们与时间序列数据本身的比例相关。因此,我们通常更偏重变化率。下面的代码可以计算金融环境里的变动率或者回报率(也称为简单回报率),并对其每列的平均值进行可视化(参见图8-2):

In [17]: data.pct_change().round(3).head() ❶
Out[17]:AAPL.O MSFT.O INTC.O AMZN.O GS.N SPY .SPX .VIX EUR= \Date2010-01-01   NaN    NaN    NaN   NaN   NaN   NaN   NaN   NaN    NaN2010-01-04   NaN    NaN    NaN   NaN   NaN   NaN   NaN   NaN  0.0062010-01-05 0.002  0.000 -0.000 0.006  0.018 0.003 0.003 -0.034 -0.0032010-01-06 -0.016 -0.006 -0.003 -0.018 -0.011 0.001 0.001 -0.010 0.0032010-01-07 -0.002 -0.010 -0.010 -0.017  0.020 0.004 0.004 -0.005 -0.007XAU= GDX GLDDate2010-01-01    NaN    NaN    NaN2010-01-04  0.022    NaN    NaN2010-01-05 -0.001  0.010 -0.0012010-01-06  0.018  0.024  0.0162010-01-07 -0.006 -0.005 -0.006
In [18]: data.pct_change().mean().plot(kind='bar', figsize=(10, 6)); ❷

❶ pct_change()计算两个索引值之间的变化率。

❷ 将结果的均值可视化为一个柱状图。

图8-2 变化率均值柱状图

对数回报率可作为回报率的替代品。在某些情况下,它们更容易处理,因此在金融环境中往往优先使用对数回报率。[2]

图8-3展示了单个金融时间序列的累计对数回报率。这种类型的图表导致了某种形式的规范化:

图8-3 一段时间的累计对数回报率

In [19]: rets = np.log(data / data.shift(1))❶In [20]: rets.head().round(3) ❷
Out[20]:AAPL.O MSFT.O INTC.O AMZN.O GS.N SPY .SPX .VIX EUR= \Date2010-01-01     NaN   NaN    NaN    NaN    NaN  NaN  NaN   NaN   NaN2010-01-04     NaN   NaN    NaN    NaN    NaN  NaN  NaN   NaN  0.0062010-01-05   0.002  0.000 -0.000  0.006  0.018 0.003 0.003 -0.035 -0.0032010-01-06  -0.016 -0.006 -0.003 -0.018 -0.011 0.001 0.001 -0.010 0.0032010-01-07  -0.002 -0.010 -0.010 -0.017  0.019 0.004 0.004 -0.005 -0.007XAU= GDX GLDDate2010-01-01    NaN    NaN    NaN2010-01-04  0.021    NaN    NaN2010-01-05 -0.001  0.010 -0.0012010-01-06  0.018  0.024  0.0162010-01-07 -0.006 -0.005 -0.006In [21]: rets.cumsum().apply(np.exp).plot(figsize=(10, 6)); ❸

❶ 以向量的方式计算对数回报率。

❷ 结果的一个子集。

❸ 绘制一段时间的累计对数回报率图表;首先调用cumsum()方法,然后对结果应用np.exp()。

8.1.4 重新采样

重新采样是金融时间序列数据的重要操作之一,通常采用向下采样的形式,例如,分笔交易数据序列重新采样的时间间隔为一分钟,也可以将每日观察数据的时间序列重新采样为每周或者每月观察数据(如图8-4所示):

In [22]: data.resample('1w', label='right').last().head() ❶
Out[22]:AAPL.O MSFT.O INTC.O AMZN.O   GS.N    SPY   .SPX .VIX \Date2010-01-03        NaN    NaN   NaN   NaN    NaN    NaN    NaN   NaN2010-01-10  30.282827  30.66 20.83 133.52 174.31 114.57 1144.98 18.132010-01-17  29.418542  30.86 20.80 127.14 165.21 113.64 1136.03 17.912010-01-24  28.249972  28.96 19.91 121.43 154.12 109.21 1091.76 27.312010-01-31  27.437544  28.18 19.40 125.41 148.72 107.39 1073.87 24.62EUR=    XAU=   GDX    GLDDate2010-01-03  1.4323 1096.35   NaN    NaN2010-01-10  1.4412 1136.10 49.84 111.372010-01-17  1.4382 1129.90 47.42 110.862010-01-24  1.4137 1092.60 43.79 107.172010-01-31  1.3862 1081.05 40.72 105.96In [23]: data.resample('1m', label='right').last().head() ❷
Out[23]:AAPL.O MSFT.O INTC.O AMZN.O   GS.N      SPY    .SPX \Date2010-01-31  27.437544 28.1800 19.40 125.41 148.72 107.3900 1073.872010-02-28  29.231399 28.6700 20.53 118.40 156.35 110.7400 1104.492010-03-31  33.571395 29.2875 22.29 135.77 170.63 117.0000 1169.432010-04-30  37.298534 30.5350 22.84 137.10 145.20 118.8125 1186.692010-05-31  36.697106 25.8000 21.42 125.46 144.26 109.3690 1089.41.VIX   EUR=    XAU=   GDX     GLDDate2010-01-31  24.62 1.3862 1081.05 40.72 105.9602010-02-28  19.50 1.3625 1116.10 43.89 109.4302010-03-31  17.59 1.3510 1112.80 44.41 108.9502010-04-30  22.05 1.3295 1178.25 50.51 115.3602010-05-31  32.07 1.2305 1215.71 49.86 118.881In [24]: rets.cumsum().apply(np.exp). resample('1m', label='right').last().plot(figsize=(10, 6)); ❸

❶ 日终数据以一周为时间间隔重新采样。

❷ 以一月为时间间隔重新采样。

❸ 这就绘制了随时间变化的累计对数回报率图表:首先调用cumsun(),然后对结果应用np.exp,最后进行重新采样。

图8-4 重采样的累计对数回报率图表(每月)

 

避免预见偏差

在很多情况下,pandas在重新采样时默认使用区间的左侧标签(或者索引值)。为了在金融业务中保持一致,请确保使用右标签(索引值)——一般是区间内最后一个可用数据点。否则,金融分析中可能潜藏着预见偏差。

本文摘自《Python金融大数据分析 第2版》

  • 金融科技算法交易量化金融教程书籍
  • 详细讲解使用Python分析处理金融大数据的专业图书
  • 将人工智能应用于金融开发的实战指南,金融应用开发领域从业人员的常备读物

《Python金融大数据分析 第2版》分为5部分,共21章。第1部分介绍了Python在金融学中的应用,其内容涵盖了Python用于金融行业的原因、Python的基础架构和工具,以及Python在计量金融学中的一些具体入门实例;第2部分介绍了Python的基础知识以及Python中非常有名的库NumPy和pandas工具集,还介绍了面向对象编程;第3部分介绍金融数据科学的相关基本技术和方法,包括数据可视化、输入/输出操作和数学中与金融相关的知识等;第4部分介绍Python在算法交易上的应用,重点介绍常见算法,包括机器学习、深度神经网络等人工智能相关算法;第5部分讲解基于蒙特卡洛模拟开发期权及衍生品定价的应用,其内容涵盖了估值框架的介绍、金融模型的模拟、衍生品的估值、投资组合的估值等知识。

《Python金融大数据分析 第2版》本书适合对使用Python进行大数据分析、处理感兴趣的金融行业开发人员阅读。

Python金融大数据分析:用pandas处理金融时间序列数据的基础知识相关推荐

  1. python金融大数据分析视频_Python金融大数据分析 PDF 全书超清版

    给大家带来的一篇关于Python相关的电子书资源,介绍了关于Python金融.大数据分析方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小47.8 MB,希尔皮斯科编写,目前豆瓣.亚马逊. ...

  2. python与金融数据分析论文_python 金融大数据分析 pdf

    python 金融大数据分析 pdf相关的博客 查看更多 写博客 作者: skin778 966人浏览 评论数:0 6个月前 ![5_6_3](https://yqfile.alicdn.com/b5 ...

  3. 金融科技、算法交易、量化金融必读书:Python金融大数据分析第2版

    银行本质上是技术公司. --胡戈•班齐格 近来,Python无疑是金融业的重要策略性技术平台之一.到2018年底,这已经不再是个问题:全世界的金融机构现在都尽最大努力利用Python及其强大的数据分析 ...

  4. 计算机编程书籍-Python金融大数据分析

    Python金融大数据分析 [德] 伊夫·希尔皮斯科(Yves Hilpisch) 著,姚军 译 ISBN:9787115521330 包装:平装 开本:16开 正文语种:中文 出版社:人民邮电出版社 ...

  5. python金融数据分析电子版_python 金融大数据分析 pdf

    书籍:Python金融大数据分析 Python for Finance_ Mastering Data-Driven Finance 2nd - 2019.pdf 简介 金融业最近以极高的速度采用了P ...

  6. python for finance pdf_python金融大数据分析 pdf

    书籍:Python金融大数据分析 Python for Finance_ Mastering Data-Driven Finance 2nd - 2019.pdf 简介 金融业最近以极高的速度采用了P ...

  7. python统计分析pdf下载_Python金融大数据分析PDF高清文档下载

    Python凭借其简单.易读.可扩展性以及拥有巨大而活跃的科学计算社区,在需要分析.处理大量数据的金融行业得到了广泛而迅速的应用,并且成为该行业开发核心应用的shouxuan编程语言.<Pyth ...

  8. python金融大数据分析笔记----第十章 2(风险测量)

    10.4 风险测量 VaR CVaR 10.4.1. 风险价值(Var) VaR(Value at Risk,风险价值或风险溢价)是度量一项投资或投资组合可能产生的下跌风险的方法,它描述的是在一定的概 ...

  9. python金融pdf下载_Python金融大数据分析 完整版 中文pdf扫描版[42MB]

    Python凭借其简单.易读.可扩展性以及拥有巨大而活跃的科学计算社区,在需要分析.处理大量数据的金融行业得到了广泛而迅速的应用,并且成为该行业开发核心应用的shouxuan编程语言.<Pyth ...

最新文章

  1. MIT有个做披萨的GAN,登上了CVPR:加香肠、去橄榄、再烤熟,分层才是王道
  2. 【Android 安全】DEX 加密 ( Java 工具开发 | 加密解密算法 API | 编译代理 Application 依赖库 | 解压依赖库 aar 文件 )
  3. 从零开始内建你的安全测试流程
  4. 【Java心得总结六】Java容器中——Collection
  5. VSCode如何关闭右侧预览功能 - 截图示下
  6. “云计算和大数据”重点专项2017年度项目安排公示
  7. 基于tcp协议的客户机与服务器通信程序的设计 c++,TCP服务器端和客户端程序设计...
  8. 微信外卖点餐系统开发教程
  9. scratch游戏中背景移动的奥秘
  10. 地形剖面matlab,基于MATLAB河道横断面绘制.doc
  11. checkbox 选中_山西男篮热身赛两胜江苏 张宁首秀表现不俗 为什么会选中他?
  12. APP开发:教你从零开始制作一个APP
  13. 深圳大学大学计算机考试科目,深圳大学计算机考研科目有哪些
  14. 【ESP 保姆级教程 预告】疯狂Node.js服务器篇 ——案例:ESP8266 + DHT11 +NodeJs本地服务+ MySQL数据库
  15. html+ul隐藏滚动条,2种方法实现CSS隐藏滚动条并可以滚动内容的方法
  16. ubuntu设置网卡默认启动_ubuntu 网络配置
  17. 移动端实现拖曳核心思想
  18. 使用NSIS制作多版本Revit插件(Revit二次开发)
  19. 下载 | 5 本程序员成长必读书籍
  20. 第十一章 文件处理(IO)(下)

热门文章

  1. 靠智慧教育“飞升”,科大讯飞前路漫漫
  2. 构建和配置更安全的网站
  3. 成功解决LINK : fatal error LNK1181: 无法打开输入文件“avdevice.lib” error: command 'D:\\Program Files (x86)\\Micr
  4. 《拥抱机器人时代——Servo杂志中文精华合集》——4.5 审视无线技术
  5. 武汉理工计算机与名校的差距
  6. 《操作系统》第三章 知识点整理
  7. 互联网小现象:BAT疯狂投资,网易为何单打独斗?
  8. 51Nod-1355-斐波那契的最小公倍数
  9. asp.net(c#)字符串转换成字符数组 字符串转换成int 数组
  10. 我们是科幻迷(刘慈欣)