量化百科

我是如何通过机器学习和高频交易赚到500K美元的

由polll创建,最终由polll 被浏览 87 用户

翻译一篇外文博客,觉得里面的一些东西现在仍有参考意义,分享一下。

整个系统一个人做的真的挺累的,刚开始是被标题吸引了,看到后面越来越觉得觉得工作量真的好大,而且是2009-2010年的时候。

作者的P&L看着相当耀眼啊,当然,有人怀疑~。

好玩的是,下面有人讨论作者用的只是优化算话和程序化交易,并不是ML,作者还在解释,哈哈~~。

还有就是做数字货币亏了的一个哥们说对自己帮助很大,哈哈。

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='995' height='326'></svg>)

水平不足,译的不太好,只能凑合看,英文阅读无障碍者可以点击下面链接看原文。

https://jspauld.com/post/35126549635/how-i-made-500k-with-machine-learning-and-hft​jspauld.com


这篇博客详细记录了我在2009-2010是如何通过高频交易赚到500万美元的。因为是完全独立的交易者而且此程序将不会再用,所以我很乐意毫无保留的进行分享。我的交易主要是Russel2000和DAX期货合约。

我坚信我成功的关键不在于复杂的金融公式而是在于算法的系统设计。这一设计将诸多简单的要素结合在了一起,并利用机器学习来优化,从而达到利润最大化。在此,你并不需要理解复杂的技术,因为我是完全凭直觉来设计程序的。(Andrew Ng’的神奇的机器学习课程已经不可以访问了,但你如果点击此链接的化,会看到我目前的主页——Course Talk,MOOC的概览)。

首先,我要表明我的成功并不是简单的幸运。我的程序每天交易1000-4000次(其中,一半是做多,一半是做空),而且从未涉足多次合约的仓位。这意味着,**对于任意一个交易来说,随机幸运会根本靠不住。**但事实是,我1天的的亏损从未超过2000美元,从未出现过亏损的月份。

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='500' height='310'></svg>)

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='500' height='335'></svg>)

我的交易背景

在建立我的自动交易程序之前,我是一个拥有2年手动交易经验的交易者。这可追溯到2001年,也就是电子交易的早期阶段,当时黄牛党有大量的获利机会。我觉得自己当时所在的事情就像是在特定边界内玩游戏或赌博一样。要成功意味着要快,要有纪律,有良好的模式识别的直觉。我大概赚了25万美元,还清我的助学贷款还有剩余。Win!

在接下来的5年里,我创立了2家公司,并顺便学习了编程。直到2008年底,我才重新开始交易。因为我的第一家公司出售获得的现金流动性不足,而交易有希望获得快钱,所以我开始了下一步行动。

交易API

在2008年,我使用名为T4的软件“手动”进行交易期货。我一直想要一些自定义的快捷键,所以发现T4有API后,我开始学习C语言并建立了自己的快捷键。

当用API试水后,很快我就有了更大的野心:我想教电脑来为我交易。API提供了市场数据流,并能够方便地将订单信息发给交易所。而我所做的仅仅是在这两者之间建立起一种关联的逻辑。

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='253' height='304'></svg>)

算法的设计

从一开始,我的目标就是要建立一个在实盘交易之前有理由相信能够赚钱的系统。为了完成这一目标,我需要建立一个能够尽可能准确模拟实盘交易的交易模拟框架。

在实盘模式时,需要通过API来更新市场信息,所以模拟盘需要读取市场更新的数据文件。为了完成数据收集,我建立了我的第一个简单的模拟系统,它能够API相联,并根据时间戳记录数据。最终,我用4周近期市场数据来训练和测试我的系统。

有了前面的基础工作后,剩下的任务就是如何建立一个可盈利的交易系统。最后我觉得我的算法应该分为2部分:

  1. 预测价格趋势
  2. 进行盈利操作

预测价格趋势

也许任何交易系统的重要组成部分之一便是预测价格趋势。我的也不例外。我将当前价格定义为inside bed和inside offered 均值,并将预测的价格限定在10秒中内。在整个交易日,我的算法需要时时刻刻地进行计算预测。

建立和优化指标

我创建了几个能够预测短期价格趋势的指标。每一个指标会返回正或负。如果大多数时候,指标返回值为正与市场上涨相对应,指标返回值为负和市场下跌相对应,则认为指标有效。

系统能够使我快速判断指标的预测能力,所以我能够尝试不同的指标进而找到有效的。许多指标是由多个变量生成的,所以我能够通过对结果不断比较来找到这些变量的最佳值。

相对简单和基于市场近期事件及相关证券的的指标是最有效的。

精确的价格趋势预测

用指标来预测价格趋势的上升或下降远远不够。我需要精确地知道上升或下降的力度由多大。我需要一个公式将指标值转化为价格的预测。

为了完成这一目标,我追踪了50个buckets中的预测价格变动,这取决于指标的下跌范围。对于每个bucket都有一个唯一的预测值,我在下面的excel表格中进行了展示。从图可以看出随着指标值的增大,价格变化的期望也在变大。

基于这样的图,我可以用一个公式来拟合曲线。刚开始时,我是手动来拟合曲线的,但我很快下了一个程序来自动完成。

注意并非所有的指标曲线的形状是一样的。还要注意,为了均匀的分布数据点,bockets是以对数方式分布的。最后要注意,负指标值(及与之相应的价格下行预测)需要反转并与正值相结合(我的算法上下完全相同)。

单个预测和指标相结合

需要考虑的一个重要事情是每个指标并非完全独立。不能将每个指标的预测简单进行加和。关键是要找出每个指标对已知预测值的额外价值。实施起来这并不难,但意味着曲线拟合多个变量的时候应该当心,因为一个指标的改变将会影响另一个指标的预测。

为了同时用所有指标进行“曲线拟合”,我设置优化器每次更新时尽向新预测曲线走30%,在几次更新后曲线趋于稳定。(这个地方没懂,个人感觉是窗口)??

现在每个指标都为价格预测贡献了自己的力量,我只需要将他们的预测进行简单的加和进而预测10秒钟内的价格趋势。

为什么仅价格预测还不够?

你可能认为凭借这种市场优势,我可大获全胜。但是,需要记住的是市场由出价和报价组成——它不仅仅是单边价格。高频交易的成功得益于获得美丽的价格,但这并不那么容易。

下面的因素将会使建立一个盈利的系统变得很难:

  • 每次交易我都要向交易所和经纪人支付佣金
  • 差价(最高出价和最低报价之间的差价)意味着如果我只是随意买入和卖出,我将会亏死
  • 大多数史称交易量是其他机器人,如果他们认为他们有统计套利优势的话他们才会和我交易
  • 看到一个报价并不保证我能买到它。当我的买单请求发送给交易所的时候很可能卖单已经取消了。
  • 作为一个小的市场参与者,我在交易速度上处于劣势。

建立一个完整的交易模拟系统

所以,虽然有了能够用来回测和优化指标的框架,但这远远不够,更需要一个能够让我优化和回测完整的交易模拟系统的框架,它可以让我发送交易指令并达成交易。所以,在接下来的例子中我优化了总的P&L(profit&Loss的简写),并在某种程度上均化了每个交易的P&L。

这将比较棘手,而且在在某种程度上来说无法做到精确建模,但我会尽力而为。 下面是我所做的一些必要改进:

  • 在模拟市场环境下,当订单发送后,我会模拟延迟时间。事实是当我的系统检测到一个卖单时并不意味着我能立刻买到它。在系统发送买单约20毫秒后,如果卖单尚未被其他买家买走,则可认为是一个可执行交易。这并不准确,因为实际的延迟时间是不连续的并且无法得到延迟报告。
  • 当我挂买单或卖单时,我必须查看交易执行流(可通过API获取),使用它们来估算何时会执行我的订单。 为此,我必须跟踪订单在队列中的位置。这是先进先出系统。)同样,我无法完美地做到这一点,但我做出我能做到的最好估计。

了为进一步优化我的交易模拟系统,我通过API获取了实盘交易日志,并和同一时期内我的模拟交易日志进行对比。使我的模拟交易系统达到了足够的精确度,对于无法精确的部分,至少使其统计分析结果是一致(in the metrics I thought important)。

进行盈利交易

有了订单模拟模型后,我现在可以在模拟模式下发送订单并查看模拟的损益表。 但是系统如何知道何时何地买卖?

价格走势的预测仅仅是万里长征第一步。我后续做的还有给5个level出价和报价做了一个评分系统,其中包括内部出价之上的一个级别(用于买单)和内部出价之下的一个级别(用于卖单)。

如果在特定价格水平下的评分高于某个阈值,意味着应该积极买入,低于阈值的话,则应该撤销买单。

基于此,我的系统在市场上出现一个出价然后立即将其取消的情况并不少见。

价格水平评分是基于以下因子计算的:

  • 价格趋势的预测
  • 存疑的价格水平(Inner levels meant greater price move predictions were required)
  • 在我的挂单前的合约数量(越少越好)
  • 在我的挂单后的合约数量(越多越好)

从本质上讲,这些因素有助于确定“安全”的竞标/报价位置。 单靠价格变动的预测是不够的,因为它不能说明以下事实:在下标时不会自动撮合成功-只有在有人卖给我的情况下,才能撮合成功进而成交。 事实上,当有人以一定价格卖给我时就改变了交易的统计赔率。

此步骤中使用的变量均经过了。除了额外对策略参考标准的损益进行优化外,其他优化方式与价格变动指标变量的优化方式完全相同。

我的程序所忽略的内容

当人进行交易时,由于受偏见和情绪的影响,很容易导致决策失误。当然,我想再次一一列举这些偏见。下面是我的系统所忽略的一些因素:

  • 持仓价格-在交易中,经常听到有人谈论多头或空头的价格的,好像这会影响他们未来的决策一样。尽管这作为降低风险策略的一部分具有一定的有效性,但实际上与市场事件的未来进程无关。 因此,我的程序完全忽略了此信息。 这与忽略沉没成本的概念相同。
  • 卖空与退出多头-通常,交易者将用不同的标准来确定卖出多头和卖空的位置。但是,从算法角度来看,没有理由进行区分。 如果我的算法预期价格向下,卖空是个好主意,无论当前是多头,空头还是持平。
  • “加倍”策略-这是一种常见策略,交易者会在原始交易不利于他们的情况下购买更多股票。 这样一来,平均购买价格就会降低,这意味着当股票价格掉头向上的时候就会立刻赚钱(如果有向上的时刻的话)。 在我看来,除非您是沃伦·巴菲特(Warren Buffet),否则这实际上是一个可怕的策略。你会自欺欺人的认为自己做的挺好,毕竟大部分的持仓能赚钱。 问题是,如果股票价格没反弹的话,你亏的会更多。 另一个影响是,这使得很难判断是策略优势或只是幸运。 能够检测并确认我的程序确实具有优势也是重要目标之一。

风险控制

不管是从什么时候开始交易,不管当前是空头还是多头,我的算法都是用相同的方式做出决策,所以除了一些大的盈利,偶尔会有一些大的亏损。但是,你不要认为没有任何风险管理。

为了管理风险,我一次强制执行2个合约的最大头寸规模,偶尔在交易量旺盛的时候增加。为了防止市场背景发生较大变化或软件中的bug,我还设置了每日最大损失限额。这些限制条件加在了我的程序中,同时也在后端也通过我的经纪人来把关。不过碰巧的是,我从未遇到任何重大问题。

跑算法

从我开始编写程序的那一刻起,我花了大约6个月的时间才使它成功运行并盈利。实际上,大多数时间都是在学习一门新的编程语言。在改进程序的过程中,我发现接下来四个月的每个月都有增加的利润。

每周,我都会根据前4周的数据对模型进行重新训练。在捕获最近的市场行为趋势与确保算法有足够的数据来建立有意义的模型之间达成了较好的平衡。随着训练越来越耗时,我将其拆分并用Amazon EC2的8个虚拟机运行。然后将结果合并到我的本地计算机上。

我的交易成绩最好的时候是2009年10月,当时我赚了近10万。此后,尽管每个月的利润都减少了,但我仍继续在接下来的四个月中努力改进我的程序。不幸的是,到现在为止,我已黔驴技穷,因为我尝试过的任何努力似乎都无济于事。

由于无法进行改进和缺乏成长感,我开始思考新的方向。我给6家不同的高频交易公司发送了电子邮件,以查看他们是否有兴趣购买我的软件并雇用我为他们工作。没有人回答。我有一些新的创业想法想做,所以不再跟进。

更新-我将此内容发布在了《黑客新闻》上,引起了很多关注。 我只想说,我现在不主张任何人试图做这样的事情。您将需要一个拥有很多经验的非常聪明的团队,才能有获胜的希望。即使我这样做,我也相信个人很少能取得成功(尽管我听说过其他人。)

标签

机器学习高频交易程序化交易