中文标题:如何借助机器学习和高频交易赚到50W美元
英文标题:How I made $500k with machine learning and HFT (high frequency trading)
发布平台:个人博客
发布日期:2014-07-30
作者:Jesse Spaulding
文章类型:webpage
品读时间:2023-02-14 19:22
1 文章萃取
1.1 核心观点
- 针对Russel 2000和DAX期货合约进行高频交易
- 每日交易频次达到了1000-4000笔(一半做多,一半做空)
- 没有一天损失超过2000美元,也没有一个月亏损
1.2 综合评价
- 算法细节描述偏少,可以参考一下设计思路和底层逻辑
- 收益曲线的走缓说明策略存在时效性,并且写作背景较早(2012年)
- 收益周期与经济上行大环境存在相关性,可能存在时势因素( 2009 年 6 月和 2010 年 10 月,道指从 7000 点涨到 11000 点,罗素指数从 600 点涨到 800 点)
1.3 主观评分:⭐⭐⭐
2 精读笔记
2.1 成长历程
2001年-2003年:2年“手动”日间交易员经验,借助早期漏洞当“黄牛”赚了25w美元
2003年-2008年:两次创业,学习了一些编程技能
2008年底:开始自学C#并调用T4软件的API接口实现量化交易
作者花了6个月自学编程并达到赢利点,之后的四个月利润一直在改善
作者在评论区提到量化交易前的初始资金是3w美元
2009年6月到2010年10月,量化交易的累积收益接近50w美元
量化交易收入的最高点是在 2009 年 10 月,一个月赚了将近10w美元
后期的模型训练耗时较多,因此作者将训练任务分配到8台amazon EC2,并在本地机器汇总结果。相应的需要每月为服务器支付大约 200 美元,为软件API服务支付 1800 美元/月
但是自2010年10月之后的7个月,收益便不怎么增加(在此期间,作者尝试了各种能想到的改进方法,但是并没有太大起色,后来想卖程序给高频交易公司也没人理睬),之后作者发表了本博客并收到大量的关注与反馈
2.2 算法设计
交易框架:
- 交易模式主要分为实时与模拟两种情况
- 前者会通过API获取市场相关信息,后者则从数据文件中读取
- 每周都根据过去4周的市场数据重新训练并测试模型
- 框架的核心在于预测价格走势并寻找有利可图的交易
预测目标:
- 将当前价格定义为买入价与卖出价的均值
- 预测目标是未来10秒内的价格,预测过程是持续的
筛选指标:
- 寻找被证明对短期价格预测有意义的指标作为输入特征
- 通过交易框架快速验证指标的有效性,并确定指标的最佳参数
- 最有用的指标都比较简单,与交易市场和近期事件有关
- 对指标进行分桶(50个桶),针对每个桶生成对应的价格
- 最后拟合曲线,横轴为分桶后的指标,纵轴为预测的价格
作者在后续的答疑中补充了一点策略采用的两类指标:
- 一类指标是基于正在交易的合约市场微观结构,比如出价远高于入价时,价格更有可能上涨;当近期有买入合约将要执行时,价格更有可能上周
- 另一类指标与正在交易的市场内容有关,根据事件进行预测(套利),简单来说,标普指数上涨时,罗素指数也可能上涨,而这种指标大多数在非常小的时间尺度(毫秒)内是有效的
- 做市技巧:当有其他订单排在后面时保持出价,否则取消出价
指标融合:
- 每个指标都拟合出一条对应的价格曲线,但不同指标间不是独立的
- 不能简单加和所有指标的预测,而是保留每个指标所具有的额外预测值
- 作者采用迭代的方法同时拟合所有指标,假设第$i$次拟合结果为$C_i$,第$i+1$次迭代后的该变量是$\Delta_{i+1}$,则$i+1$次的拟合结果是$C_{i+1}=C_i+\Delta_{i+1} \times 30%$,即每次仅保留30%的变化量,多次迭代后模型将收敛(此处逻辑为个人推测)
- 实际使用时,就是把所有的额外预测值($30% \Delta$)相加,即可得到未来10秒内的价格预测
- 补充:作者后续在评论区提到,他未来拟合所有曲线,构建了一个成本函数用于衡量一条可能的曲线到每个数据点间的差异,模型迭代的目标是成本最小(具体细节还是有点模糊,感觉就是个魔改版的回归方程?)
盈利的困难点:
- 每笔交易都需要向经纪人和交易所支付佣金
- 价差(最高卖出价和最低买入价之间的差值)意味着随机交易往往是亏损的
- 大量市场交易都是其他高频量化策略,盈利意味着策略间的对抗胜利
- 从看到出价到完成交易存在时差,在此期间交易很可能会被取消(所以订单发送后,需要对滞后时间进行建模,等待大概20毫秒(实际时间不一定)后,只要当报价仍然存在时才视为交易已执行;有90%交易的订单会被取消,这也是高频交易的一个主要标志)
- 大公司的量化策略更具备网速和算力上的优势(作者将系统放在位于芝加哥的清算公司服务器上运行,可以直接访问芝加哥期货交易所,该策略讲究毫秒必争)
- 注意跟踪订单在交易队列(先进先出)中的位置,根据API提供的交易执行流评估订单的执行时间;无论是滞后时间还是订单位置,都可以根据API反馈的实际交易日志进行调整,至少确保统计上相似性
寻找有利可图的交易:
- 将买入/卖出价格划分为5个水平(比如高于内部买入价,或低于内部卖出价)
- 构建评分系统,考虑因素:已有模型的预测价格走势、价格水平、交易队列的长度、订单在队列中所处的位置(位于订单前面的合约越少越好,位于订单后面的合约越多越好)
- 以上操作的目的是确定当前买入/卖出价格的合理性,为交易提供安全的操作空间
- 最后就是注意风险管理,限制每次交易的最大规模(2份合约,偶尔在交易量大的日子里会增加);设定每日的最大损失限制,防止市场意外和可能的软件错误
2.3 答疑与常见问题
由于后续文章火了,所以评论区也很热闹,作者也单独更新了一些常见问题的答疑
- 这个交易策略的成功不是运气,高频在统计意义上确保了策略的有效性
- 作者并不打算开源代码,一方面是策略已经失效,另一方面是避免有人利益熏心,误入歧途
- 作者策略生效的时期对应着市场环境转暖的时期,并且指标的有效寿命也比较短
- 评论区有人认为,作者策略是自动化交易,而不是高频交易(用交易量和交易速度取胜)
- 作者认为自己的程序不存在方向性偏差,程序每天都会进行大量多头/空头交易,策略在大盘上涨日和下跌日都表现良好,并且每日亏损从未超过2000美元。这并不是单纯的市场上行趋势所能解释的