
什么是 REST API?
今天的内容是针对新手的,涉及到技术层面,即 API 和自动交易。程式交易除了回测(backtesting)之外,另一个非常重要的领域就是自动交易。在技术层面上实现自动交易,就需要运用到 API 这一技术。如果你之前没有听说过或者没有尝试过使用 API 进行自动交易,那么这段视频非常适合你。
在之前的一段视频中,我们提到过 API 是用来连接你自己的程序和你的交易账户的,用于执行开仓、平仓、止盈、止损、获取数据等一系列操作。不过,这个描述只是一个概念。要理解 API 是什么,就需要先明白我们平时使用电脑进行交易的实际运作原理。
平时我们所说的“手动”交易,意思是我们用手指通过鼠标和键盘,在证券行提供的交易软件上输入交易指令。发出指令后,这一组指令会通过网络发送到证券行的服务器,再由证券行的服务器发送到交易所的服务器。交易所处理后会将数据返回给证券行服务器,最后数据再返回到你的电脑上显示出来。这就是我们平时所说的“手动”交易的整个流程。指令和数据其实都会在网络上经过一个大循环,最后再返回到自己的电脑上。
举个例子,你在家里用富途牛牛的桌面软件,输入一个买入指令,买入 1000 股腾讯。这个指令到达富途服务器后,服务器会对你的指令进行一系列检查,例如你的账户是否有足够的资金、股票是否活跃、港股是否开盘、你输入的价格是否有误等。如果这些检查有问题,指令当然就不会被执行。如果没有问题,富途就会将这个指令发送到港交所服务器。如果交易成功,港交所服务器会将确认数据发送回富途,富途再将确认信息发送回给你。
由此可见,在整个交易结构中,证券行是交易所的参与者。从技术层面来看,向交易所下单的并不是你本人,而是证券行。所以证券行就是所谓的市场中介人角色。不过,普通散户通常不太关心这些,因为整个流程都非常快,刚才提到的所有检查、下单、返回确认等流程,都在瞬间完成。所以最后我们很快就在软件上看到自己的账户交易状态更新了,交易完成了,一眨眼就搞定了。
对于“手动”交易来说,刚才提到的“自己的电脑”,其实就是利用富途提供的软件来处理一系列显示内容、发出指令、更改指令等所有操作。之所以可以用鼠标和键盘简单地操作,是因为这个软件是证券行自己开发的,所以所有功能都早已准备好,让你可以通过鼠标和键盘操作。而由于整个流程的重点是与证券行的服务器沟通,如果我们想进行自动交易,我们可以自己编写程序,将一些可以自动化的流程交给自己的程序去执行。而自己的程序要与证券行服务器沟通,就需要使用证券行服务器指定的沟通方式,这个沟通方式就是 API。全名是 Application Programming Interface。只要你编写的程序能够让证券行服务器听得懂、叫得动,就可以不需要使用鼠标和键盘,一样可以让证券行帮你进行交易。所以 API 就是一个沟通的规范,是由各个证券行自己制定的。
举个实际例子,画面上上下两段代码都是同样的动作,都是用 210 港元买入 1000 股腾讯股票。上面是富途 API 的写法,下面是 IB API 的写法。注意上下两段代码都是用 Python 写的,但 API 的写法完全不同。例如股票代码在富途 API 中会用 00700.HK,但在 IB API 中就直接用 700。又例如 IB API 会规定每个交易指令都是一个 object,但富途 API 就不需要。这些区别其实是因为两家不同的证券行,它们各自的 IT 开发团队都是独立运作的,所以大家的系统设计可以完全不同,写法不同、规则不同,所以 API 的用法也不同。
为什么存在 API?
因为大部分交易所都不会让普通散户直接连接,而是要经过证券行发出指令。指令需要经过重重检查后才会到达交易所。所以要实现自动交易,就需要自己编写程序,无论你使用什么编程语言,只要证券行的 API 接受就可以。
API 的功能取决于证券行本身提供的功能。
如果证券行本身没有某个功能,API 就一定没有。例如富途还没有开通购买日本股票的功能,那么它的 API 就肯定没有购买日本股票的功能。另一方面,即使证券行本身有这个功能,但它的 API 未必开放。例如富途的桌面软件可以看到股票的财务报表数据,但它的 API 并没有提供这些数据。这一点需要注意。
由于每家证券行的 API 都不同,要开始自动交易,最重要的是查看每家证券行自己编写的 API 文档。
即 API 的说明书,每个 API 都有。这样你才能明白证券行的开发人员希望你如何与他们的服务器进行沟通,从而实现自动交易。
对于香港散户来说,通过证券行 API 进行自动交易,大部分都使用 Interactive Brokers(IB)或者富途。这两家本身就很受欢迎。
Interactive Brokers(IB)
IB 其实早在十几年前就已经开放了 API,是零售程式交易证券行的先行者。十几年前 IB API 只支持 C++、Java、Visual Basic 等比较旧和复杂的语言。直到四五年前才开始有官方的 Python API。由于 Interactive Brokers 本身功能强大、支持的产品种类繁多,所以它的 API 结构也相对复杂得多,新手其实不太容易上手。
富途
相比之下,富途是比较新的证券行,IT 系统也是全新的。从头建立新系统比修改旧系统容易。而且富途本身支持的功能和产品种类比 IB 少,所以富途 API 使用起来比 IB API 更容易、更简洁,已经支持了大部分散户会用到的功能。对于用户来说,最好的情况是证券行之间有竞争,有竞争才有进步。
顺便提一下,主流的加密货币交易所(如 Binance 等)也有自己的 API。不过,加密货币世界有一个叫做 ccxt 的库,可以支持大量不同的加密货币交易所。这与传统金融市场的状况有所不同。
由于每家证券行的 API 都不同,使用之前就需要查看它们自己的 API 文档。我们快速浏览一下这些证券行的 API 文档。
IB API 文档
这份 API 文档简直是我初学时的噩梦,因为内容写得非常晦涩难懂,完全不是给初学者看的。我甚至怀疑写这份 API 文档的人是否有语言障碍。我花了很长时间才弄清楚它的结构,现在回想起来我也不明白我最后是怎么看懂的。反正用了很长时间。
富途 API 文档
富途的 API 叫做 Futu Open API。如果满分是 100 分,IB API 文档可能只有 10 分,富途那份至少有 90 分。至少看得懂。我们来看看,它每个指令都像字典一样,有分类和定义,还有实际例子。这些例子可以直接复制粘贴到 PyCharm 中,立即看到结果。这些说明书才是给人看的,IB 那份都不知道在搞什么。
加密货币领域的 API
不得不提 ccxt 这个库。由于加密货币世界理论上没有证券行这个角色,FTX、Bybit、Binance 等都是交易所。这些交易所各自有自己的 API,而 ccxt 的目标是建立一个跨交易所的 API 库,方便任何人使用,而且是开源的,免费的。目前它已经支持了上百个交易所。去它的 GitHub 你会看到,它的交易所列表一直在更新。在某种程度上,它确实起到了跨交易所 API 库的作用,可以说是做加密货币的朋友一定要知道的。
由于 API 涉及到很多技术层面,为了避免吓跑新手,我们简单讲一下重点。API 可以再细分为几种,分别是 REST API、WebSocket 和 FIX。FIX 不是一般散户使用的,而是银行、对冲基金等机构投资者才会使用,技术要求很高。你可能会在 IB、SAXO 等证券行的 API 文档中看到它们支持 FIX,但与你无关,直接跳过它。
REST API
就像平时大家浏览网站一样,你点击一个按钮,对方的服务器就会返回你想看的内容。这是一种“踢一脚动一下”的访问模式。大部分证券行的 API 都通过 REST API 提供历史数据、账户数据等。这种模式虽然效率不高,但相对容易处理。
WebSocket
专门用于传送实时数据。例如你的程序需要每分每秒获取最新的市价,你不可能事先知道下一单成交是什么时候发生的,也不可能在每一单成交的那一刻立即去请求一次。所以你需要用“订阅”的方式,向 API 提出你要监视这只股票,一旦有成交就立即将最新的价格推送给你。这种做法就是 WebSocket。
可想而知,实时数据的处理方法与历史数据有很大区别。而两种 API 都需要掌握,缺一不可。
要做自动交易,通过 API 发号施令只是其中一环。你需要设计的自动交易程序至少要有以下几种元素:
Account Info Update
通过 API 获取你的账户信息,判断自己有多少购买力,或者手上持有多少股票。
Strategies Management 和 Data Management
两者相辅相成,根据历史数据和实时数据判断是否需要执行开仓、平仓、止盈、止损等操作。特别是止盈止损,你一定要有最新的价格,才能知道自己赚了多少、亏了多少,从而决定是否执行交易动作。
Order Management、Logging & Messaging System
主要通过 API 发出实际交易指令,并记录、传送所有操作。
这几组系统需要同时运作,系统之间要传递最新的数据。所以设计自动交易系统是一项大工程,也是所有新手程式交易者需要攻克的一个大难题。
最难的地方是,证券行的 API 文档不会从架构层面教你,它们都假设读者已经是软件工程师,需要你自己去思考。怎么思考呢?还是那句话,有价值的技术是不会轻易分享的。有机会我们再详细讲解。
如果你已经了解了以上内容,接下来的步骤大致如下:
先开模拟交易账户
用模拟账户测试 API 功能。IB 和富途都有模拟账户,大多数功能与真实账户相同,这样就不需要每次都用真钱来测试。
测试必用功能
测试时最重要的是测试一些必用的功能,例如获取自己账户的资料、获取实时数据、下单、改单等。等测试到一定程度,你就会明白数据流是怎么样的。
建立系统原型
有了系统原型后,就拿去进行前向测试(forward run)一段时间。用电脑或 VPS,直接用 PyCharm、Visual Studio 等 IDE 运行一段时间。如果有任何 bug,可以在前向测试时发现,慢慢调试,有耐心,改到看不到 bug 为止。
用少量真钱测试
最后用少量真钱测试一下,就像学骑自行车一样,慢慢就会跑得顺了。
原文引自YouTube视频:https://www.youtube.com/watch?v=xyQdvODcVSk