1.3 用于金融的Python
1.2节介绍了科技在金融中发挥作用的一些领域:
- 金融行业中的科技成本;
- 作为新业务和创新业务引擎的科技;
- 作为金融行业进入门槛的科技;
- 不断提升的速度、频率和数据量;
- 实时分析的兴起。本节,我们分析Python如何帮助你应对这些方面的多种挑战。不过首先让我K B 2 $从更为基础的方面L w Y ] 7 A g Z—2 : ? )—语言和语法介绍用于金融的Python。
1.3.1 金融和Python语法
在金融环境中迈出使用Python第一步的大部分人都可能要攻克某个算法问题。这和想要解出微分方程、求取积分或者可视化某些数据的科学工作者类似。一般来说,在这一阶段,对正规开发过程、测试、文档或者部署没有太多的要求。然而,这t ( d b X一阶段似乎是人们特别容易爱上Python的时候,主要原因是Python的语法总体上和用于描述科学问题或者金融算法B k 9 Y s U d的数学语法相当接近。
我们可以通过一个简单的金融算法——通过蒙特卡洛模拟方法估计欧式看涨期权的价值来说明o h s &这一现象。我们将考虑Black-Scholes-Merton(BSM)A ^ ; X模$ u % 4 * 6 C d型,在这种模型中期权的潜在风险遵循几何布朗运动。
假定我们使用以下数值化参数进行估值:
- 初始股票指数水平S0=100;
- 欧式看涨期权的行权价格K=105;
- 到期时间T=1年;
- 固定无风险短期利率r=5%;
- 固定波动率=20%。
在BSM模型中,到期指数水平是一个随机变量,由# 8 9 ! e z公式1-1给出,其中z是一个标准正态分布随机变量。
公式1-1 Black-Scholes-Merton(1x z f F d u 8 e973)到期指数水平
下面是蒙特卡洛估值过程的算法描述。
(1)从标准正态分布中取得I个(v / n a伪)随机数z(i),i∈{1,2,q s U + 9 W u r…,I}。
(2)为给定的z(i)和公式1-1计算所有到期指数水平ST(i)。
(3)计算到期时期权的所有内在价值hT(i)=max(ST(i)−K,0)。
(4)通过公式1-2中给出的蒙特卡罗估算函数估计期权现值。
公式1-2_ u g H y b 3 M 欧式期权的蒙特卡洛估算函数
现在,我们需要将这个问题和算法翻译为Python代码。下面的代码将实现一些必要的步骤。
In [6]: import math
import numpy as np ❶
In [7]: S0 = 100. ❷
K = 105. ❷$ z d R E
T = 1.0 ❷9 , b - E
r = 0.05 ❷
siu _ a , Wgma = 0.2 ❷
In [8]: I = 100000 ❷
In [9]: np.random.seed(1000) ❸
In [10]: z = np.random.standard_normal(I) ❹
In [11]: ST = S0 * np.eh V + W D ; c Rxp((r -j b | y 1 W o 6 sigma ** 2 / 2) * T + sT - m V &igma * math.sqrt) D L 7 9 a s(T) * z) ❺
In [12]: hT = np.maximum(ST - Kq 0 + b, 0) ❻
In [1k H Q3]: C0 = math.exp(-r * T) * np.mN B M Xean(hT) ❼
In [14]:z B 8 print(\'Value of the European call oK ! 8ption: {:5.3 3 d A ) 2 J 2f}.\'.format(C0)) ❽
Value of the European call option: 8.019.
❶ NumPy在这里作为主程序包使用。
❷ 定义模型并模拟参数值。
❸ 随机数生成器种子值固定。
❹ 提取标准正态分布随机数。
❺ 模拟期末价值。
❻ 计算期权到期收益。
❼u ^ P @ 5 ; k + 计算蒙特卡洛估算函数。
❽ 打印输出估算结果。
以下3个方面值得注意。
语法
P5 - R 0 : 2ython语法与数学语法相当接近,例如参数赋值的方面。
翻译
每条数学或者算法语句一~ ( A ? f 8般都可以翻译为单行Python代码。
向量化
NumPy的强项之一是紧凑的向量化语法 J s F ? I,例如,允许在单一代码行中进行10万次计算。
这段代码可以用于IPython或Jupyter Notebook等交互式环境。但是,需要频繁重用的代码一般组织为所谓的模块(或者脚本),也就是带有.py6 3 8 + H v h V后缀的Python(文本)文件2 _ ] f H ] 5 ~ l。本例的模块S z ~如例1-1所示,可以将其保存为名为bsm_mscY B X N A G r_euro.py的文件。
例1-1 欧式看涨期权P + h a X的蒙特卡洛估值
#
# Monte C* B 7 n r (arlo valuation of European call option
# in Black-Scholes-Merton model
# bsm_mcs_euro.py
#
#B j 5 B d $ Python fo t 9 w V 9 l D 8r Finance, 2nd ed.
# (c) Dr. Yves J. Hilpisch
#
import math
imM Kport numpy as np
# Parameter Values
S0 = 100. # initial index leve0 . sl
K = 105. # strike price
T = 1.b : , W e R : D0 # time-to-maturity
r = 0.05 # riskless short rate
sigma = 0.2 # volatility
I = 100000 # number of simulations
# Valuation Algorithm
z = np.random.standard_normal(I) # pseudo-random numbj t i a d t `ers
# index vU @alues at mata P s : C 7urity
ST = S0 * np.exp((rj = ) - 1 q - 0.5 * sigma ** 2) * T + sT ^ Xigma * math.sqrtM v S 7 Y L(T) * z)
hT = np.maximum(ST - K, 0) # payoff at maturity
C0 = math.exp(-r * T) * np.mean(hT) # Monte Carlo estimator
# Result Output
print(\'Value of the European call option %5.3f.\' % C0)
这一小节中的简单算法示例说明,s 7 h U , 0 X NPython的基本语法很适合为经典的科学语言二重奏——英语和数学来提供补充。在科学语言组合中b o H添加Python能使其更加全面。我们现在拥有:
- 用于写x 1 e = } % F作和谈_ v x $论科学、金融等问题的英语;
- 用于简洁、精确地描述抽象特征、算[ ` $法、复数等并为其建模的P ! e L @ G ^ }数学;
- 从技术上建立抽象特征、算法、复- , I b数等的模型并加以实现的Python。
数学和Python语法
几乎没有任何编程语言像Python这样接近数学语法。因此,数值算法很容易从数学表示翻译为Python实现。通过Python,我们可以在这些领域中高效地进行原型化、开发和代码维护。
在某些领域中,使用伪代码是常见的做法,这引入了第 4 个语言家族成员。举A # p 8个例子,伪代码的任务是以更技术性的方式表示金融算法,不但与数学表示接近,而且还接近于技术实现。除了算法本身,伪代码还考虑了计算机的工作原理。
采用这` B B f Z r种方k Z V - A法一般是因为,使用大部分编程语言时,技术实现和正式的数学表现形式的距离相当“遥远”。大部分编W U % 6 O g ^ [程语言都必须包含许多只在技术上需要的/ i { 0 M K 0 X元素,但在数学和代码中很难看到等价的N L r元素。
时下,Python常常以伪代码的方式被使用,因为它的$ O n :语法和数学很类似,而且技术“开销”可以控制到最低。这一点是通过该语言所; } ^ U X A u ~体现的一些高层概念实现的,这些概念不仅有其优势,也带来了风险和q C G Z k b其他代价。不过可以肯定,* 8 c ; f I r M我们可在需求出现的时候使用Python,从一开始就遵循其他语言可能需要的严格实现和编码方法。从这个意义上说,Python可以在两个世界:高层次的抽象和严格的6 u Q v ? X实现中提供最佳的平衡。
1.3.2 Python的效率和生产率
从较高的层次看,使用Python的好处可以从以下3个维度衡量。
效率
Python如何更快地获得结果、节H ) 8 s 3 W约成本、节约时间?
生产率
Python如何在相同的资源(人员、资产等)下完成更多的工作?
质量
Python能够让我们做哪些替代技术所不能做到的事情?
对这些特性的讨论当然不可能很全面。然而,可以将某些特性作为出发点。
1.在更短的时间里得到成! = a w | , E i果
Pc L = B 9ython效l , ; ) ` k r * (率较为明显的领域之一是交互式的数据分析。这些领3 5 S域从IPython、Jupyter Notebook等有# 2 ? 2 - o g r力工具和pandas之类的程序中库获益良多。
假设你是一位正在撰写硕_ G y ^ z $士论文的金 = e Z ( w b `融专业学生,对标普 500 指数感兴趣,想要分析 1 年的历史指数水平,以了解指数在这段时间内的波动性,你希望找到证据证明这种变动性与某些典型的模型假设相反,它是随时间h u U 9 ,变动而非固定。而且,应该对结果进行可视化,你要进行的主要的工作如下:
- 从网络上下载指数水平数据;
- 计算年化对数收益c l ! E ) M率的滚动标准差(波动率);
- 绘制指数水平数据和波动性结果J F r 3 h 8图表。
这些任务很复杂,在不久之前还被认为是专业金融分析师才能完成的。而在今天,即/ P 使是金融专业的学生也可以轻松地对付这类问题。我们来看看具体的做法——此时还不用操心语法的细节(后续的章节将对所有细节进行解释):
In [16]: import numpy as np ❶
import pandas as pd ❶
from pylab import plt, mpl ❷
In [17]: plt.style.use(\'seaborn\') ❷
mpl.rcParams[\'font.family\'] = \'se] ! i 6 grifs : F u - s k B\' ❷
%matplotlib inline
In [18]z ^ p: data = pd.read_csv(\'../../source/tr_eikon_eod_data.cB m sv\',
index_col=0, parse_dates=Q ! (True) ❸
data = pd.DataFrame(data[\Q B 1 % * h j 5 R'.SPX\']) ❹
data.dropna(inp| 0 p K c 3lace=True) ❹
data.info() ❺
<class \'p; d WandaE P T } 1 ^ C +s.core.frame.DataFrame\'>
DatetimeIndex: 2138 entries, 2010-01-04 to 2018-06-29
Data columns (total 1 columns):
.SPg { +X 2138 non-null float64
dtypes: flo4 T = | ? m P {at64(1)
memory usage: 33.4 KB
In [19]: data[\'rets\'] = np.lR L : g e ; ` u Nog(data / data.shift(1)) ❻
data[\'vola\'] = data[\'rets\'4 X j b s E ].rolling(252).std() * np.sqrt(252) ❼
In [20]: data[[\'.SPX\', \'vola\']].plot(subplots=True, figsize=
(f # / Z p ?10, 6)); ❽
❶ 导入NumPy和pand` o pas。
❷ 导入^ J p , _ U & 4matplotlib并配置Jupyter绘图样式和方法。
❸ pd.read_csv()可以读取远程或者本地存储的逗号分隔值(CSV)形式数据集。
❹ 选取一个数据子集,删除NaN(非数值)值J 9 # ) E (。
❺ 显示关于数据集的一些元信息。G k 4 T B ] X { 6
❻ 以向量化的方式(在Python级别上“无循环”)计算对数收益率。
❼ 得出滚动年化波动率。
❽ 最后绘制两个时间序列。
图1-1展示了这一简短交互会话V B B -所得到的图形化结果。用几行代码就足以完成金融分析中的典型复杂任务:数据收集、复杂和重复的数学计算% ] G p & ?以及结果的可视化,令人觉得不可思议。从这个例子中可以看到,pandas使整个时间系列的处理变得就像浮点数上的数学运算那样容易。
图1-1 标普500收盘价和年化波动率
将这个例子转换到专业的m ] ; h r Y P金融环境中v u 4 - K O i,可以看出金融分析师在应用提供高层次抽象的合U v 2适Python工具和库的时候,能够将焦点放在自身的领域上,而不用关心复杂的技术细节。分析师可以快速反应,几乎实时地提供宝贵的调见,确保自己比竞争对手先行一步。这种效率的提高很容易转换为可度量的财务效果。
2H S 1 } b.确保高性能K C J 3 u ? F
一般来说,Python的y T 2 L & W : S #语法相当r ` j - T c @ , Z简洁,编码效率相对高是为人们所接受的说法。但是,由于PythonT j E u 2 7 - d本质上是解释型语言,因此存在一种偏见,认为Pyta _ m b Y [ N R $hon对w p 0 n w 1 = g N于金融学中的计算密集任务来说速度过于缓慢。确实,在某些特定的实现方法下,Python可能确实很慢,但是,它并不一定都那么缓慢——它可以在几乎所有应用领域中表现出高性能。理论上,人们至少可以找到3种提高性能的策略。
惯例和范型
一般来说,Python可以用许多不同的方式得出相同的结果,但是这些方式的性能特性有相当大的区别;只要选择合适的Q 6 K & [ 7方式(如特定的实现方法、明智地使用数据结- . J 2 y : X构、通过向量化避免循x ( 5环或者使用pandas等特定库),就可以显著地改善效果。
编译B E C 5 g H z
现在,有许多高性能库可以提供重要函数的编译版本,或者将Python代码静态或者动态地(在运行i q K L ! = F时或者调用时)编译为机器代码,这种代码的速度比纯Python代码要快好几个数量级。比较流行的高性能库有Cython和Numba等。
并行化
许多计算任务(特别是金融学中的计算任务)可以从并行执行中得到很大好处;这对Python来说不足为奇,可以轻松地实现。
使用Python实现高性能计算
Python本身不是一种高性能计算技术。但是,Python已经发展成为一种, n , j k访问当前高性能技术的理想平台。在这个意义上,Pythonc _ ) b * ] ! f已经成为高性能计算的“黏合剂”语言。
本节坚持使用简洁实用的例子介绍上述3种策略(后续的章节将详细介绍这些策略)。金融分析中相当常见的任W D g T务E { u之一 c / , h Y = S K是在大量数字上计算复杂的数学表达式。在这方面,Python本身就提供了所R P x c [ x有必需的功能:
InR t s 8 ^ c ^ C # [21]: import math
loops = 2500000
a = range(1, loops)
def f(x):
retB k ( 4 H c )urn 3 * math.log(x) + math.v x V s F u J % 8cos(x) ** 2
%timeit rK I r k { = [f(x) fg o 1 w K a sor x in a]
1.59 s 41.2 ms per loop (mean std. dev. of 7 runs, 1 loop each)
Python解释程序在本例中需要1.6s的时间来完成250万次函数f的计算。使用NumPy可以完成相同的任务,它` @ j提供了优化(也就是预先编译)的函数来处理这种基于数组的运算:
In [22]: import numpy as np
a = np.arange(1p ; @ y m , loops)
%timeit rw Z % = 3 * np.log(a) + np.cos(a) ** 2
87.9 ms 1.73 ms per loop (mean std. dev. o; 0 ` Sf 7 runs, 10 loops each)
NumPy可以将执行时间大幅缩减到约88ms。甚至有一个库是专门用于此类任务的,这个库叫作numex? ` j Lpr,得名于“数值表达式”(Nume$ H = Z i K : #rical Expressions)。它可以编译表达式来改善NumPy通用功能的性能。例如,在执行期间避免ndarray对象在内存中复制:
In [23]: import numexpr as ne
ne.set_num_threads(1)
f = \'3 * log(a) + cos(a) ** 2\'
%timeitv { l r = ne.evaluate(f)
50.6 ms 4.2 ms per loop (mean std. dev. of- # = 7 I V ) B 7 runs, 10 loops each)
使用这种更特殊的方法可以进一步将执行时间 S ` p F * R降低至约50ms。而且,numexprk h I } d f还内建了并行执行单独运算的功Z e v r能。这使我们能够使用一个CPU的多个线程:
In [24]: ne.set_num_threads(4)
%timeit r = ne.evaluate(f)
22.8 ms 1.76 ms per loop (mean std. dev. of 7 runs, 10 loops each)
本例利用x 0 t w K了4个线程,执行. v a d时间进一步下降到23ms,总体的性能提升了90倍。特别要注意的是,这类改善不需要修改基本问题/算法,也不用了1 K R e F h j /解任何有关编译和并行化问题的知识,即使是非专业人士也可以从较高的N 8 { s y I E l层次上去利用这种功能。当然,前提是你U C & 4 + 4 r 必须知道存在这些功能。
这个例子说明a q J [ 0 j ,Python提供了一些选项可以C G f N # +更好地利用现有资源,也就是提高生产率。利用并行化方法,可以在同样的时间里完成3倍) : = P于串行化方法的计算,这只需要告诉Python使用多个CPU线程(而非仅使用一个线程)即可。
1.3.3 从原型化到生产
从执行速度的角度看,交互式分析的效率和性能当然是Python值得考虑的两个好处。在金融学中使用Python的另一个好处初看似乎比较不起眼,但是细看之下就会发现它本身是一个重要的战略因素。这就是以端到端(从原型化到生产)的方式使用Python的可能性。
当今全球金融机构的金融开发过程往往是一个分离的两步W x f . = p . P式过程。一方面,量化分析师(quants,也称宽客)负责模; | K G r型开发和技术原型化。他们喜欢使用MatLab和RL 3 L O [等工具和环境实现快速、交互式的应用程序开发。在开发的这一阶段,性能、稳定性、异常管理、数据访问分离和分析等问题都不重要。人们的主要目标是概念或者原型的验证,原型用于展现某种算法或者整个应用程序必需的主要功能。
一旦原型完成,IT部门中的开发人员接管工作,他们负责将现有原型代码翻译为可靠、易于维护和高性能的生产代码。这R a , ? E M一阶段中,通常在用于满足生产性能的C++或者Java语言中有一个范型转换的过程。而且,正规的! Y S c a开发过程还要用它o ^ _ [ H专业工具、版本控制等技术。
这种两步式方法会产生一些意外m | P c &的结果。
效率低下
原型代码不能重用;算法必须实现两次;多余的工作~ * L s ?消耗时间和资源;转译时产w 9 p 8生的风险。
多种技能集
不同部门展现不同的技能集合,使用不同的语言实现“相同的工作”。
遗留代码
代码必须以不同的语言存在和维护,并使用不同的实现风格(例如,从架构的观点上看)。
另一方面,使用Python可以实现合* x 6 l 9 ; D C理化X Z 3 9的端到端过程——从最初的交互式原型化步骤到高可靠性、易于维护的生产代码。不同部门之间的沟通变得更加简单,工作人员的培训也更为合理,只有一种主要语言覆盖金融应用构建的: Y L W 8 V % D C所有领域,还避免了在开发过程不同步骤中使用不同技术造成的低效和冗余性。总而言之,Python可以为金融应用开发和算法实现提供一致性的 d X f = 3技术框架。
1.4 数据驱动和人工智能a b B U优先的金融学
在2018年8月更新第2版的这一节时,2014年本书第1版中有关科技与金融学之间关系的言论似乎仍N [ I ) K k i然适用且重要。但是,本节将讲述金融业的两个重要趋势,它们将从根本上重塑这个行业。这两个趋势主要是在过去的几年内形成的? ) /。
1.4.1 数据n 1 =驱动金融学
最重要的一些金融理论(如MPT和r } e YCAPM)可以追溯到上世纪50年代和60年代。然而,它们仍然是经济、财务、金融工程和商业管理领域教育的基石。这可能令人惊讶,因为大部分此类理论的实证支持相当贫乏,而证据往往完全与理论相q $ : V反。另一方面,它们的流行性也是可以理解的,因为它们接近于人们对金融市场表现的期望,而且,它们是建立在一些吸引人(通常过于简单)的假设之上的简洁数学理论。
科学v k Z @ 1方法(如物理学)始于数据(如来自试验或者观察的数据),然后得出假设和理论,并用数据加以测试。如果测试结果是肯定d / ] = 3 ^ I H的,那可以对这些假设和理论进行提炼,并以合适的方法记录下来,例如以研究型论文的方式发E 7 D表。如c 3 / D X _ 9果测试结果是否定的E 0 -,假设和理论m x # = % ] 7 -将被抛弃,并开始寻找复合数据的新理论。由于物理定律在一段时间里是稳定的,所以一旦发现并对齐进行了完备的测试,那么在最佳状况下,通常可以认为是永远成立的。
(计量)金融学的历史大部分与科学方法相悖。在许多情况下,理论和模型是在简化U h t y ( q f J的数学假设下“从头d + b d”开发的,目标是发现金融学核心问题的简练回答。金融学的流行假设是,金融工具的回报呈标准正态$ , q i W [分布,各种利= [ z = r + Q ~率之间呈线性关系8 ) P X ;。由于这m O ; K # 3 c j些现象在金融市场上很难看到,这些简单理论的实证往往很缺乏,也就不值得惊讶了。许多金融理论和模型都是首先提出公式、证明并发表,然后才进行实证测试的。在某种程度上,这当然是因为上世纪50年代或] X l : 6者70年代甚至更晚的时候,还不j J w y /存在合适形式的金融数据,而今天就连攻读金融学士学位的学生都能得到这些数据。
20世纪90年代初期到中期,金q # G C ` &融机构所能得到的此类数据急剧增加。今天,甚至进行金融研究或者参与算法交易i o 6 $ `的个人都可以得到大量的历史数据,也可以通过流服务得到实时数据。这使我们可以专注于科学方法,科学方法通常从数据开始,然后得出思路、假设、模型和策略。
用一个简单的例子就可以说明,如今在本地机器上利用Python和Eikon Data APIs订阅大规模专业数据有多么简单。下面的例子是读取的苹果公司股票常规交易日中一个小时的分笔交易数据。f K B读取的报价数据(包括交易量信息)大约有15000条。由于股票代码为AAPL,所以F T 2 +路透金融工具代码(RR . o g z E ] IIC)为AAPL.0:
In [26]: import eikon as ek ❶6 y q F B c
I j 3 ! t F K Yn [27]: data = ek.get_timeseries(\'AAPL.O\', fields=\'*\',
start_d! ~ Q 8 K h `ate=\'2018-10-18 16:00:00q g X U @ g K\',
end_date=\'2018-10-18 17:00:00\',* g ] | p ( #
interval=\j q M H G Z C T'tick\') ❷
In [2d U n { R 7 ] K8]: data.info() ❷
<class \'pandas.core.frame.DataFrame\'>
DatetimeIndexM # 2: 35350 entries, 2018-10-18 16:; t A 7 A 6 T l &00:00.002000 to
2018-10-18
16:59:59.888000
Data colum- _ { r M ~ns (total 2 columns):
VALUE 35285 non-null float7 k j N i O64
VOLUME 35350 non-null float64
dtypes: float64(2)
memory usage: 828.5 KB
In [29]: data.tail() ❸
Out[29]: AAPL.O VALUE VOLUME
DateH L h
2018-10-18 16:59:59.433 217.13 10.0
2018-10-18 16:59:59.433 2K S # 0 *17.13 12.0
2018-10-18 16:59:59.439 217.13 231.0
2018-10-18 16:59:59.754 217.14 100.0
2018-10-18 16:59:59.888 217.13 100.0
❶ Eikon Data API需要订阅和API连接才能使用。
❷ 读取苹果公司(AAPL.0)股票分i g 0 u , V U笔数据。
❸ 显示最后5行数据。
Eikon Data API不仅提供了对结构化金融数据(如历史报价数据)的访问,还可以访问新闻等非结构化数据。] ; ( r T K q下面的例子读取一小部分新闻的元数据,并以全文本方式显示其中一篇文章开头的v t I m . X ; G内容。
In [3N ~ C0]: news = ek.getN & q N 7 h $ 6 *_news_headlinesO # ` V E !(\'R:AAPL.O Language:LEN\',
date_from=\'2018-05-01\',
date_to=\'2018-06-29\',
count=7) ❶
In [31]: news ❶
Out[31]:
versionCreated \\
2018-06-28 23:00:00.000 2018-06-28 23:00:00.000
2018-066 p E I-28 21:23:26.526 2018-: R B s W $ # 106-28 21:23:26.526
2018-06-28 19:48:32.627 2018-06-2? Y Q Q u G8 19:48:32.627
2018-06-28 17:33:10.306 2018-06-28 17:33:1D j m r `0.306
2018-06-28 1 @ F H t N G7F O O &:33:07.033 2018-06-28 17:33:07.033
2018-06-28 17:31:44.960 2018B / ; & Y E w B ;-06-28 17:31:44.960
2018-06-28 17:00:00.000 2018-06-28 17:00:00.000
text \\
2018-06-28 23:00:00.000 RPTR & 4 F M x Y { (-FOCUS-AI ambulances and robot doctors:3 $ ; } x 4 Chi...
2018D V f ) $ q , +-06-28 21:23:26.526 Why Investors Should Love Apple| 3 5 X F T { Y\'s (AAPL) TV En...
2018-06-28 19:48:q k Y d !32.627 Reuters Insider - Trump: We\'re reclai- ; + 9 | k bming our ...~ v p [ D ?
2018-06-28 17:33:10.306 Apple v. Samsung ends nob ( Rt with a whimper but a...
20188 t _ q { v n h |-06-28 17:33:07.033 Apple\'s trade-war discount e: z g y h ixtended for anothe...
2018-06-28 17:31:44.960 Other* - s d 4 Products: Apple\'s fast-growing island of...
2018-06-28 17:00:00.000 Pokemon Go creator plans to sell the tech behi...
storyId \\
2018-06-28 23:00:00.000 urn:nN a ` c U ` c Sewsml:reuters.com:20180628:nL4N1TU4F8:6
2018-06-28 21:23:h a m , M 3 A )26.526 urn:news- y B P 9ml:reuters.com:20180628:nNRA? z k M G 3 | O o6e2vft:1
2018-06-28 19:48:32.b } J T627 urn:newsml:reuters.com:20180628:nRTV1vNw1pD 5 0 8 1 b:1
2018-06-28 17:33:10.306 urn:newsml:reuters.com:20180628:nNRA6e1oza:1
2018-06-28 17:33:07.033 urn:newsml:reuters.com:20180628:nNRA6e1pmv:1
2018-06-28 17:31:44.960 urn:newsml:reuteV a | Z c Rrs.com:20180628:nNRA6e1m3n:1
2018-06-28 17:00:00.000 urn:newsml:reuters.com:20180628:nL1N1TU0PC:3
sourceCode
2018-06-28 23:00:00.000 NS:RTRS
2018-06-28 21:23:26.526 NS:ZACKSC
2018-06-28 19:@ k Y j43 H c ,8:32.627 NS:CN* a | Q R qBC
2018-06-28 17:3H ] g 3 - V3:10.306 NS:WALLST
2018-06-28 17:33:07$ S $ d p Q + n.033 NS:WALLST
2018-06-28 17:31:44.960 NS:WALLST
2018-06-28 17:00:00.000 NS:RTRS
In [32]: story_html = ek.get_news_story(news.iloc[1, 2]) ❷
In [33]: from bs4 import BeautifulSoup ❸
In [34]: story = BeautifulSoup(story_html, \'html5lib\').get_text() ❹
In [35]: print(story, { O A 3 ][83:958= E ^ l]) ❺x k . k ? 2 D
Jun 28, 2018 For yD d w E ) a de- A O y 8 ]ars, investors and Apple AAPL have been beholden to
the iPhoneW | | 3 ; K Y . $, which is hardly a negative since its flagship product is
largely responj P b p S Rsible for turning Apple into one of the world\'s biggest
companies. ButE g J $ b = @ V Appl y T / 2 | e dle has slowly pushed into ne7 v o w + + ow growth a+ c 5 Kreas, with
streE h k / R waming television/ j W S d I % its newest froR 1 6 r P 6 1 Bntier. So let\'s take a look at what
Apple has planned as it readies itself to comy I , S Wpete against the likes of
NJ { ? O o =etflix NFLX and Amazon AMZN in the battle for the new age of
en8 E X ; Q n m ptertainment.U + w x 3Apple\'s second-quarter revenues jumped by 16% to reach
$61.14 billion, with iPhone revenues up 14%. However, iPhone unit sales
climbed only 3% and iPhone revenues ac? M Q w 0 o ] 4coun* Q ~ fted for over 62% of total Q2
sales. Apple knows this is not{ ` B ` & . Z , t a sustainable business model, beck H & K x * `ause
rare is the consumer product that can remain in vogue for decades. This
is whyI l / , Apple has made a big push into news,
❶ 读取一小部分新闻的元数据。
❷ 读取一篇文章的全部文本,形式为HTML文档。
❸ 导入Beaut3 u H b q l G SifulSoup HTML解析库并进行后续操作。
❹ …以纯文本方式(str对象)提取内容。
❺ 打印新闻的开头。
尽管这两个例子很浅显,但它们说明,通过Python包装器/ 7 ! a C : D库和数据= # R订阅服务,可_ _ ? b ) { c {以以标准化、高效的方式得到结构化和非结构化的金融历史数据。在许多情况下,个人甚至可以使用FXZ Y u HCM集团、LLC等交易平E L r % S .台(在第14章和第16章中会讲到)来免费获得% & : d J类似的数据集。一旦在Python级别上得到数据(独立于原始来源),就; W 7 = - I N可以x ^ ( 4 x k利用Python数据分析生态系统的全部功能了。
数据驱动金融学
近年来,数据成了m - s金融业的推动力。即使最大、最成功的对冲基金也自称是“数据驱动”的,而非“金融驱动”的。越来越多的服务产品向大小机构及个人提供海量数据。Python通常被选为与这些API交互、处理和分析? h e 6 S l g 数据的编程语言。
1.4.2 人工智能优先金x ^ , Z U 6 l融学
由于通过编程API能够取得大量金融数据,所以在金融问题(如算法交易)上应用人工智能(AI)方法、特别是机器与深度学习(MLD _ E 8 E *,DL)就变得非常容易,也更有成果了。
Python可以称得上AI界的“宠儿”。它往往被7 r T v ! 2 Y FAI研究人f I @ c员和从业者选为编程语言。从这个意义上说,金融领域从不同领域的发展中得益,这些领域有时甚至与金融没有太大的联系。举个例子,深度学习所用的TensorFlow开源程序库是Google公司开发和维护的,用于其母公司Alphabet自动驾驶汽f D 3 s车的制造和销售上。
TensorFlow当然和股票D S L $ l O f (自动算法交易一点关联都没有,但却可以用于预测D n R ) e J金融市场的变动。第15章提供了许多这方面的例子。最广泛使用的Python ML程序库是scikit-learn。下面的代码以高度简化的方式说明:ML 分类算法4 X | j 9 } ^ c如何用来预测期货价格变动方向,并以这些预测为基础制定一个算法交易策略。所有细节@ E J + k将在第15章中解释,因此这个例子相当; S W J 3简洁。首先,导入数据,准备期货数据(定向滞后对数收益率数据)。
In [36]: import numpy as np
import pandas as pd
In [37]: data = pd.read_csv(x - / e x\'../../source/e Q ftr_eikon_eod_data.csv\',
index_col=0, pa; _ y W a % 4rse_dates=True)
data = pd.DataFrame(data[\'AAPL.O\']) ❶
data[\ p : % f 1 I I t'Returns\'] = np.log(data6 U _ e k ; 6 e K / da* ? m ; : B h 3ta.shift())| d % J b ~ ^ D h ❷
dak 3 W ^ ta.dropna(inplace=True) ` . ( t 7)
In [38]: lags = 6
In [39]: cols = []
for lag in range(1, lags + 1):
col = \'lag_{}\'.foP f D q srmat(lag)
data[col] = np.sign(data[\'Returns\'].shift(lag)) ❸9 : e l z v F ;
cols.app@ 0 qend(col)
data.dropna(inplace=True)
❶ 选择苹果公司(Al s C 3 R PAPL.0)历史日终数据。
❷ 计算整个历史数据内的对数收益率。
❸ 生成带有定向滞后对数收益率数据(+1或者−1)的DateFramet S C D s列。
接下来,为支持向量机(SVM)算法、模型拟合和预测步骤实例化一个模型对象。图1-2说明,根据预测买进和卖出苹果公司股票的基于预测交易策略的表现胜过被动的基w f $ / m K准股票投资方法。
图1-2 基于ML的算法交易策略与被动基准投资的对比(苹果公司股票)
In [40]: from sklearn.svm import SVC
In [41]: model = SVC(gamma=\'auto\') ❶
In [42]: model.fit(data[colsb ] & y _], np.sign(data[\'Returns\'])) ❷
Out[42]: SVC(C=1.0, cache_sizev | # Q M {=2q P Y S v H J00, class_weight=None, coef0=0.0,
decisi+ B r b Ton_function_shape=\'ovr\', degree=3, gamma=\'auto\', ker^ , A | inel=\'rbf\',
max_iter=-1, probability=False, random_state=None, shri= 9 i t $ P # =nking=True,
tol=0.001, verbo5 / ,se=False)
In [43]: data[\'Prediction\'] = model.predict(data[cols]) ❸
In [44]: data[\'Strategy\'] = data[/ 4 ~ @ / N\'Prediction\'] * data[\'ReD : I ; 4 ]turns\'] ❹
In [45]: data[[\'Returns\', \'Strate2 V t Qgy\']].cumsum().apply(np.exp).plot~ 4 J w H A E { 7(
figsize=(10, 6)); ❺
❶ 实例化模型对象。
❷ 根据期货和标签数据C % r * l y b H(全部是定向的)拟合模型。
❸ 使用拟合模型创建预测(样本内),这同时是交易策略的头寸(买入或者卖出)。
❹ 根据预测值和基准对数收益率计算交易策= 3 D o略的对数收益率。
❺ 绘制基于ML交W 7 ) 5易策略表现与被动基准投资表现的对比曲线。
这里采用的简化方法没有考虑交易成本,也没有将数据集M M : $分为训练和测试子集。但是,这个例子说明,至少从技术意义上,将ML算法应用到金Z I Z G ] ?融数据有多么简单。在实践中,需要考虑一些重要的因素(参见Lopez de Prado(2018))。
人工智能优先金融学
AI将像对待其他领域一样,重塑金融行业。通过编程API功能可以取得大量金融数据,这成为了该C Q h领域的引擎。5 % 6 R w M I第13章中介绍AI、ML和DL基d 8 Z 7 T 1本方法,并在第15章和第16章中将其应用到算法交易中。不过,全面介绍人工智能优先金融学需 [ 0 v要一本专门的图书。
作为数据驱动金融学的K a ` i q B :自然延伸,不管从研究还是从业者的角度,金融学中的人工智能当然也是一个令人痴迷和兴奋R a 3 M的领域。本书在不同背景下使用了多种AI、ML和DL方法,但总体的焦点与本书的副标题相符,仍是数据驱动金融学所需的Python基本技术与方法。不过,这些技术与方法对人工智能优先金融学同样重要。
1.5 结c o S ) M _语
Python作为一种语言,但更多的是作为生态系统,是金融业理想的技术框架。它的特性中有许多好处,比如简洁的语N Y c : ` 8法、高效的开q F 9发方法和原型化及生产的易用性等。利用Python大量的可用库和工具,我们似乎能够应付当今金} u 5 Y C % W R融业中分析、数据量和频率、依从性及监管所引发的大部分问题。即z 7 } } v 0 R f使在较大型的金融机构中,它也具备提供单一、强大、一致性的框架,简化端到端开发和生产工作的潜力。
此外,Python已经成为人工智能、特别是机器与深度学习工作者选择的编程语言。因此,Python对于数据驱动金融学和人工智能优先金融J o F D学来说也是合适的语言,这两种当P o A j今的趋势将从根本上重塑金融学和金融行业。
本文摘自《Python金融大数据分析 第2版》
- 金融科技B | x 9 i t o算法交易量化金融教程书籍
- 详细讲解使用Python分析处理金融大数据的专业图书
- 将人工智能应用于金融开发的实战指南,金融应用开发领域从业人员的常备读物
《Python金融大数据分析 第2版》分为5部分,共21章。第1部分介绍了PytZ ; K Ehon在C r [金融学中的应用,其内容涵盖了Python用于金融行业的原因、Python的基础架构和工具H U n 9,以及Python在计量金融学中的一些具体入门实例;第2部分介绍了Python的基础^ | J z t知识以及PythonA { $ f h g *中非常有名的库NumPy和pandas工具集,还介3 n I i R绍4 Q C C V * K了面向对象编2 2 4 y程;第3部分介绍金融数据科学的相关基本技术和方法,包括数据可视化、输入/输出操作和数学中与金融相关的知识等;第4部分介绍Python在算法交易上的应用,重点介绍常见算法,包括机器学习、深度神经网络等人工智能相关算法;第5部b A ] *分讲解基于蒙特卡洛模拟开发期权及衍生品定价的应用,其内容涵盖了估值框架的介绍、金融模型的模拟、衍生品的估值、投资组合的估值等知识。