<返回更多

Python与金融:为什么将Python用于金融?

2020-04-13    
加入收藏

1.2 金融中的科技

现在,我们对Python已经有了大致的认识,接下来简短地介绍一下科技在金融中的作用就很有意义了。这将使我们更好地评判Python在金融行业中已经承担的任务,更重要的是,还可以评判未来承担的任务。

在某种意义上,科技对于金融机构(例如与生物技术公司相比)或者财务部门(与其他企业职能部门相比,如后勤)没有什么特别的作用。然而,近年来,在创新和监管的刺激下,银行和其他金融机构(如对冲基金)越来越多地发展成为技术公司而不仅仅是金融中介机构。科技成为了全球几乎所有金融机构的重要资产,具备导致竞争优势和劣势的潜力。某些背景信息可以解释这种发展的原因。

1.2.1 科技投入

银行和金融机构共同组成了每年在科技上投入最多的行业。因此,下面的陈述不仅说明科技对金融行业的重要性,也说明了金融行业对科技的重要性:

美国马萨诸塞州弗雷明汉,2018年6月14日——根据国际数据公司(IDC)的一系列“金融服务IT开销指南”称,全球金融服务公司在信息科技(IT)上的开销将从2018年的4400亿美元增长到2021年的近5000亿美元。

——IDC

特别是,银行和其他金融机构正在参与业务及运营模式数字化的竞争:

2017年,北美地区银行在新科技上的开销高达199亿美元。

银行开发当前系统并致力于新的技术解决方案,以增强其在全球市场上的竞争力,吸引对新的网络和移动科技感兴趣的客户。对于为银行业提供新思路和软件解决方案的全球金融科技公司来说,这是一个巨大的机遇。

——Statista

当今的大型跨国银行通常雇佣数千名开发人员,以维护现有系统并构建新系统。具有大量科技需求的大型投资银行每年的科技预算往往达到数十亿美元。

1.2.2 作为业务引擎的科技

科技发展对金融行业的创新和效率增进也有贡献。通常,这一领域的项目统称为“数字化项目”:

金融服务业在过去数年中已经历了科技先导的彻底变革。许多高管期望IT部门改进效率,促进游戏规则的创新——同时降低成本,继续支持遗留系统。与此同时,金融科技初创企业正在逐步蚕食原有市场,提出对客户友好的解决方案,这些方案是从头开始设计的,不受遗留系统的阻碍。

——普华永道第19次年度全球CEO调查报告(2016年)

效率提高的副作用之一就是,金融机构往往必须在更为复杂的产品或者交易中寻求竞争优势。这当然会使风险增大,并使风险管理、监控和监管越来越困难。2007年和2008年的金融危机说明了这些发展带来的潜在危险。同样,“算法和计算机失控”也给金融市场带来潜在的风险;2010年5月的所谓“闪电崩盘”事件戏剧性地展现了上述风险,自动化卖出导致某些股票和股票指数在当日大幅度下跌。

1.2.3 作为进入门槛的科技和人才

一方面,在其他条件不变的情况下,随着时间的推移,科技的进步会降低成本。另一方面,金融机构持续在科技上投入巨资,以增大市场份额、保持自身地位。在今天的金融市场上取得一席之地往往需要在科技和熟练人员上大规模投资。考虑衍生品分析领域的一个例子:

在整个软件生命期中,采用内部OTC(衍生品)定价策略的公司仅在一个完整的衍生品库的构建、维护和改进上就需要投入2500万~3600万美元。

——Ding 2010

构建一个完善的衍生品分析库不仅成本高昂和费时,而且需要有足够的专业人士来进行这项工作。这些专业人士必须有正确的工具和技术,才能完成相应的任务。随着Python生态系统的发展,与10年前相比,这些工作变得更加高效,相关的成本也有了显著的下降。第5部分介绍衍生品分析,仅用Python及标准库就构建了一个规模虽小却强大旦灵活的衍生品定价库。

下面,我们引用另一段美国长期资本管理公司(LTCM)的陈述,以进一步支持关于科技和人才的观点。LTCM曾是最受尊敬的计量对冲基金,但是在20世纪90年代末破产:

Meriwether在最新型计算机系统上花费了2000万美元,并雇用一个由一流金融工程师成的团队在LTCM操纵该系统,他们在康涅狄格州的格林尼治开始工作。这是行业级别的风险管理。

——Patterson 2010

Meriwether花费数百万美元才能得到的计算能力,在今天只需要几千美元就能实现。这种专业基础设施每月的起始费用仅为几美元。另一方面,大型金融机构的交易、定价和风险管理已经变得非常复杂,以致于现在必须部署具有数万个计算核心的IT基础架构

1.2.4 不断提高的速度、频率和数据量

金融行业有一个方面最受科技进步的影响:金融交易决策和执行的速度及频率。Lewis最近的著作(2014)生动而详细地描述了所谓的“闪电交易”——也就是以可能的最高速度进行的交易。

一方面,可用数据的时间标度越来越小,使实时反应成为必需的能力。另一方面,交易的速度和频率的提高使数据量进一步增大。这两方面相互补充,推动了金融交易平均时间标度的系统性下降。这种趋势在10年前就已经开始:

复兴资本公司的“大奖章”基金在2008年获得了80%的惊人增长率,它以闪电般速度的计算机抓住了市场极端活跃的机会。Jim Simons是当年世界盈利最高的对冲基金管理人,收入达到25亿美元。

——Patterson 2010

单只股票30年的每日股价数据大致包含7500个报价。这类数据是大部分现代金融理论的基础。例如,现代投资组合理论(MPT)、资本定价模型(CAPM)和风险价值(VaR)等理论都以每日股价数据为基础。

相比之下,苹果公司(AAPL)典型交易日报价次数大约为15000——两倍于30年日终报价的数量(参见1.4小节的例子)。这带来了许多挑战。

数据处理

只考虑和处理股票或者其他金融工具的日终报价是不够的。在每周的7天、每天的24个小时内,某些金融工具上发生的事情“太多了”。

分析速度

决策往往必须在几毫秒甚至更短的时间内做出,有必要构建独自的分析能力工具,并实时分析大量数据。

理论基础

虽然传统金融理论和概念远称不上完美,但是它们经受了时间的考验(有些时候受到排斥);对于毫秒级计量能力很重要的今天,仍然缺乏在很长时间内证明是稳定的一致性概念和理论。

总体上,上述挑战都只能由现代科技应对。令人有些惊讶的是,缺乏一致性理论的问题也常常通过技术方法处理。在这种情况下,高速算法利用的是市场微观结构要素(例如,订单流、买卖价差),而不依赖于某种金融推理方法。

1.2.5 实时分析的兴起

金融行业中有一个学科的重要性正在强劲增长:金融和数据分析。这种现象与行业中速度、频率和数据率飞速增长有紧密的关系。实际上,实时分析可以视为行业对这种趋势的反应。

粗略地讲,“金融和数据分析”指的是将应用软件、科技,与(可能是先进的)算法、数据收集、数据处理及分析方法相结合,以获得深刻的洞察力、做出决策或者满足监管需求的学科。这类分析的例子包括银行零售部门中某个金融产品定价结构的变化对销售情况影响的估算。另一个例子是投资银行衍生品复杂投资组合信用价值调整(CVA)的大规模隔夜计算。

金融机构在这种环境下主要面对两种挑战。

大数据

在“大数据”这一术语出现之前,银行和其他金融机构就必须处理海量数据。然而,单一分析任务所处理的数据量随着时间的推移而有了很大的增长,从而要求计算能力有所提高并有更大的内存与存储能力。

实时经济

过去,决策者只能依赖结构化的定期计划、决策和风险管理过程,而今天决策者面对的是实时完成这些任务的需求。过去在后台通过隔夜批量运行可以完成的任务,现在已经转向前台实时执行。

同样,人们可以观察到科技和金融/商业发展之间的相互作用。一方面,市场上出现了通过现代科技的应用不断改进分析方法的速度和效率的需求。另一方面,科技的进步使几年甚至几个月之前认为不可能(或者由于预算约束而不可行)的新分析方法成为可能。

分析领域的一个重要趋势是利用中央处理单元(CPU)的并行结构和通用计算图形处理单元(GPGPU)的大规模并行结构。现在的GPGPU往往有1000多个计算核心,有时候有必要彻底反思并行性对不同算法的意义。用户通常必须学习新的范型和技术才能利用这种硬件,这仍是障碍。

1.3 用于金融的Python

1.2节介绍了科技在金融中发挥作用的一些领域:

本节,我们分析Python如何帮助你应对这些方面的多种挑战。不过首先让我从更为基础的方面——语言和语法介绍用于金融的Python。

1.3.1 金融和Python语法

在金融环境中迈出使用Python第一步的大部分人都可能要攻克某个算法问题。这和想要解出微分方程、求取积分或者可视化某些数据的科学工作者类似。一般来说,在这一阶段,对正规开发过程、测试、文档或者部署没有太多的要求。然而,这一阶段似乎是人们特别容易爱上Python的时候,主要原因是Python的语法总体上和用于描述科学问题或者金融算法的数学语法相当接近。

我们可以通过一个简单的金融算法——通过蒙特卡洛模拟方法估计欧式看涨期权的价值来说明这一现象。我们将考虑Black-Scholes-Merton(BSM)模型,在这种模型中期权的潜在风险遵循几何布朗运动。

假定我们使用以下数值化参数进行估值:

在BSM模型中,到期指数水平是一个随机变量,由公式1-1给出,其中z是一个标准正态分布随机变量。

公式1-1 Black-Scholes-Merton(1973)到期指数水平

Python与金融:为什么将Python用于金融?

 

下面是蒙特卡洛估值过程的算法描述。

(1)从标准正态分布中取得I个(伪)随机数z(i),i∈{1,2,…,I}。

(2)为给定的z(i)和公式1-1计算所有到期指数水平ST(i)。

(3)计算到期时期权的所有内在价值hT(i)=max(ST(i)−K,0)。

(4)通过公式1-2中给出的蒙特卡罗估算函数估计期权现值。

公式1-2 欧式期权的蒙特卡洛估算函数

Python与金融:为什么将Python用于金融?

 

现在,我们需要将这个问题和算法翻译为Python代码。下面的代码将实现一些必要的步骤。

In [6]: import math
import numpy as np ❶

In [7]: S0 = 100. ❷
K = 105. ❷
T = 1.0 ❷
r = 0.05 ❷
sigma = 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.exp((r - sigma ** 2 / 2) * T + sigma * math.sqrt(T) * z) ❺

In [12]: hT = np.maximum(ST - K, 0) ❻

In [13]: C0 = math.exp(-r * T) * np.mean(hT) ❼

In [14]: print('Value of the European call option: {:5.3f}.'.format(C0)) ❽
Value of the European call option: 8.019.

❶ NumPy在这里作为主程序包使用。

❷ 定义模型并模拟参数值。

❸ 随机数生成器种子值固定。

❹ 提取标准正态分布随机数。

❺ 模拟期末价值。

❻ 计算期权到期收益。

❼ 计算蒙特卡洛估算函数。

❽ 打印输出估算结果。

以下3个方面值得注意。

语法

Python语法与数学语法相当接近,例如参数赋值的方面。

翻译

每条数学或者算法语句一般都可以翻译为单行Python代码。

向量化

NumPy的强项之一是紧凑的向量化语法,例如,允许在单一代码行中进行10万次计算。

这段代码可以用于IPython或Jupyter Notebook等交互式环境。但是,需要频繁重用的代码一般组织为所谓的模块(或者脚本),也就是带有.py后缀的Python(文本)文件。本例的模块如例1-1所示,可以将其保存为名为bsm_msc_euro.py的文件。

例1-1 欧式看涨期权的蒙特卡洛估值

#
# Monte Carlo valuation of European call option
# in Black-Scholes-Merton model
# bsm_mcs_euro.py
#
# Python for Finance, 2nd ed.
# (c) Dr. Yves J. Hilpisch
#
import math
import numpy as np

# Parameter Values
S0 = 100. # initial index level
K = 105. # strike price
T = 1.0 # 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 numbers
# index values at maturity
ST = S0 * np.exp((r - 0.5 * sigma ** 2) * T + sigma * math.sqrt(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)

这一小节中的简单算法示例说明,Python的基本语法很适合为经典的科学语言二重奏——英语和数学来提供补充。在科学语言组合中添加Python能使其更加全面。我们现在拥有:

数学和Python语法 

几乎没有任何编程语言像Python这样接近数学语法。因此,数值算法很容易从数学表示翻译为Python实现。通过Python,我们可以在这些领域中高效地进行原型化、开发和代码维护。

在某些领域中,使用伪代码是常见的做法,这引入了第 4 个语言家族成员。举个例子,伪代码的任务是以更技术性的方式表示金融算法,不但与数学表示接近,而且还接近于技术实现。除了算法本身,伪代码还考虑了计算机的工作原理。

采用这种方法一般是因为,使用大部分编程语言时,技术实现和正式的数学表现形式的距离相当“遥远”。大部分编程语言都必须包含许多只在技术上需要的元素,但在数学和代码中很难看到等价的元素。

时下,Python常常以伪代码的方式被使用,因为它的语法和数学很类似,而且技术“开销”可以控制到最低。这一点是通过该语言所体现的一些高层概念实现的,这些概念不仅有其优势,也带来了风险和其他代价。不过可以肯定,我们可在需求出现的时候使用Python,从一开始就遵循其他语言可能需要的严格实现和编码方法。从这个意义上说,Python可以在两个世界:高层次的抽象和严格的实现中提供最佳的平衡。

1.3.2 Python的效率和生产率

从较高的层次看,使用Python的好处可以从以下3个维度衡量。

效率

Python如何更快地获得结果、节约成本、节约时间?

生产率

Python如何在相同的资源(人员、资产等)下完成更多的工作?

质量

Python能够让我们做哪些替代技术所不能做到的事情?

对这些特性的讨论当然不可能很全面。然而,可以将某些特性作为出发点。

1.在更短的时间里得到成果

Python效率较为明显的领域之一是交互式的数据分析。这些领域从IPython、Jupyter Notebook等有力工具和pandas之类的程序中库获益良多。

假设你是一位正在撰写硕士论文的金融专业学生,对标普 500 指数感兴趣,想要分析 1 年的历史指数水平,以了解指数在这段时间内的波动性,你希望找到证据证明这种变动性与某些典型的模型假设相反,它是随时间变动而非固定。而且,应该对结果进行可视化,你要进行的主要的工作如下:

这些任务很复杂,在不久之前还被认为是专业金融分析师才能完成的。而在今天,即使是金融专业的学生也可以轻松地对付这类问题。我们来看看具体的做法——此时还不用操心语法的细节。

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'] = 'serif' ❷
%matplotlib inline

In [18]: data = pd.read_csv('../../source/tr_eikon_eod_data.csv',
index_col=0, parse_dates=True) ❸
data = pd.DataFrame(data['.SPX']) ❹
data.dropna(inplace=True) ❹
data.info() ❺
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 2138 entries, 2010-01-04 to 2018-06-29
Data columns (total 1 columns):
.SPX 2138 non-null float64
dtypes: float64(1)
memory usage: 33.4 KB

In [19]: data['rets'] = np.log(data / data.shift(1)) ❻
data['vola'] = data['rets'].rolling(252).std() * np.sqrt(252) ❼
In [20]: data[['.SPX', 'vola']].plot(subplots=True, figsize=
(10, 6)); ❽

❶ 导入NumPy和pandas。

❷ 导入matplotlib并配置Jupyter绘图样式和方法。

❸ pd.read_csv()可以读取远程或者本地存储的逗号分隔值(CSV)形式数据集。

❹ 选取一个数据子集,删除NaN(非数值)值。

❺ 显示关于数据集的一些元信息。

❻ 以向量化的方式(在Python级别上“无循环”)计算对数收益率。

❼ 得出滚动年化波动率。

❽ 最后绘制两个时间序列。

图1-1展示了这一简短交互会话所得到的图形化结果。用几行代码就足以完成金融分析中的典型复杂任务:数据收集、复杂和重复的数学计算以及结果的可视化,令人觉得不可思议。从这个例子中可以看到,pandas使整个时间系列的处理变得就像浮点数上的数学运算那样容易。

Python与金融:为什么将Python用于金融?

图1-1 标普500收盘价和年化波动率

将这个例子转换到专业的金融环境中,可以看出金融分析师在应用提供高层次抽象的合适Python工具和库的时候,能够将焦点放在自身的领域上,而不用关心复杂的技术细节。分析师可以快速反应,几乎实时地提供宝贵的调见,确保自己比竞争对手先行一步。这种效率的提高很容易转换为可度量的财务效果。

2.确保高性能

一般来说,Python的语法相当简洁,编码效率相对高是为人们所接受的说法。但是,由于Python本质上是解释型语言,因此存在一种偏见,认为Python对于金融学中的计算密集任务来说速度过于缓慢。确实,在某些特定的实现方法下,Python可能确实很慢,但是,它并不一定都那么缓慢——它可以在几乎所有应用领域中表现出高性能。理论上,人们至少可以找到3种提高性能的策略。

惯例和范型

一般来说,Python可以用许多不同的方式得出相同的结果,但是这些方式的性能特性有相当大的区别;只要选择合适的方式(如特定的实现方法、明智地使用数据结构、通过向量化避免循环或者使用pandas等特定库),就可以显著地改善效果。

编译

现在,有许多高性能库可以提供重要函数的编译版本,或者将Python代码静态或者动态地(在运行时或者调用时)编译为机器代码,这种代码的速度比纯Python代码要快好几个数量级。比较流行的高性能库有Cython和Numba等。

并行化

许多计算任务(特别是金融学中的计算任务)可以从并行执行中得到很大好处;这对Python来说不足为奇,可以轻松地实现。

使用Python实现高性能计算

Python本身不是一种高性能计算技术。但是,Python已经发展成为一种访问当前高性能技术的理想平台。在这个意义上,Python已经成为高性能计算的“黏合剂”语言。

本节坚持使用简洁实用的例子介绍上述3种策略(后续的章节将详细介绍这些策略)。金融分析中相当常见的任务之一是在大量数字上计算复杂的数学表达式。在这方面,Python本身就提供了所有必需的功能:

In [21]: import math
loops = 2500000
a = range(1, loops)
def f(x):
return 3 * math.log(x) + math.cos(x) ** 2
%timeit r = [f(x) for 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可以完成相同的任务,它提供了优化(也就是预先编译)的函数来处理这种基于数组的运算:

In [22]: import numpy as np
a = np.arange(1, loops)
%timeit r = 3 * np.log(a) + np.cos(a) ** 2
87.9 ms ± 1.73 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

NumPy可以将执行时间大幅缩减到约88ms。甚至有一个库是专门用于此类任务的,这个库叫作numexpr,得名于“数值表达式”(Numerical Expressions)。它可以编译表达式来改善NumPy通用功能的性能。例如,在执行期间避免ndarray对象在内存中复制:

In [23]: import numexpr as ne
ne.set_num_threads(1)
f = '3 * log(a) + cos(a) ** 2'
%timeit r = ne.evaluate(f)
50.6 ms ± 4.2 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

使用这种更特殊的方法可以进一步将执行时间降低至约50ms。而且,numexpr还内建了并行执行单独运算的功能。这使我们能够使用一个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)

本例利用了4个线程,执行时间进一步下降到23ms,总体的性能提升了90倍。特别要注意的是,这类改善不需要修改基本问题/算法,也不用了解任何有关编译和并行化问题的知识,即使是非专业人士也可以从较高的层次上去利用这种功能。当然,前提是你必须知道存在这些功能。

这个例子说明,Python提供了一些选项可以更好地利用现有资源,也就是提高生产率。利用并行化方法,可以在同样的时间里完成3倍于串行化方法的计算,这只需要告诉Python使用多个CPU线程(而非仅使用一个线程)即可。

1.3.3 从原型化到生产

从执行速度的角度看,交互式分析的效率和性能当然是Python值得考虑的两个好处。在金融学中使用Python的另一个好处初看似乎比较不起眼,但是细看之下就会发现它本身是一个重要的战略因素。这就是以端到端(从原型化到生产)的方式使用Python的可能性。

当今全球金融机构的金融开发过程往往是一个分离的两步式过程。一方面,量化分析师(quants,也称宽客)负责模型开发和技术原型化。他们喜欢使用MatLab和R等工具和环境实现快速、交互式的应用程序开发。在开发的这一阶段,性能、稳定性、异常管理、数据访问分离和分析等问题都不重要。人们的主要目标是概念或者原型的验证,原型用于展现某种算法或者整个应用程序必需的主要功能。

一旦原型完成,IT部门中的开发人员接管工作,他们负责将现有原型代码翻译为可靠、易于维护和高性能的生产代码。这一阶段中,通常在用于满足生产性能的C++或者JAVA语言中有一个范型转换的过程。而且,正规的开发过程还要用它专业工具、版本控制等技术。

这种两步式方法会产生一些意外的结果。

效率低下

原型代码不能重用;算法必须实现两次;多余的工作消耗时间和资源;转译时产生的风险。

多种技能集

不同部门展现不同的技能集合,使用不同的语言实现“相同的工作”。

遗留代码

代码必须以不同的语言存在和维护,并使用不同的实现风格(例如,从架构的观点上看)。

另一方面,使用Python可以实现合理化的端到端过程——从最初的交互式原型化步骤到高可靠性、易于维护的生产代码。不同部门之间的沟通变得更加简单,工作人员的培训也更为合理,只有一种主要语言覆盖金融应用构建的所有领域,还避免了在开发过程不同步骤中使用不同技术造成的低效和冗余性。总而言之,Python可以为金融应用开发和算法实现提供一致性的技术框架

1.4 数据驱动和人工智能优先的金融学

1.4.1 数据驱动金融学

最重要的一些金融理论(如MPT和CAPM)可以追溯到上世纪50年代和60年代。然而,它们仍然是经济、财务、金融工程和商业管理领域教育的基石。这可能令人惊讶,因为大部分此类理论的实证支持相当贫乏,而证据往往完全与理论相反。另一方面,它们的流行性也是可以理解的,因为它们接近于人们对金融市场表现的期望,而且,它们是建立在一些吸引人(通常过于简单)的假设之上的简洁数学理论。

科学方法(如物理学)始于数据(如来自试验或者观察的数据),然后得出假设和理论,并用数据加以测试。如果测试结果是肯定的,那可以对这些假设和理论进行提炼,并以合适的方法记录下来,例如以研究型论文的方式发表。如果测试结果是否定的,假设和理论将被抛弃,并开始寻找复合数据的新理论。由于物理定律在一段时间里是稳定的,所以一旦发现并对齐进行了完备的测试,那么在最佳状况下,通常可以认为是永远成立的。

(计量)金融学的历史大部分与科学方法相悖。在许多情况下,理论和模型是在简化的数学假设下“从头”开发的,目标是发现金融学核心问题的简练回答。金融学的流行假设是,金融工具的回报呈标准正态分布,各种利率之间呈线性关系。由于这些现象在金融市场上很难看到,这些简单理论的实证往往很缺乏,也就不值得惊讶了。许多金融理论和模型都是首先提出公式、证明并发表,然后才进行实证测试的。在某种程度上,这当然是因为上世纪50年代或者70年代甚至更晚的时候,还不存在合适形式的金融数据,而今天就连攻读金融学士学位的学生都能得到这些数据。

20世纪90年代初期到中期,金融机构所能得到的此类数据急剧增加。今天,甚至进行金融研究或者参与算法交易的个人都可以得到大量的历史数据,也可以通过流服务得到实时数据。这使我们可以专注于科学方法,科学方法通常从数据开始,然后得出思路、假设、模型和策略。

用一个简单的例子就可以说明,如今在本地机器上利用Python和Eikon Data APIs订阅大规模专业数据有多么简单。下面的例子是读取的苹果公司股票常规交易日中一个小时的分笔交易数据。读取的报价数据(包括交易量信息)大约有15000条。由于股票代码为AAPL,所以路透金融工具代码(RIC)为AAPL.0:

In [26]: import eikon as ek ❶

In [27]: data = ek.get_timeseries('AAPL.O', fields='*',
start_date='2018-10-18 16:00:00',
end_date='2018-10-18 17:00:00',
interval='tick') ❷

In [28]: data.info() ❷
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 35350 entries, 2018-10-18 16:00:00.002000 to
2018-10-18
16:59:59.888000
Data columns (total 2 columns):
VALUE 35285 non-null float64
VOLUME 35350 non-null float64
dtypes: float64(2)
memory usage: 828.5 KB

In [29]: data.tail() ❸
Out[29]: AAPL.O VALUE VOLUME
Date
2018-10-18 16:59:59.433 217.13 10.0
2018-10-18 16:59:59.433 217.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)股票分笔数据。

❸ 显示最后5行数据。

Eikon Data API不仅提供了对结构化金融数据(如历史报价数据)的访问,还可以访问新闻等非结构化数据。下面的例子读取一小部分新闻的元数据。

In [30]: news = ek.get_news_headlines('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-06-28 21:23:26.526 2018-06-28 21:23:26.526
2018-06-28 19:48:32.627 2018-06-28 19:48:32.627
2018-06-28 17:33:10.306 2018-06-28 17:33:10.306
2018-06-28 17:33:07.033 2018-06-28 17:33:07.033
2018-06-28 17:31:44.960 2018-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 RPT-FOCUS-AI ambulances and robot doctors: Chi...
2018-06-28 21:23:26.526 Why Investors Should Love Apple's (AAPL) TV En...
2018-06-28 19:48:32.627 Reuters Insider - Trump: We're reclaiming our ...
2018-06-28 17:33:10.306 Apple v. Samsung ends not with a whimper but a...
2018-06-28 17:33:07.033 Apple's trade-war discount extended for anothe...
2018-06-28 17:31:44.960 Other 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:newsml:reuters.com:20180628:nL4N1TU4F8:6
2018-06-28 21:23:26.526 urn:newsml:reuters.com:20180628:nNRA6e2vft:1
2018-06-28 19:48:32.627 urn:newsml:reuters.com:20180628:nRTV1vNw1p: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:reuters.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:48:32.627 NS:CNBC
2018-06-28 17:33:10.306 NS:WALLST
2018-06-28 17:33:07.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[83:958]) ❺
Jun 28, 2018 For years, investors and Apple AAPL have been beholden to
the iphone, which is hardly a negative since its flagship product is
largely responsible for turning Apple into one of the world's biggest
companies. But Apple has slowly pushed into new growth areas, with
streaming television its newest frontier. So let's take a look at what
Apple has planned as it readies itself to compete against the likes of
Netflix NFLX and Amazon AMZN in the battle for the new age of
entertainment.Apple'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 accounted for over 62% of total Q2
sales. Apple knows this is not a sustainable business model, because
rare is the consumer product that can remain in vogue for decades. This
is why Apple has made a big push into news,

❶ 读取一小部分新闻的元数据。

❷ 读取一篇文章的全部文本,形式为HTML文档。

❸ 导入BeautifulSoup HTML解析库并进行后续操作。

❹ …以纯文本方式(str对象)提取内容。

❺ 打印新闻的开头。

尽管这两个例子很浅显,但它们说明,通过Python包装器库和数据订阅服务,可以以标准化、高效的方式得到结构化和非结构化的金融历史数据。在许多情况下,个人甚至可以使用FXCM集团、LLC等交易平台来免费获得类似的数据集。一旦在Python级别上得到数据(独立于原始来源),就可以利用Python数据分析生态系统的全部功能了。

数据驱动金融学

近年来,数据成了金融业的推动力。即使最大、最成功的对冲基金也自称是“数据驱动”的,而非“金融驱动”的。越来越多的服务产品向大小机构及个人提供海量数据。Python通常被选为与这些API交互、处理和分析数据的编程语言。

1.4.2 人工智能优先金融学

由于通过编程API能够取得大量金融数据,所以在金融问题(如算法交易)上应用人工智能(AI)方法、特别是机器与深度学习(ML,DL)就变得非常容易,也更有成果了。

Python可以称得上AI界的“宠儿”。它往往被AI研究人员和从业者选为编程语言。从这个意义上说,金融领域从不同领域的发展中得益,这些领域有时甚至与金融没有太大的联系。举个例子,深度学习所用的TensorFlow开源程序库是google公司开发和维护的,用于其母公司Alphabet自动驾驶汽车的制造和销售上。

TensorFlow当然和股票自动算法交易一点关联都没有,但却可以用于预测金融市场的变动。最广泛使用的Python ML程序库是scikit-learn。下面的代码以高度简化的方式说明:ML 分类算法如何用来预测期货价格变动方向,并以这些预测为基础制定一个算法交易策略。首先,导入数据,准备期货数据(定向滞后对数收益率数据)。

In [36]: import numpy as np
import pandas as pd

In [37]: data = pd.read_csv('../../source/tr_eikon_eod_data.csv',
index_col=0, parse_dates=True)
data = pd.DataFrame(data['AAPL.O']) ❶
data['Returns'] = np.log(data / data.shift()) ❷
data.dropna(inplace=True)

In [38]: lags = 6

In [39]: cols = []
for lag in range(1, lags + 1):
col = 'lag_{}'.format(lag)
data[col] = np.sign(data['Returns'].shift(lag)) ❸
cols.append(col)
data.dropna(inplace=True)

❶ 选择苹果公司(AAPL.0)历史日终数据。

❷ 计算整个历史数据内的对数收益率。

❸ 生成带有定向滞后对数收益率数据(+1或者−1)的DateFrame列。

接下来,为支持向量机(SVM)算法、模型拟合和预测步骤实例化一个模型对象。图1-2说明,根据预测买进和卖出苹果公司股票的基于预测交易策略的表现胜过被动的基准股票投资方法。

Python与金融:为什么将Python用于金融?

图1-2 基于ML的算法交易策略与被动基准投资的对比(苹果公司股票)

In [40]: from sklearn.svm import SVC

In [41]: model = SVC(gamma='auto') ❶

In [42]: model.fit(data[cols], np.sign(data['Returns'])) ❷
Out[42]: SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)

In [43]: data['Prediction'] = model.predict(data[cols]) ❸

In [44]: data['Strategy'] = data['Prediction'] * data['Returns'] ❹

In [45]: data[['Returns', 'Strategy']].cumsum().apply(np.exp).plot(
figsize=(10, 6)); ❺

❶ 实例化模型对象。

❷ 根据期货和标签数据(全部是定向的)拟合模型。

❸ 使用拟合模型创建预测(样本内),这同时是交易策略的头寸(买入或者卖出)。

❹ 根据预测值和基准对数收益率计算交易策略的对数收益率。

❺ 绘制基于ML交易策略表现与被动基准投资表现的对比曲线。

这里采用的简化方法没有考虑交易成本,也没有将数据集分为训练和测试子集。但是,这个例子说明,至少从技术意义上,将ML算法应用到金融数据有多么简单。在实践中,需要考虑一些重要的因素(参见Lopez de Prado(2018))。

人工智能优先金融学

AI将像对待其他领域一样,重塑金融行业。通过编程API功能可以取得大量金融数据,这成为了该领域的引擎。

作为数据驱动金融学的自然延伸,不管从研究还是从业者的角度,金融学中的人工智能当然也是一个令人痴迷和兴奋的领域。不过,这些技术与方法对人工智能优先金融学同样重要。

1.5 结语

Python作为一种语言,但更多的是作为生态系统,是金融业理想的技术框架。它的特性中有许多好处,比如简洁的语法、高效的开发方法和原型化及生产的易用性等。利用Python大量的可用库和工具,我们似乎能够应付当今金融业中分析、数据量和频率、依从性及监管所引发的大部分问题。即使在较大型的金融机构中,它也具备提供单一、强大、一致性的框架,简化端到端开发和生产工作的潜力。

此外,Python已经成为人工智能、特别是机器与深度学习工作者选择的编程语言。因此,Python对于数据驱动金融学和人工智能优先金融学来说也是合适的语言,这两种当今的趋势将从根本上重塑金融学和金融行业。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>