时刻是阻挠一切工作同时发生的力气。雷?卡明斯
本节运用的是以CSV文件办法在本地存储的金融数据集办法为本地存储的CSV文件。从技能上讲,CSV文件是包含数据行结构的文本文件,其特征是以逗号分隔单个值。在导入数据之前,导入一些软件包并进行定制:
In [1]: import numpy as np import pandas as pd from pylab import mpl, plt plt.style.use('seaborn') mpl.rcParams['font.family'] = 'serif' %matplotlib inline8.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-29 Data columns (total 12 columns): AAPL.O 2138 non-null float64 MSFT.O 2138 non-null float64 INTC.O 2138 non-null float64 AMZN.O 2138 non-null float64 GS.N 2138 non-null float64 SPY 2138 non-null float64 .SPX 2138 non-null float64 .VIX 2138 non-null float64 EUR= 2216 non-null float64 XAU= 2211 non-null float64 GDX 2138 non-null float64 GLD 2138 non-null float64 dtypes: 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 \ Date 2010-01-01 NaN NaN NaN NaN NaN NaN NaN NaN 2010-01-04 30.572827 30.950 20.88 133.90 173.08 113.33 1132.99 20.04 2010-01-05 30.625684 30.960 20.87 134.69 176.14 113.63 1136.52 19.35 2010-01-06 30.138541 30.770 20.80 132.25 174.26 113.71 1137.14 19.16 2010-01-07 30.082827 30.452 20.60 130.00 177.67 114.19 1141.69 19.06 EUR= XAU= GDX GLD Date 2010-01-01 1.4323 1096.35 NaN NaN 2010-01-04 1.4411 1120.00 47.71 109.80 2010-01-05 1.4368 1118.65 48.17 109.70 2010-01-06 1.4412 1138.50 49.34 111.51 2010-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 \ Date 2018-06-25 182.17 98.39 50.71 1663.15 221.54 271.00 2717.07 17.33 2018-06-26 184.43 99.08 49.67 1691.09 221.58 271.60 2723.06 15.92 2018-06-27 184.16 97.54 48.76 1660.51 220.18 269.35 2699.63 17.91 2018-06-28 185.50 98.63 49.25 1701.45 223.42 270.89 2716.31 16.85 2018-06-29 185.11 98.61 49.71 1699.80 220.57 271.28 2718.37 16.09 EUR= XAU= GDX GLD Date 2018-06-25 1.1702 1265.00 22.01 119.89 2018-06-26 1.1645 1258.64 21.95 119.26 2018-06-27 1.1552 1251.62 21.81 118.58 2018-06-28 1.1567 1247.88 21.93 118.22 2018-06-29 1.1683 1252.25 22.31 118.65 In [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 Stock MSFT.O | Microsoft Stock INTC.O | Intel Stock AMZN.O | Amazon Stock GS.N | Goldman Sachs Stock SPY | SPDR S&P 500 ETF Trust .SPX | S&P 500 Index .VIX | VIX Volatility Index EUR= | EUR/USD Exchange Rate XAU= | Gold Price GDX | VanEck Vectors Gold Miners ETF GLD | SPDR Gold Trust8.1.2 汇总核算金融剖析师采纳的下一个过程是调查不同的数据集汇总核算,从而对其有个整体的“感觉”:
In [11]: data.info() ? <class 'pandas.core.frame.DataFrame'> DatetimeIndex: 2216 entries, 2010-01-01 to 2018-06-29 Data columns (total 12 columns): AAPL.O 2138 non-null float64 MSFT.O 2138 non-null float64 INTC.O 2138 non-null float64 AMZN.O 2138 non-null float64 GS.N 2138 non-null float64 SPY 2138 non-null float64 .SPX 2138 non-null float64 .VIX 2138 non-null float64 EUR= 2216 non-null float64 XAU= 2211 non-null float64 GDX 2138 non-null float64 GLD 2138 non-null float64 dtypes: 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.00 mean 93.46 44.56 29.36 480.46 170.22 180.32 1802.71 17.03 std 40.55 19.53 8.17 372.31 42.48 48.19 483.34 5.88 min 27.44 23.01 17.66 108.61 87.70 102.20 1022.58 9.14 25% 60.29 28.57 22.51 213.60 146.61 133.99 1338.57 13.07 50% 90.55 39.66 27.33 322.06 164.43 186.32 1863.08 15.58 75% 117.24 54.37 34.71 698.85 192.13 210.99 2108.94 19.07 max 193.98 102.49 57.08 1750.08 273.38 286.58 2872.87 48.00 EUR= XAU= GDX GLD count 2216.00 2211.00 2138.00 2138.00 mean 1.25 1349.01 33.57 130.09 std 0.11 188.75 15.17 18.78 min 1.04 1051.36 12.47 100.50 25% 1.13 1221.53 22.14 117.40 50% 1.27 1292.61 25.62 124.00 75% 1.35 1428.24 48.34 139.00 max 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.455973 MSFT.O 44.561115 INTC.O 29.364192 AMZN.O 480.461251 GS.N 170.216221 SPY 180.323029 .SPX 1802.713106 .VIX 17.027133 EUR= 1.248587 XAU= 1349.014130 GDX 33.566525 GLD 130.086590 dtype: 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.04 mean 93.46 44.56 29.36 480.46 170.22 180.32 1802.71 17.03 1.25 std 40.55 19.53 8.17 372.31 42.48 48.19 483.34 5.88 0.11 median 90.55 39.66 27.33 322.06 164.43 186.32 1863.08 15.58 1.27 max 193.98 102.49 57.08 1750.08 273.38 286.58 2872.87 48.00 1.48 XAU= GDX GLD min 1051.36 12.47 100.50 mean 1349.01 33.57 130.09 std 188.75 15.17 18.78 median 1292.61 25.62 124.00 max 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= \ Date 2010-01-01 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2010-01-04 NaN NaN NaN NaN NaN NaN NaN NaN 0.0088 2010-01-05 0.052857 0.010 -0.01 0.79 3.06 0.30 3.53 -0.69 -0.0043 2010-01-06 -0.487142 -0.190 -0.07 -2.44 -1.88 0.08 0.62 -0.19 0.0044 2010-01-07 -0.055714 -0.318 -0.20 -2.25 3.41 0.48 4.55 -0.10 -0.0094 XAU= GDX GLD Date 2010-01-01 NaN NaN NaN 2010-01-04 23.65 NaN NaN 2010-01-05 -1.35 0.46 -0.10 2010-01-06 19.85 1.17 1.81 2010-01-07 -6.60 -0.24 -0.69In [16]: data.diff().mean() ?Out[16]: AAPL.O 0.064737 MSFT.O 0.031246 INTC.O 0.013540 AMZN.O 0.706608 GS.N 0.028224 SPY 0.072103 .SPX 0.732659 .VIX -0.019583 EUR= -0.000119 XAU= 0.041887 GDX -0.015071 GLD -0.003455 dtype: 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= \ Date 2010-01-01 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2010-01-04 NaN NaN NaN NaN NaN NaN NaN NaN 0.006 2010-01-05 0.002 0.000 -0.000 0.006 0.018 0.003 0.003 -0.034 -0.003 2010-01-06 -0.016 -0.006 -0.003 -0.018 -0.011 0.001 0.001 -0.010 0.003 2010-01-07 -0.002 -0.010 -0.010 -0.017 0.020 0.004 0.004 -0.005 -0.007 XAU= GDX GLD Date 2010-01-01 NaN NaN NaN 2010-01-04 0.022 NaN NaN 2010-01-05 -0.001 0.010 -0.001 2010-01-06 0.018 0.024 0.016 2010-01-07 -0.006 -0.005 -0.006In [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= \ Date 2010-01-01 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2010-01-04 NaN NaN NaN NaN NaN NaN NaN NaN 0.006 2010-01-05 0.002 0.000 -0.000 0.006 0.018 0.003 0.003 -0.035 -0.003 2010-01-06 -0.016 -0.006 -0.003 -0.018 -0.011 0.001 0.001 -0.010 0.003 2010-01-07 -0.002 -0.010 -0.010 -0.017 0.019 0.004 0.004 -0.005 -0.007 XAU= GDX GLD Date 2010-01-01 NaN NaN NaN 2010-01-04 0.021 NaN NaN 2010-01-05 -0.001 0.010 -0.001 2010-01-06 0.018 0.024 0.016 2010-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 \ Date 2010-01-03 NaN NaN NaN NaN NaN NaN NaN NaN 2010-01-10 30.282827 30.66 20.83 133.52 174.31 114.57 1144.98 18.13 2010-01-17 29.418542 30.86 20.80 127.14 165.21 113.64 1136.03 17.91 2010-01-24 28.249972 28.96 19.91 121.43 154.12 109.21 1091.76 27.31 2010-01-31 27.437544 28.18 19.40 125.41 148.72 107.39 1073.87 24.62 EUR= XAU= GDX GLD Date 2010-01-03 1.4323 1096.35 NaN NaN 2010-01-10 1.4412 1136.10 49.84 111.37 2010-01-17 1.4382 1129.90 47.42 110.86 2010-01-24 1.4137 1092.60 43.79 107.17 2010-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 \ Date 2010-01-31 27.437544 28.1800 19.40 125.41 148.72 107.3900 1073.87 2010-02-28 29.231399 28.6700 20.53 118.40 156.35 110.7400 1104.49 2010-03-31 33.571395 29.2875 22.29 135.77 170.63 117.0000 1169.43 2010-04-30 37.298534 30.5350 22.84 137.10 145.20 118.8125 1186.69 2010-05-31 36.697106 25.8000 21.42 125.46 144.26 109.3690 1089.41 .VIX EUR= XAU= GDX GLD Date 2010-01-31 24.62 1.3862 1081.05 40.72 105.960 2010-02-28 19.50 1.3625 1116.10 43.89 109.430 2010-03-31 17.59 1.3510 1112.80 44.41 108.950 2010-04-30 22.05 1.3295 1178.25 50.51 115.360 2010-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进行大数据剖析、处理感兴趣的金融职业开发人员阅览。