看了下文件创建时间,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 |
- | - | - |
体会(经验):
- 永远要控制仓位,以防大跌情况(04.23 这天遇到拜登提高资本利得税的黑天鹅事件,直接跌去30%)
0x01 配置环境
我用的是开源的 vn.py
框架,由于很多接口只支持Win和Linux,Mac只能用 REST/WebSocket
(OKEX用的是 REST
) ,所以官方没有提供Mac的安装流程。根据社区的这个帖子完成了安装:Mac下安装运行vnpy2.0
在项目目录下配置 config.yaml
和 run_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文档对网格算法描述如下:
- 基于
网格大小
(价格步进)计算目标格数
,目标格数 = (上界价格 - 当前价格) / 网格大小
- 计算
目标仓位
,目标仓位 = 取整后的目标格数 * 每格委托数量
。注意买卖方向取整的方式是不同的:买入方向向下取整(floor);卖出方向要向上取整(ceil) - 根据
目标仓位
执行操作。若目标仓位大于当前仓位,执行买入操作;若目标仓位低于当前仓位,执行卖出操作
选好币,凭感觉设定好价格上界,根据15min价格浮动设定好网格大小(计划15min一次操作,单次利率虽少但次数多),根据目测的价格下界设定好每格委托数量,就开始执行策略!
然而开始量化的第三天,遇到大跌行情,资产一度折损到 1300USDT,跌去 30%。这让我意识到网格策略的局限性:无法应对单边跌和单边涨的情况,故考虑对其进行改进。
0x03 改进的网格策略 @2021.04.24
主要考虑的是单边跌,毕竟踏空不要紧,但不能跌去本金。
单边下跌行情
考虑跌倒一定程度,对网格策略的网格大小进行扩展/伸缩。
- 用网格
上界价格
(price)初始化浮动上界
(ceil),根据扩展阈值百分比
计算出扩展阈值
,扩展阈值 = 浮动上界 * (1 - 扩展阈值百分比)
- 根据当前价格大小关系做扩展/收缩操作:
- 如果当前价格低于
扩展阈值
,进行扩展操作:网格大小 *= 扩展因子
,每格委托数量 *= 扩展委托数增长因子
,浮动上界 -= 上界价格 * 扩展阈值百分比
,扩展阈值 -= 上界价格 * 扩展阈值百分比
- 如果当前价格高于
浮动上界
,进行收缩操作:网格大小 /= 扩展因子
,每格委托数量 /= 扩展委托数增长因子
,浮动上界 += 上界价格 * 扩展阈值百分比
,扩展阈值 += 上界价格 * 扩展阈值百分比
- 如果当前价格低于
- 扩展/收缩操作后,再执行Naive网格策略
进行扩展操作后,通常 目标仓位
会下降,以低价卖出一部分仓位来回收资金;而进行收缩操作后,目标仓位
会增加,在稍高点重新建立仓位,期望后续增长。
但这样一来,短时间内扩展、收缩来回操作会损耗大量资金。为了避免反复横跳,设置一个 冷静时间
,即在扩展(收缩)操作后需要等一段时间后才允许进行收缩(扩展)操作。
单边上涨行情
为了应对单边涨行情,上调各种阈值。
- 当前价格高于
上界价格
(price)时,考虑上调阈值:上界价格 = 当前价格 * (1 + 扩展阈值百分比 / 2)
,扩展阈值 = 上界价格 * (1 - 扩展阈值百分比)
,浮动上界 = 上界价格
- 执行Naive网格策略
为了防止短时间疯涨回落,在上调前也等待一个 冷静时间
。
0x04 后续计划
计划参考 Stock Market Trading Strategy Research – Hire an AI to make you money! 用机器学习方法进行尝试。