龙空技术网

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

程序员荐书 2089

前言:

眼前姐妹们对“is算法交易策略是什么”都比较重视,各位老铁们都想要分析一些“is算法交易策略是什么”的相关文章。那么小编同时在网摘上汇集了一些有关“is算法交易策略是什么””的相关文章,希望姐妹们能喜欢,小伙伴们一起来学习一下吧!

1.3 用于金融的Python

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

金融行业中的科技成本;作为新业务和创新业务引擎的科技;作为金融行业进入门槛的科技;不断提升的速度、频率和数据量;实时分析的兴起。本节,我们分析Python如何帮助你应对这些方面的多种挑战。不过首先让我从更为基础的方面——语言和语法介绍用于金融的Python。1.3.1 金融和Python语法

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

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

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

初始股票指数水平S0=100;欧式看涨期权的行权价格K=105;到期时间T=1年;固定无风险短期利率r=5%;固定波动率σ=20%。

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

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

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

(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代码。下面的代码将实现一些必要的步骤。

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 mathimport numpy as np# Parameter ValuesS0 = 100. # initial index levelK = 105. # strike priceT = 1.0 # time-to-maturityr = 0.05 # riskless short ratesigma = 0.2 # volatilityI = 100000 # number of simulations# Valuation Algorithmz = np.random.standard_normal(I) # pseudo-random numbers# index values at maturityST = S0 * np.exp((r - 0.5 * sigma ** 2) * T + sigma * math.sqrt(T) * z)hT = np.maximum(ST - K, 0) # payoff at maturityC0 = math.exp(-r * T) * np.mean(hT) # Monte Carlo estimator# Result Outputprint('Value of the European call option %5.3f.' % C0)

这一小节中的简单算法示例说明,Python的基本语法很适合为经典的科学语言二重奏——英语和数学来提供补充。在科学语言组合中添加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 inlineIn [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 KBIn [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使整个时间系列的处理变得就像浮点数上的数学运算那样容易。

图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 数据驱动和人工智能优先的金融学

在2018年8月更新第2版的这一节时,2014年本书第1版中有关科技与金融学之间关系的言论似乎仍然适用且重要。但是,本节将讲述金融业的两个重要趋势,它们将从根本上重塑这个行业。这两个趋势主要是在过去的几年内形成的。

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 KBIn [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:RTRSIn [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等交易平台(在第14章和第16章中会讲到)来免费获得类似的数据集。一旦在Python级别上得到数据(独立于原始来源),就可以利用Python数据分析生态系统的全部功能了。

 

数据驱动金融学

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

1.4.2 人工智能优先金融学

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

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

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

In [36]: import numpy as np         import pandas as pdIn [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 = 6In [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说明,根据预测买进和卖出苹果公司股票的基于预测交易策略的表现胜过被动的基准股票投资方法。

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

In [40]: from sklearn.svm import SVCIn [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功能可以取得大量金融数据,这成为了该领域的引擎。第13章中介绍AI、ML和DL基本方法,并在第15章和第16章中将其应用到算法交易中。不过,全面介绍人工智能优先金融学需要一本专门的图书。

作为数据驱动金融学的自然延伸,不管从研究还是从业者的角度,金融学中的人工智能当然也是一个令人痴迷和兴奋的领域。本书在不同背景下使用了多种AI、ML和DL方法,但总体的焦点与本书的副标题相符,仍是数据驱动金融学所需的Python基本技术与方法。不过,这些技术与方法对人工智能优先金融学同样重要。

1.5 结语

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

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

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

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

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

标签: #is算法交易策略是什么 #lags matlab