Python量化策略API:掌握数字货币交易的核心技术

Posted by JEFS 加密情报站 on February 21, 2025

在数字货币交易领域,量化策略已成为获取稳定收益的重要手段。本文将深入解析Python量化策略API的核心功能和使用方法,帮助开发者快速构建高效的数字货币交易系统。

快速入门指南

策略逻辑简介

量化策略通过与行情交易柜台建立连接,发送订阅请求后,系统通过一系列回调函数向用户推送市场数据。用户可在不同回调函数中调用功能函数,实现行情获取、下单、时间回调等交易逻辑。

重要提示:策略文件应与功夫安装目录位于同一盘符下,且文件路径最好不包含空格。在运行策略前,务必确认启动的账户柜台进程(td)和行情源柜台进程(md)与策略中填写的柜台ID一致。

以下是一个基础策略示例:

import kungfu.yijinjing.time as kft
from kungfu.wingchun.constants import *
from pykungfu import wingchun as wc

source = "okx"
account = "test"
tickers = ["BTC-USDT", "LTC-USDT"] # 现货
tickers_COINF = ["BTC-USD-240628"] # 币本位-USD-
tickers_UF = ["LTC-USDT-SWAP"] # U本位-USDT-

EXCHANGE_SPOT = Exchange.OKX_SPOT
EXCHANGE_UF = Exchange.OKX_USD_FUTURE
EXCHANGE_CoinF = Exchange.OKX_COIN_FUTURE

def pre_start(context):
    context.log.info("pre_start {}".format(context.now()))
    context.add_account(source, account)
    context.subscribe(source, tickers, EXCHANGE_SPOT)
    context.subscribe(source, tickers_UF, EXCHANGE_UF)
    context.subscribe(source, tickers_COINF, EXCHANGE_CoinF)

def post_start(context):
    context.log.info("post_start {}".format(context.now()))

def on_quote(context, quote, location, dest):
    context.log.info('[on_quote] {}'.format(quote))
    order_id = context.insert_order(quote.instrument_id, EXCHANGE_SPOT, source, account, 
                                  quote.last_price, 1, PriceType.Limit, Side.Buy, Offset.Open)
    context.log.info("ticker insert order instrument_id: {},order_id: {}".format(quote.instrument_id, order_id))

核心功能函数详解

基础回调方法

pre_start 启动前回调

在策略启动前调用,用于完成添加交易账户、订阅行情、策略初始化计算等准备工作。

参数

  • context: Python对象,策略的全局变量

示例

def pre_start(context):
    context.add_account(source, account)
    context.subscribe(source, tickers, exchange)

post_start 启动后回调

策略连接上行情交易柜台后调用,此函数回调后,策略可以执行添加时间回调、获取策略持仓、报单等操作。

参数

  • context: Python对象,策略的全局变量

on_quote 行情回调

收到快照行情时自动触发,行情信息通过quote对象获取。

参数

  • context: 策略全局变量
  • quote: Quote对象,包含行情数据
  • location: Location对象,数据来源进程信息
  • dest: int类型,与location配合确定数据存储位置

交易执行函数

context.insert_order 报单函数

用于下达交易订单,支持多种订单类型和参数配置。

参数

  • instrument_id: 合约ID
  • exchange_id: 交易所ID
  • source_id: 柜台ID
  • account_id: 交易账号
  • limit_price: 价格
  • volume: 数量
  • priceType: 报单类型
  • side: 买卖方向
  • offset: 开平方向

返回:订单ID

示例

order_id = context.insert_order("BTC-USDT", Exchange.OKX_SPOT, "okx", "acc_1", 
                               price, 1, PriceType.Limit, Side.Buy, Offset.Open)

👉 查看实时交易工具

context.cancel_order 撤单函数

用于撤销已下的订单。

参数

  • order_id: 订单ID

返回:订单操作ID

投资组合管理

策略持仓维护

功夫系统支持四种不同的持仓维护模式,根据context.hold_book()context.hold_positions()方法的调用情况决定:

  • 默认模式:只维护当前订阅的标的,持仓数据从柜台同步
  • 保持账本模式:维护历史交易过的所有标的
  • 保持持仓模式:使用本地存储的历史持仓记录
  • 完全保持模式:同时保持账本和持仓记录

资金与持仓信息获取

通过context.book获取策略投资组合信息,包括资金情况、持仓列表、委托信息等:

def post_start(context):
    book = context.book
    context.log.warning("[strategy capital] (avail){} (margin){}".format(book.asset.avail, book.asset.margin))
    
    # 获取账户持仓信息
    account_book = context.get_account_book(source, account)
    long_positions = account_book.long_positions
    for key in long_positions:
        pos = long_positions[key]
        context.log.info("多头持仓: {}(数量){}(昨仓){}".format(
            pos.instrument_id, pos.volume, pos.yesterday_volume))

常见问题

策略开发基础

Q: 如何开始编写第一个量化策略? A: 首先需要导入必要的模块,定义交易账户和标的,然后在pre_start中添加账户和订阅行情,在on_quote等回调函数中实现交易逻辑。

Q: 策略运行前需要注意哪些事项? A: 确保策略文件与安装目录在同一盘符下,路径不含空格,并确认启动的柜台进程与策略中设置的ID一致。

交易执行相关

Q: 如何正确下单和撤单? A: 使用context.insert_order函数下单,返回order_id,需要撤单时使用context.cancel_order(order_id)。建议在收到订单回报后再进行撤单操作。

Q: 如何处理不同的数字货币合约类型? A: 数字货币有现货、U本位合约、币本位合约等类型,需要正确设置exchange_id参数:OKX_SPOT(现货)、OKX_USD_FUTURE(U本位)、OKX_COIN_FUTURE(币本位)。

数据与风控

Q: 如何获取账户资金和持仓信息? A: 通过context.get_account_book(source, account)获取指定账户的投资组合信息,包括资金情况、持仓列表等。

Q: 如何监控策略性能? A: 系统会自动维护策略收益和持仓记录,可以通过context.book获取策略投资组合信息,实时监控策略表现。

👉 获取进阶交易策略

高级功能应用

时间回调机制

功夫系统提供了灵活的时间回调功能,可以在指定时间点执行特定操作:

# 单次定时回调
context.add_timer(context.now() + 10*1000000000, lambda ctx, event: callback_function(ctx))

# 间隔定时回调
timer_id = context.add_time_interval(60*1000000000, lambda ctx, event: periodic_task(ctx))

# 取消定时器
context.clear_timer(timer_id)

静态数据获取

通过context.static_data可以获取标的的基本信息、费率信息等静态数据:

static_data = context.static_data
instruments = static_data.instruments
for key in instruments:
    instrument = instruments[key]
    context.log.info("标的: {}, 交易所: {}".format(instrument.instrument_id, instrument.exchange_id))

最佳实践建议

  1. 风控优先:在实盘前充分回测,设置合理的止损止盈机制
  2. 日志完善:合理使用context.log记录关键操作和异常情况
  3. 异常处理:妥善处理网络中断、柜台连接异常等情况
  4. 性能优化:避免在回调函数中执行复杂计算,保持策略响应速度

通过掌握这些核心API功能,开发者能够构建出高效、稳定的数字货币量化交易策略,在波动的市场中获取稳定收益。