程序化 Options trading 浅尝辄止

2022-12-05 14:28:47 浏览数 (1)

前几天我的前老板 T 跟我聊了下他正在着手筹划的 algo options trading 项目,他拜托我帮他找找合适的工程师。我仔细研读了他的计划书,感觉还有点意思。基本思路是:跟随股票的涨跌趋势,在 该股的 option 市场选择合适的合约下注。如果预测股票上涨,则购买相应的 Call option,否则购买 Put option。他目前有一个运作还不错的策略,在手工执行和测试中。未来,他希望这个项目不仅可以为自己公司的 fund 赚钱,还能逐渐转化成一个平台,简化人们做程序化交易的难度,就像 Robinhood 简化大家买卖股票的难度一样。T 会为他的初始团队提供丰厚的,有竞争力的工资,以及交易系统盈利的一部分作为奖金。

对于 options trading,我是个门外汉。我仅有的对 option 认知是:你可以用一笔小钱(保费)来保障你的股票可以在未来某个时间点以一个固定的价格卖出;或者你也可以购买未来某个时间点以一个固定的价格买入股票的保障。打个不恰当的比方:如果把购买股票看做买车,那么 option 相当于为车上的保险。保险是有时间成本的,到期就要续保(之前的保险价值归零),因而,时间越长的保险,其价格也就越高。和车险不同的是,你为股票购买的「保险」—— options,在其存续期内是可以交易的,所以这里就存在套利的空间。但 options 的套利相对于股票来说,更加复杂,它的价格受到股价波动,剩余时间,以及流动性这几个因素的影响。

对于流动性,options 不像股票,一般来说只有一些体量巨大且足够热门的股票,才有足够的流动性,所以你选择特斯拉(TSLA)这样的股票做 options trading,才可能在你想要交易的时候,有足够买方/卖方去匹配。

对于剩余时间,option trading 要避免剩余时间太长或者太短的合约,太长的合约价格不友好;太短的合约有归零风险。如果用程序做日间交易,那么剩余时间在一周内的合约比较合适。

解决了流动性和剩余时间的问题,剩下的就是如何预测未来股价的走势,然后在相应的合约下注。这一块,要解决的问题和已有的股票交易系统大同小异,所以这个周末,我花了亿点点时间,研究了一下很久很久没有触碰的程序化交易系统。

在 github 的 topics 下,搜索 options-trading / algorithm-trading,都能找到不少项目:

这些项目,Python 是主力,占据了半壁江山。Rust 是后起之秀,很多新项目都是 Rust 开发的。Python 是主力这不难想象:Python 有很好绘图工具(比如 matplotlib),有很好的数据处理工具(pandas,可以几行代码轻松搞定大部分技术分析),以及大规模的用户群体。程序化交易是一个带着浓厚领域知识的行业,大部分程序员没有这方面的领域知识,而大部分行业内的从业者或多或少都会在工作中用到 Python,所以几乎每一个交易软件,都会优先提供 Python SDK。这进一步强化了 Python 的统治地位。

然而,Python 程序运行效率低,所以传统上很多交易系统都会用 C 重写需要性能的部分:比如用 pandas 做技术分析,虽然短平快,但各种技术指标的实时计算用 Python/pandas 效率太低,所以有 ta-lib (technical analysis lib)这样的 C 库来为 Python 项目的性能托底。如今,Rust 越来越流行,Rust 圈内又一直在刮一股「用 Rust 重写基础软件,基础类库」的妖风,于是 ta-lib 有了与之对应的 ta-rs,yata(yet another technical analysis lib)等。而在这些基础库的基础上,诞生了如 barter-rs,botvana 这样的高性能,事件驱动的 trading platform。

比如 botvana,它的架构是这样子的:

(来源:https://github.com/featherenvy/botvana)

感觉很有意思,activity report 的设计值得借鉴。

在探索的过程中,我不禁技痒,想看看做程序化交易难度几何。做这样一个交易系统,基本需求是:

  • 处理历史数据和实时数据
  • 根据数据计算各种指标(indicators)
  • 根据可配置的预测策略来预测涨跌机会
  • 根据可配置的风险策略来筛选合适的机会
  • 当机会出现,根据当前的现金流/持有合约的情况进行交易
  • 交易记账,生成报表

按照这个基本的需求,我草拟了一个架构图(我绘制这个图时还没有发现 botvana):

当然,我没有功夫来做这样一个完整的系统,所以,我从网上找了特斯拉的历史数据(2022/04 的分时数据),使用 yata 构造了 RSI(Relative Strength Indicator) 和 Stoch(Stochastic Oscillator)这两个 indicator,围绕它们构建了一个简单的预测策略,然后把所有数据写入 postgres,用 grafana 将其可视化。整个 POC 代码的结构大概是这个样子,像极了一个常规的 ETL:

短短两百多行代码,我却花了差不多一天的时间来探索。主要原因是我对技术分析那些术语不太了解,光是看 RSI 指标是如何生成的就花了不少时间。还有大量的时间花在选择合适的可视化工具上。一开始我是想找个 chart 库做个简单的前端,后来无意中发现 Grafana 8.x 版本支持了 candlestick 图。因为我从来没用过 grafana 的 candlestick 图,所以折腾了好一阵子才搞明白怎么在 candlestick 上绘制技术分析指标。

最终得出的结果如下:

由于是随手拟定的策略,所以其表现中规中矩,不过整个构建的过程还挺有意思的。

在构建 POC 的过程中,我有几个有意思但不成熟的想法,拿出来供大家品评:

  1. 感觉整个交易系统其实和监控系统有异曲同工之妙。如果用监控的那套体系来构想这个系统,是不是可以有很多地方借鉴?
  2. 其实构建这个系统本身并不复杂(工作量会很大),但调试预测策略估计会很花时间。可不可以借鉴 aws sagemaker,用机器学习的方式来进行大规模调参,迭代出最优的策略?由于股票有完整的历史数据,所以可以把各种组合扔进去根据历史数据优化?从这个角度来看,Rust/C 在程序化交易系统领域,有着不可逾越的性能优势。

最后,如果你读到这里,对这个领域感兴趣,想深入做点事情;或者已经在程序化交易领域,想开拓一片新的天地,欢迎给我留言,我很乐意代为引荐。T 是个很靠谱的老板,非常重视人才,2015 年为了吸引我加入 Tubi(当时还叫 adRise),在仅跟我两面之缘的情况下,力主给我办理 O-1 签证(花不少律师费和申请费),扫清我加盟的障碍,这份恩情我至今铭记。作为 Tubi 的创始人之一,他在 Tubi 被收购后,也有不错的回报,所以有雄厚的资金为这个项目长期付出。可能唯一美中不足的是,你需要和他英文交流:可以是简单的口头交流,但至少要有书面英文交流的能力。

0 人点赞