70+专家分享实战经验,2024年度AI最佳实践都在AICon北京 了解详情
写点什么

你以为 AlphaGo 只是下围棋厉害?不,它还能用来优化金融交易策略参数

  • 2019-03-18
  • 本文字数:4268 字

    阅读完需:约 14 分钟

你以为AlphaGo只是下围棋厉害?不,它还能用来优化金融交易策略参数

提取阿尔法狗中的灵感

还记得 2016 年 3 月 9 日-3 月 15 日在韩国首尔上演的围棋界终极挑战吗?在总计五轮的人与机器的对决,人类一方的代表——世界围棋冠军李世石很不幸完败于机器一方的代表——美国 Google 公司旗下 DeepMind 团队开发的围棋人工智能程序 AlphaGo(“阿尔法狗”),这个结果引起了人工智能领域巨大的轰动,也引发了人们对阿尔法狗核心技术的深入研究。


这场终极对决可谓是意义深远,AlphaGo 的胜利意味着人们对人工智能的探索已经到达了一个新的阶段。早期传统的棋类软件一般采用暴力穷举法,也就是把棋盘上所有可能局面一一列举出来建立搜索树,并遍历搜索树从中筛选最优势的走法。不过这只能适用于解决效率低,规模小的问题。由于围棋是一种复杂且深奥的游戏,一方面围棋的每一步可能性非常多,另一方面落子选择在某种程度上依靠棋手经验积累,因此在瞬息万变的局面下,计算机很难分辨当下棋局的优势方和弱势方。可见攻克围棋一直被认为是人工智能领域中的一个巨大挑战。


AlphaGo 则采用了深度神经网络、监督/强化学习、蒙特卡洛树搜索这三个“利器”的结合完美解决了以上这些问题。下面简单了解下这三个“利器”,看下是哪件“利器”解决了搜索棋局样本空间巨大这个问题。


关于深度神经网络,AlphaGo 包含策略网络和估值网络。策略网络主要是用来生成落子策略,它会根据棋盘当前的状态,搜索出最符合人类高手的几种可行的下法位置。但是策略网络只知道这步棋是否跟人类下的一样,并不知道这步棋到底下得好不好,这时候需要估值网络为各个可行的下法评估出一个“胜率”,策略网络结合“胜率”最终确定落子的策略。


关于监督/强化学习,AlphaGo 背后是一群杰出的计算机科学家,在初始阶段,科学家利用神经网络算法将大量棋类专家的比赛数据输入给 AlphaGo,使它学习人类棋手的下法,形成自己独特的判断方式。之后,在不计其数的自我模拟对弈,以及每一次与人类棋手对弈中,总结并生成自己的“经验”,实现自我提高。


关于蒙特卡洛树搜索,在从根结点开始选择要搜索的分支子结点时,每一次决策都会同时产生多个可能性,AlphaGo 对这些可能结果进行仿真运算,根据估值网络反馈的胜率作出最优决策,通过不断的推演使得游戏局势向预测的最优点移动,直到模拟游戏胜利。



对于解决如何在搜索样本空间巨大的情况下搜索出更好的节点,蒙特卡洛树搜索法 MCTS(Monte Carlo Tree Search)起到了至关重要的作用。单从字面意思上蒙特卡洛树搜索法可理解为在树搜索方法上融入蒙特卡洛法,将随机模拟的思想应对于大量不确定样本的情况下。通过不断的模拟得到大部分节点的估值,然后下次模拟的时候根据估值有针对地选择值得利用和值得探索的节点继续模拟,在搜索空间巨大并且计算能力有限的情况下,这种启发式搜索能更集中地、更大概率找到一些更好的节点。那么随机模拟的蒙特卡洛算法又是如何实现的呢?

深入了解蒙特卡洛思想

蒙特卡洛(Monte Carlo)法确切地说是一类随机模拟算法的统称,提出者是大名鼎鼎的计算机之父冯·诺伊曼,因为在赌博中体现了许多随机模拟的算法,所以他借用驰名世界的赌城—摩纳哥的蒙特卡洛来命名这种方法。


此处以网络上普遍采用的例子加以扩展来解释下蒙特卡洛法的思想。


假如篮子里有 1000 个苹果,让你每次闭着眼睛拿 1 个,挑出最大的。于是你闭着眼睛随机拿了一个,然后再随机拿一个与第一个比,留下大的,再随机拿一个,与前次留下的比较,又可以留下大的……你每拿一次,留下的苹果至少是当前最大的,循环往复这样,拿的次数越多,挑出最大苹果的可能性也就越大,但除非你把 1000 个苹果都挑一遍,否则你无法肯定最终挑出来的就是最大的一个。


这么看来蒙特卡洛法的理论支撑其实是统计概率理论中的伯努利分布。以抛硬币为例,每次抛硬币只有正面朝上或反面朝上两种可能的结果,由于伯努利分布的特点是每次采样是相互独立的,那么前 5 次抛硬币对于第 6 次抛硬币的结果没有任何影响。当抛硬币次数的增加到一定次数时会发现正面和反面出现的概率会无限的接近于 50%。


挑苹果也是一样的,每次挑出最大的苹果的概率是 1/1000(此处概率仅为说明观点,实际上第一次的概率为 1/1000,第二次开始为 1/999),由于每次挑选是一个独立的事件,在独立事件中 1/1000 这个概率是始终保持不变的。当挑苹果次数的增加到一定次数时会发现实际挑出最大的苹果的次数会遵循 1/1000 这个概率。


也就是说,蒙特卡洛法采样越多,越能找到最佳的解决办法,但只是尽量找最好的,不保证一定是最好的。在这种情况下如果要求必须找出最优解,也就是最大的苹果,那还不如采用暴力穷举法逐个比较所有的苹果的大小来的直接,但是如果用这种方法寻找一个连续区间[-2,2]上某个函数的极值时肯定是行不通的,此时更合理的是用蒙特卡罗法在有限采样内,给出一个近似的最优解。我们通过以下计算函数极值的实验了解下蒙特卡洛法的应用。

实验原理:

极值是“极大值” 和 “极小值”的统称。如果一个函数在某点的一个邻域内处处都有确定的值,当函数在该点的值大于或等于在该点附近任何其他点的函数值,则称函数在该点的值为函数的“极大值”;当函数在该点的值小于或等于在该点附近任何其他点的函数值,则称函数在该点的值为函数的“极小值”。此处在区间[-2,2]上随机生成一个数,求出其对应的 y,找出其中最大值可认为是函数在[-2,2]上的极大值。

实验步骤:

(1)设函数 y=f(x)=200*sin(x)e-0.05x


(2)随即取点(X),使得-2 <=X<=2,即点在区间[-2,2]内


(3)通过公式 f(x)> f(x)max 判断当前点的值是否是最大值


(4)每次更新最大值和对应的点。


(5)运行结果发现极大值 185.1204262706596, 极大值点为 1.5144491499169481


例程如下:


def cal_extremum_mc(n = 1000000):
y_max = 0.0 x_min, x_max = -2.0, 2.0 y = lambda x:200*np.sin(x)*np.exp(-0.05*x)#匿名函数
for i in range(0, n+1): x0 = random.uniform(x_min, x_max) if y(x0) > y_max: y_max = y(x0) x_max = x0 return y_max, x_max
复制代码


以上例子也称为基于蒙特卡洛的投点法,由此得出的值并不是一个精确值,而是一个近似值。当投点的数量越来越大时,这个近似值也越接近真实值。

金融交易策略的参数优化

科学家们花费大量心血研究 AlphaGo 并不是为了炫耀在围棋领域能够战胜人类,而是想将它的核心技术推广到各种领域帮助人类解决问题。反观金融领域,在金融市场中又何尝不是充满了随机性和不确定性,那么蒙特卡洛法如何应用到金融领域在不确定的市场中寻求近似确定性的方向呢?


在传统的主观型交易中,那些技术面分析的交易者习惯于围绕盘面各种成熟指标的动态来制定交易策略,比如 MACD、KDJ、均线指标等等。其实所有的技术指标都是依据股票收盘价、开盘价、最高价、最低价、成交量等原始的交易数据通过某种算法计算而来的。以最常用的移动平均线来说,10 日均线即“之前 10 个交易日”收盘价的加权平均价,所谓的移动就是将新一个交易日的收盘价加入公式中,同时剔除最早一个交易日的收盘价,不断右移计算输出当日对应的 SMA 值,然后将它们连接起来构成均线。




大家是否注意到,在大多数的股票行情软件中默认的均线参数普遍是 5 日、10 日、20 日、30 日、60 日、120 日……而非 6 日、7 日、21 日之类,在各种介绍炒股秘籍的书中也清一色的告诉读者参照这些默认的参数制定炒股策略。但是这些默认值真的就是最优化的参数值了吗?好像并不见得,那么让我们开始寻找最优化的参数。


此处我们将一个简单的单均线突破策略应用于浙大网新上进行回测。单均线突破的交易策略为:若昨日收盘价高出过去 N 日移动平均线则今天开盘即买入股票;若昨日收盘价低于过去 N 日移动平均线,那么今天开盘卖出股票。我们用暴力穷举法遍历了 20 至 60 日均线之间的所有均线参数,发现资金收益最高时所对应的移动平均线的最优参数是 58 日,而并非通用的 60 日。



近几年来金融量化交易发展愈来愈火爆,借助计算机的强大性能,运用数据建模、统计学分析、程序设计等工具制定交易策略已经成为金融交易市场的一个大的发展趋势。因此相对于传统的主观型交易,策略参数的最优化过程在量化交易中变得更便捷。那么在制定策略过程中如何选择策略的最优化参数呢?


显然,暴力穷举法只能适应于上述小规模遍历 20 至 60 日均线之间的参数,而对于稍复杂一些的策略模型,如双均线突破策略就需要两组参数样本空间两两排列组合。双均线突破策略为:当短期均线穿过长期均线,同时往上时认为上升趋势成立,作为买入信号;当短期均线穿过长期均线,同时往下时认为下跌趋势成立,作为卖出信号。如果短期均线参数样本范围为 [10,50],长期均线参数样本范围为 [50,90],那么需要遍历的参数组合就有 1600 组,再叠加其他指标的参数种类后样品空间会变得非常巨大。


再从金融市场和量化交易策略模型本身来看,市场在变化,信息在变化,过去并不代表未来,用历史数据作量化策略的回测检验是把过去的经验作为一种参考指南,通过对过去的解读发掘出蕴藏盈利机会的重复性模式。这就像在正式高考前学校都会定期组织模拟考来评估下自己的能力,显然最终的高考题目不会和模拟考一摸一样,但在模拟考发挥的水平正常情况下和高考发挥的水平相差不会太大。 可见我们并不需要一成不变的固定参数值,而是持续不断的更新接近于最优的策略参数值。


因此蒙特卡洛法成为了参数最优化的首选方案。以下例程为分别在短期均线和长期均线的样本空间中随机生成均线参数的方法,而后可将采样的组合参数代入策略中进行回测分析。


例程如下:


def cal_moveavg_mc(n = 500):
avg1_min, avg1_max = 10, 50 avg2_min, avg2_max = 50, 90 ma_list = []
for i in range(0, n+1): avg1 = int(random.uniform(avg1_min, avg1_max)) avg2 = int(random.uniform(avg2_min, avg2_max)) ma_list.append([avg1,avg2]) #此处添加回测采样参数 return ma_list
复制代码

总结

本文简要介绍了 AlphaGo 的三个“利器”,以及解决搜索棋局样本空间巨大这个问题所采用的蒙特卡洛树搜索法,进一步从中提取蒙特卡洛法应用于量化交易的策略参数优化中。量化交易的本质是管理胜算的概率,而蒙特卡洛法的随机过程同样是以概率的形式求取近似的解,笔者认为在充满不确定性的金融市场中,将蒙特卡洛法应用于量化交易的策略参数最优化过程,能够在参数样本空间巨大的情况下择优选出策略参数,值得在业界进行推广。

作者介绍

元宵大师,Python 高级工程师,公众号《元宵大师带你用 Python 量化交易》作者,致力于推动人工智能在金融量化交易领域中的应用。


2019-03-18 13:009615

评论

发布
暂无评论
发现更多内容

详细讲解:python中的lambda与sorted函数

计算机与AI

Python

腾讯技术官又曝神作,两份堪称‘千古绝唱’操作系统笔记现已被全网疯传

编程 操作系统 计算机

Underlay网络:如何立住可靠又支持大规模无收敛的“人设”

华为云开发者联盟

云服务 交换机

随机森林原理介绍与适用情况(综述篇)

计算机与AI

数据挖掘 学习 数据科学 随机森林

「红黑树」背了又忘?深入本质,他也不过是一棵二叉树

小松漫步

Tensorflow2.0安装使用

MySQL从删库到跑路

人工智能 tensorflow Anaconda Jupyter Notebook

技术心得丨一种有效攻击BERT等模型的方法

华为云开发者联盟

学习 AI

华为丁耘,解读百尺竿头的中国5G

脑极体

面向对象编程会被抛弃吗?这五大问题不容忽视

Java架构师迁哥

极客时间架构师培训 1 期 - 第 4 周总结

Kaven

Anaconda安装使用和akshare库使用

MySQL从删库到跑路

Python 数据分析 Windows 10 Anaconda akshare

Python 疑难问题:[] 与 list() 哪个快?为什么快?快多少呢?

Python猫

Python 学习 编程 程序员

后疫情时代,华为云会议如何定义未来会议?

华为云开发者联盟

视频 会议

技术解读丨分布式缓存数据库Redis大KEY问题定位及优化建议

华为云开发者联盟

云计算 华为 技术

BATJ内部Java求职面试宝典,尤其应届生如果还没有学过那后悔去吧,也许你已经错过N多家大厂offer;

Java架构师迁哥

UBBF2020:智能联接,共创行业价值新增长

DT极客

甲方日常 30

句子

工作 随笔杂谈 日常 心情

华为云专家带你解读文本情感分析任务

华为云开发者联盟

内容 数据 分析

手把手带你玩转 openEuler | 如何安装 openEuler

openEuler

Linux 开源 操作系统 openEuler

图解 K8S 源码 - QoS 篇

郭旭东

Kubernetes Kubernetes源码

OpenResty 项目脚手架

铁匠

lua nginx openresty

优秀开源项目、博客、书籍整理

铁匠

收藏教程 资源汇总

解释一下==和equals的区别,你以为就这么简单?那你就草率了

小Q

Java 学习 架构 面试 基础

推荐一款MySQL开源客户端,免费+跨平台+使用便捷!

王磊

MySQL

远程触发Jenkins的Pipeline任务的并发问题处理

小Q

Java 学习 编程 架构 并发

容器技术为什么会这么流行

架构师修行之路

Docker 容器 分布式 微服务

详细分析定制企业应用的价格

Philips

敏捷开发 快速开发

netfilter/iptables 原理

为为

Service Mesh Linux Kenel

Kubeless 函数部署遇到了问题,如何 Debug? | 玩转 Kubeless

donghui

Serverless kubeless

打通Docker镜像发布容器运行流程

架构师修行之路

Docker 容器 分布式 微服务

分配时间戳和生成水位线

小知识点

scala 大数据 flink

你以为AlphaGo只是下围棋厉害?不,它还能用来优化金融交易策略参数_AI&大模型_元宵大师_InfoQ精选文章