手把手教你用 nodejs 打造完整的量化交易系统 – 序章

手把手教你用 nodejs 打造完整的量化交易系统 – 序章

本系列文章作为量化交易入门的基础教程,会涉及到一个完整的系统所包含的各个方面,适合对量化有一定兴趣,但对量化交易系统不太了解的程序员。

文章内涉及的代码均会同步至github,欢迎 star 围观,谢谢。地址:GitHub – yisbug/node-quant

什么是量化交易?

基于电脑程序分析数据制定策略的全自动或半自动的交易系统。

为什么要做量化交易?

实现一套完整的全自动化交易系统,且能稳定盈利。相信这是无数向往量化交易的程序员美好愿望。

简单说就是实现了一台 24 小时不停歇的赚钱机器,想想,做梦都会很开心。

量化交易和主观交易相比较,确实存在较多优势。比如完全由数据模型驱动进行交易,可以基于大量数据分析来交叉验证猜想/结论提高胜率,执行力 100% 不受人性影响,可以做到传统主观交易无法做到的策略,比如高频之类。

尽管量化的优势明显,不可否认的是,顶级的主观交易者的收益在许多情况下还是强于量化策略的,但采用量化策略的基金越来越多也是事实。

由于市场机制以及发展历史的不同,国内外量化交易领域的发展区别也较大。目前国内量化基金的占比还不太高,但整体趋势上来看,还是在逐步提升。

而我们做量化交易的目的并非单纯追求最大的利润(无法超过顶尖的主观交易者),而是解放人力,避免人性主观犯错,分散风险,优化仓位管理,自动化的实现相对比较稳定的盈利。

系统如何实现,难度如何?

一个量化策略的开发至少包括以下几个流程:数据获取及处理、策略开发、策略回测、策略优化、系统优化。

而一个模块化的交易系统能够包含但不限于以下子系统:

数据处理子系统:数据获取、预处理、存储策略管理子系统:因子管理、策略管理、规律统计、策略组合交易决策子系统:股票池、信号系统、风险管理、仓位管理、指标计算、账户及成本管理执行子系统:模拟撮合、实盘交易、日志监控

如果是一个有经验的程序员,应该能够认知到这是一个非常复杂的系统,并非一朝一日就能够顺利完成的。

就算成功打造出来,能否盈利也是一个复杂的问题,需要大量的时间调优和验证。需知很多人的主观交易都无法持续稳定盈利,而量化交易本质上只是从技术上实现你的交易思路,如果思路有问题,那么量化交易实现盈利更是难上加难。

但是也不要太灰心,如果你是有一定编程能力的程序员,不要期初就规划着实现一套完整系统。最初的目标可以设置的更小一些,例如从自己较熟悉的交易思路上入手,先开发一些工具/模块用来辅助交易,随着时间的推移,再逐步完善系统。

随着系统的完善,我们拥有了更多的工具来快速交叉验证交易思路正确与否,盈利水平如何,进而帮助我们优化交易思路,提高交易水平。

为什么是 nodejs?

目前量化交易开发领域,主流的语言还是 python、c++这些,主流的开源工具库比如 PyCTP、vnpy 等都是基于 python 开发,而高频领域对性能和延迟极度敏感所以基本是 c++ 一统天下。

但作为一名爱好量化交易的前端工程师,使用 nodejs 似乎并不需要太多解释。作为量化领域的小白,本着学习的精神,使用 nodejs 再造一个轮子也不是不可接受的事情。

其次,nodejs 单线程、基于事件驱动、异步 IO 的模式再配合 mongodb ,相对来说也比较适合交易系统这种大数据、多事件驱动的场景。

开始第一步 – 数据源选择

OK,接下来就进入正题,开始搭建环境进入编码。

接下来的内容,行文之前假定阅读者已经有一定的投资经验,后续应该会很少单独介绍关于量化交易以及股票、期权等投资相关的基础知识,如有需要可自行查询相关资料。对于稍微复杂的概念,文内也会视情况稍作解释。

开发一套交易系统的第一步就是选取数据源,由于个人原因主要在港股市场操作,所以数据源这里选用了 富途牛牛-港股|美股|A股交易,股票实时行情,炒股资讯,后续也将以富途的数据源为示例讲解接下来的内容。当然,你也可以根据自己实际情况选择其他数据源,原理上都是一样的。

富途牛牛创始人出自腾讯,客户端产品体验非常棒,是个人认为做的最好的交易客户端,其开放的 OpenAPI 也比较完善稳定,如果有什么问题,技术响应也很及时。

富途 OpenAPI 官方只提供了 python 和 c++版本的 sdk,本人基于 FutuOpend 的网关协议开发了 nodejs 版本的 sdk,可以直接使用。

nodejs sdk 地址:GitHub – yisbug/nodejs-for-FutuOpenD: FutuQuant量化接口Nodejs版本

环境搭建

安装 nodejs 版本工具

这里可以选择 nvs 或者 nvm,都支持跨平台。

nvs:基于 nodejs 开发,github 地址:GitHub – jasongin/nvs: Node Version Switcher – A cross-platform tool for switching between versions and forks of Node.js 安装 nvs:
# windows choco install nvs # mac 或 linux export NVS_HOME=”$HOME/.nvs” git clone https://github.com/jasongin/nvs “$NVS_HOME” . “$NVS_HOME/nvs.sh” install
nvm:基于 shell 开发,github 地址:GitHub – nvm-sh/nvm: Node Version Manager – Simple bash script to manage multiple active node.js versions 安装 nvm:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash

安装 nodejs

安装 nodejs 版本工具完毕后,以 nvs 为例,安装 nodejs:

nvs add latest nvs link lts node -v # 看一下 node 版本,看到版本就说明安装成功了

安装 FutuOpenD

下载地址:富途开放接口-港股|美股|A股交易,股票实时行情,炒股资讯

下载后按提示安装并登陆即可,我们的策略运行期间必须一直打开这个客户端。

这个是富途的网关客户端程序,所有的行情数据包括下单等操作都是通过这个客户端直连到富途的服务器。

数据流程大概如下:我们的交易客户端 -> FutuOpenD -> 富途服务器 -> 交易所

获取第一个股票报价

首先创建一个新项目

mkdir node-quant cd node-quant npm init -y npm i futuquant –save

添加 .gitignore 文件,设置忽略 ignore 目录,添加 ignore/config.js 文件,作为 futu 的参数配置:

// ignore/config.js module.exports = { ip: 127.0.0.1, port: 11111, userID: 0, // 请填写你自己的牛牛号 market: 1, // 港股环境 pwdMd5: , // 交易密码 md5 env: 1, // 0为仿真,1为真实,默认为1。 };
请注意保管好自己的交易账号密码。

先打开 API 文档,地址:FutuQuant-Nodejs Class: FutuQuant,查阅一下相关的 API。

创建一个 index.js,获取第一支股票的报价:

const FutuQuant = require(futuquant); const config = require(./ignore/config); const ft = new FutuQuant(config); const init = async () => { await ft.init(); const security = { code: 00700, market: 1 }; // 每支股票订阅一个类型占用一个额度。 // 订阅额度上限与用户等级相关,一级: 1000, 二级: 300 , 三级: 100 // 先订阅基础报价,才能获取基础行情 await ft.qotSub({ securityList: [security], subTypeList: [1] // 基础报价 }); const [basicQot] = await ft.qotGetBasicQot([security]); console.log(00700基本行情, basicQot); console.log(00700当前价格, basicQot.curPrice); }; init();

OK,第一步就已经完成了,我们已经掌握了如何订阅报价数据以及获取一只股票的当前价格。

下一篇文章将介绍完善数据获取模块,以及进入策略开发阶段——开发第一个均线信号系统。

本系列文章涉及的代码均会同步至github,欢迎 star/fork,谢谢。地址:GitHub – yisbug/node-quant

如果本文能给您带来一些价值,欢迎点赞、关注,谢谢。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Proudly powered by WordPress | Theme: HoneyWaves by SpiceThemes