看了下文件创建时间,2019-08-21,真是早啊哈哈哈哈哈哈。

前阵子又拾起这块东西,想在 OKEX 上进行下实验,权当培养兴趣爱好2333。

0x00 写在前面

手工交易经验

在开始量化之前,我在 OKEX 上玩了大概一年半。本金约 720USDT,操作到 1794.37USDT。

有几个体会(经验):

  • 随资金增长,再增长的效率快很多。(也可能是因为不会轻易折损本金所以心态不一样)
  • 只要肯花时间等,即使跌很多也总能涨回到原来的位置(暴跌后躺着装死,等几周就能回来,但估计这是错觉)

量化交易经验

目前策略 α 收益并不多(10USDT+/Day),主要是 β 收益:

日期 量化天数 总资产 (USDT)
2021.04.22 02:39 0 1794.37
2021.04.22 11:19 1 1749.39
2021.04.23 10:53 2 1402.96
2021.04.24 15:00 3 1775.87
2021.04.26 19:31 5 1854.68
2021.04.28 02:32 6 1907.34
2021.04.28 08:52 7 1923.11
2021.04.29 09:38 8 1984.20
2021.04.30 10:27 9 2063.68
- - -

体会(经验):

0x01 配置环境

我用的是开源的 vn.py 框架,由于很多接口只支持Win和Linux,Mac只能用 REST/WebSocket(OKEX用的是 REST) ,所以官方没有提供Mac的安装流程。根据社区的这个帖子完成了安装:Mac下安装运行vnpy2.0

在项目目录下配置 config.yamlrun_ui.py 两个文件,目录结构如下:

vnpy/
├── config.yaml
├── run_ui.py
├── vnpy/
» cat config.yaml
"API Key": "******" # 在OKEX上申请V3 API,V3不支持统一账户交易,vnpy在下个版本会对V5进行支持
"Secret Key": "******"
"Passphrase": "******"
"会话数": 3
"代理地址": "" # 由于数字货币服务器均在国外,需要挂上代理
"代理端口": ""
» cat run_ui.py
from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import MainWindow, create_qapp
from vnpy.gateway.okex import OkexGateway
from vnpy.app.algo_trading import AlgoTradingApp
import yaml

def get_okex_setting(config_path):
    with open(config_path) as f:
        return yaml.load(f, Loader=yaml.SafeLoader)

def main():
    okex_setting = get_okex_setting("config.yaml")
    qapp = create_qapp()

    event_engine = EventEngine()
    main_engine = MainEngine(event_engine)

    main_engine.add_gateway(OkexGateway)
    main_engine.add_app(AlgoTradingApp)
    main_engine.add_app(DataManagerApp)
    main_engine.connect(okex_setting, "OKEX")

    main_window = MainWindow(main_engine, event_engine)
    main_window.restore_window_setting()
    qapp.exec()

if __name__ == "__main__":
    main()

执行 python run_ui.py 即可弹出 GUI 窗口进行操作。

0x02 Naive 网格策略 @2021.04.22

我本身并不认可数字货币的价值,只是将加密货币市场视作赌场,以这种心态来看,币值只是随机波动的曲线。而使用网格策略,恰好能收割这些价格波动,以达到获利的目的。

因为对金融指标完全不了解,所以找到了网格交易策略。这是一种对新手相当友好的策略,只需要设定好几个参数就可以!vnpy文档对网格算法描述如下:

  1. 基于网格大小(价格步进)计算 目标格数目标格数 = (上界价格 - 当前价格) / 网格大小
  2. 计算 目标仓位目标仓位 = 取整后的目标格数 * 每格委托数量。注意买卖方向取整的方式是不同的:买入方向向下取整(floor);卖出方向要向上取整(ceil)
  3. 根据 目标仓位 执行操作。若目标仓位大于当前仓位,执行买入操作;若目标仓位低于当前仓位,执行卖出操作

选好币,凭感觉设定好价格上界,根据15min价格浮动设定好网格大小(计划15min一次操作,单次利率虽少但次数多),根据目测的价格下界设定好每格委托数量,就开始执行策略!

然而开始量化的第三天,遇到大跌行情,资产一度折损到 1300USDT,跌去 30%。这让我意识到网格策略的局限性:无法应对单边跌和单边涨的情况,故考虑对其进行改进。

0x03 改进的网格策略 @2021.04.24

主要考虑的是单边跌,毕竟踏空不要紧,但不能跌去本金。

单边下跌行情

考虑跌倒一定程度,对网格策略的网格大小进行扩展/伸缩。

  1. 用网格上界价格(price)初始化浮动上界(ceil),根据 扩展阈值百分比 计算出 扩展阈值扩展阈值 = 浮动上界 * (1 - 扩展阈值百分比)
  2. 根据当前价格大小关系做扩展/收缩操作:
    1. 如果当前价格低于 扩展阈值 ,进行扩展操作:网格大小 *= 扩展因子每格委托数量 *= 扩展委托数增长因子浮动上界 -= 上界价格 * 扩展阈值百分比扩展阈值 -= 上界价格 * 扩展阈值百分比
    2. 如果当前价格高于 浮动上界 ,进行收缩操作:网格大小 /= 扩展因子每格委托数量 /= 扩展委托数增长因子浮动上界 += 上界价格 * 扩展阈值百分比扩展阈值 += 上界价格 * 扩展阈值百分比
  3. 扩展/收缩操作后,再执行Naive网格策略

进行扩展操作后,通常 目标仓位 会下降,以低价卖出一部分仓位来回收资金;而进行收缩操作后,目标仓位会增加,在稍高点重新建立仓位,期望后续增长。

但这样一来,短时间内扩展、收缩来回操作会损耗大量资金。为了避免反复横跳,设置一个 冷静时间,即在扩展(收缩)操作后需要等一段时间后才允许进行收缩(扩展)操作。

单边上涨行情

为了应对单边涨行情,上调各种阈值。

  1. 当前价格高于 上界价格 (price)时,考虑上调阈值:上界价格 = 当前价格 * (1 + 扩展阈值百分比 / 2)扩展阈值 = 上界价格 * (1 - 扩展阈值百分比)浮动上界 = 上界价格
  2. 执行Naive网格策略

为了防止短时间疯涨回落,在上调前也等待一个 冷静时间

0x04 后续计划

计划参考 Stock Market Trading Strategy Research – Hire an AI to make you money! 用机器学习方法进行尝试。