功夫 V2.x.x API文档

快速上手

版本更新说明

2.3.9

  • [wingchun] 全市场订阅增加市场参数
  • [柜台] ctp 同步保证金
  • [柜台] 增加底层对两融业务的支持, 目前只支持顶点 api
  • [master] 对底层实时存储同步做了优化,增加了稳定性
  • [bar] 修正了原先 bar 的 bug
  • [strategy] 修正了不同账户使用同一个账户造成的计算错误与 crash 的问题
  • [strategy] 更改 add_timer 机制,当策略内 timer 任务出错,会 crash 进程

2.3.8

  • [app] 修正了持仓自动订阅逻辑
  • [app] 优化了 addon 部分,app 性能不会受策略行情订阅影响
  • [yijinjing] 将写 sqlite 操作拆分为原子操作,不会造成主控进程堵塞

2.3.7

  • [app] 增加渲染进程断开的重开处理,保证交易稳定性
  • [app] 增加了渲染进程的错误拦截机制
  • [app] 修正了 ui bugs, 优化了ui部分退出流程
  • [cli] 增加了 cli 手续费设置
  • [cli] 修正了 cli monit bugs
  • [柜台] ctp 增加请求对应经纪商保证金比例
  • [柜台] sim 修正不显示空单持仓

2.3.6

  • [app] 优化数据传输,提升交互性能
  • [app] 行情模块与账户模块合并
  • [app] 增加档位下单,优化添加标的以及下单体验
  • [app] 修正前端bugs
  • [cli] cli 增加导出全部
  • [cli] 修正cli机制,不再获取当前session之前的数据,避免了多条cli进程造成 database is locked 的问题
  • [柜台] 修正ctp, 以及部分柜台bugs
  • [柜台] 修正了最大启动次数的bug

2.3.5

  • [app] 增加数据通信进程,减小app渲染计算压力
  • [app] 委托成交记录导出增加了精确时间字段
  • [app] 解决了成交记录历史查看/下载相关bug(在全新账户没有持仓时会出现)
  • [app] 自动删除journal,保证正常启动(脏数据不影响启动)
  • [app] 启动后立刻关闭策略的会判断底层是否ready,解决关闭策略导致黑屏的问题
  • [app] 修复了策略手动下单会跟策略内下单重复使用orderid的问题
  • [app]优化了成交记录排序以及展示
  • [app] 修复了模拟柜台sim下单成交offset和side的问题
  • [app] 增加在日志窗口 ctrl+f 查找
  • [app] 增加了导出全部交易数据功能
  • [柜台] 升级了kungfu依赖python版本3.7.5 -> 3.7.9
  • [柜台] 修复ctp 请求持仓短时间重复发起的问题
  • [柜台] ctp 成交回报拦截非正常报价
  • [柜台] ctp 柜台添加log,全面覆盖空指针检测
  • [wingchun] 修复股票对成交数据中price的过滤,如果price <= 0, 则不加入整体计算流

2.3.4

  • 新增行情模块
  • 新增策略追踪功能
  • 优化启停任务体验,增加td/md进程断开自动重启
  • 增加清理journal功能
  • 解决底层bug

2.3.3

  • 优化手动下单联想输入

2.3.2

  • 新增交易任务模块(pro)
  • 解决bug

2.3.1

  • 解决底层bug

2.3.0

  • 增加了对过去数据的归档功能
  • 对手动下单功能进行优化
  • 增加标的维度信息查看
  • 解决底层bug

2.2.8

  • md/td列表,表头,连接 → 进程
  • pos列表双击打开下单面板 → 单击打开
  • 当为股票账户时,下单界面新增 “总金额” 以及按数量/按金额选择
  • 当选择“按金额”时,输入“总金额”,在右侧会显示 “下单手数” = Math.floor(totalPrice / limit_price)
  • 仅当 股票-限价,会有以上选择,期货跟市价单跟之前一致
  • 下单界面新增“套保投机”
  • 期货联想ticker 新增套利组合

2.2.7

  • 将之前“开启全部”更换为“保持开启”
  • 点击保持开启按钮后,会每隔2s运行一次如下逻辑:
  • 将当前未启动的进程启动,启动间隔为1s,都运行结束后,隔2s再运行下一个逻辑loop
  • 修复了下单窗口打开过慢的问题
  • 修复了策略编辑窗口打开过慢的问题
  • 保持开启更换为开启全部
  • 每次点击开启全部后,会尝试四次
  • 全部开启后,开启全部按钮变为关闭全部

2.2.6

  • 增加启动全部td/md,中间间隔1s

2.2.5

  • Td/md增加一键开启
  • 调仓不再需要二次确认
  • 确认下单不会受frozen持仓影响,应直接报错
  • 对于orderList,双击撤单,单击调仓,右键看order信息
  • 打开下单窗口过慢的问题

2.2.4

  • 手动下单面板
  • 总:股票期货,下单输入项包括:ticker,side,offset,市价/限价(默认),限定价格,按数量/金额(买入默认按金额,卖出默认按数量)
  • 直接下单
  • ticker输入带联想,根据账户券商/期货公司识别大小写ticker
  • 从position列表进入下单
  • 识别当前pos的ticker,价格(市价/成交价?),side(相反),offset,数量/金额

2.2.3

  • bug修复

2.2.2

  • bug修复

2.2.1

  • 支持查看历史委托及成交
  • 支持查看委托详情
  • 支持调整页面布局

2.2.0

  • 优化前后端通信方式
  • 添加实时延迟统计功能
  • 支持极速模式运行
  • 调整账目持仓统计方式
  • 添加文本操作界面(TUI)功能 kungfu-cli

2.1.0

  • 添加策略获取账户持仓接口
  • 区分股票与期货持仓数据结构
  • 添加bar订阅与回调

2.0.0

  • 跨平台支持
  • 支持 Python 3
  • 提供基于 Electron 的图形化操作界面

1.0.0

  • 以 Docker/rpm 方式运行的最后稳定版本

0.0.5

  • 增加对股票交易柜台 xtp 的支持
  • 在系统 docker 中增加了 numa(xtp 的依赖),不希望更新 docker 的用户可以通过 yum install numactl 来手动安装

0.0.4

  • 增加 FeeHandler 模块,增加策略中的 Pnl 实时计算支持

0.0.3

  • 增强 wingchun report 中的延迟统计工具,新增调用API前的系统内耗时 (TTT before API)

0.0.2

  • 修正了 PosHandler 的一个 update 情况的潜在风险
  • 修正没有 close 的 file 句柄
  • 修正了 memcpy 的潜在越界问题
  • 编译选项优化为 O3

1.0.0

  • 初始化版本

策略接口调整对照表

功能描述 2.1 2.2
可用资金 Book.avail Book.asset.avail
保证金 Book.margin Book.asset.margin
市值 Book.market_value Book.asset.market_value
初始权益 Book.initial_equity Book.asset.initial_equity
动态权益 Book.dynamic_equity Book.asset.dynamic_equity
静态权益 Book.static_equity Book.asset.static_equity
已实现盈亏 Book.realized_pnl Book.asset.realized_pnl
未实现盈亏 Book.unrealized_pnl Book.asset.unrealized_pnl
2.1持仓列表/2.2多头持仓列表 Book.positions Book.long_positions
2.1持仓列表/2.2空头持仓列表 Book.positions Book.short_positions
获取持仓明细 Book.get_position(instrument_id,
exchange_id,direction)
Book.get_position(direction,
exchange_id,instrument_id)
自动订阅历史上持有过合约 context.hold_book()
使用策略持仓,默认不调用使用账户持仓 context.hold_positions()

策略逻辑简介

功夫系统上的策略在策略连接行情交易柜台,发送订阅请求以后,通过以下回调函数给用户发送消息,用户在不同的回调函数中调用功能函数实现获取行情,下单,时间回调等逻辑。详细数据定义和接口函数定义可查看后文,以下为一个策略示例

注意 : 策略应和功夫安装目录在一个盘符下面,策略文件路径最好不要有空格


# -*- coding: UTF-8 -*-
import kungfu.yijinjing.time as kft
from kungfu.wingchun.constants import *

# 期货
# SOURCE = "ctp"
# ACCOUNT = "089270"
# tickers = ["rb2001","rb2003"]
# VOLUME = 2
# EXCHANGE = Exchange.SHFE

#股票
SOURCE = "xtp"
ACCOUNT = "15040910"
tickers = ["600000","600001"]
VOLUME = 200
EXCHANGE = Exchange.SSE

# 启动前回调,添加交易账户,订阅行情,策略初始化计算等
def pre_start(context):
    context.add_account(SOURCE, ACCOUNT, 100000.0)
    context.subscribe(SOURCE, tickers, EXCHANGE)
    # context.subscribe("bar", tickers, EXCHANGE)
	# context.subscribe_all(SOURCE)
    context.ordered = False


# 启动准备工作完成后回调,策略只能在本函数回调以后才能进行获取持仓和报单
def post_start(context):
    context.log.warning("post_start")
    log_book(context,None)
	# context.req_history_order(ACCOUNT)
	# context.req_history_trade(ACCOUNT)

# 收到快照行情时回调,行情信息通过quote对象获取
def on_quote(context, quote):
    # context.log.info("[on_quote] {}".format(quote))
    if quote.instrument_id in tickers:
        # 如果没有报单则报单
        if not context.ordered:
            order_id = context.insert_order(quote.instrument_id, EXCHANGE, ACCOUNT, quote.last_price, VOLUME, PriceType.Limit, Side.Buy, Offset.Open)
            # order_id = context.insert_order(quote.instrument_id, EXCHANGE, ACCOUNT, quote.last_price, VOLUME, PriceType.Any, Side.Buy, Offset.Open)#上期所不支持市价单
            if order_id > 0:
                context.ordered = True
                context.log.info("[order] (rid){} (ticker){}".format(order_id, quote.instrument_id))
                # 通过添加时间回调,在三秒以后撤单
                context.add_timer(context.now() + 3 * 1000000000, lambda ctx, event: cancel_order(ctx, order_id))


# 收到k线行情时回调,行情信息通过bar对象获取
def on_bar(context, bar):
    context.log.warning("[on_bar] {}".format(bar))


# 收到订单状态回报时回调
def on_order(context, order):
    context.log.info("[on_order] {}".format(order))


# 收到成交信息回报时回调
def on_trade(context, trade):
    context.log.info("[on_trade] {}".format(trade))


# 策略释放资源前回调,仍然可以获取持仓和报单
def pre_stop(context):
    context.log.info("[befor strategy stop]")


# 策略释放资源后回调
def post_stop(context):
    context.log.info("[befor process stop]")


## 自定义函数
# 自定义持仓和资金日志输出函数
def log_book(context, event):
    context.log.warning("[avail]{}".format(context.book.asset.avail))
    context.log.warning("[acc_avail]{}".format(context.get_account_book(SOURCE, ACCOUNT).asset.avail))
    book = context.book
    asset = book.asset
    context.log.warning(
        "[strategy capital] (avail){} (margin){} (market_value){} (initial_equity){} (dynamic_equity){} (static_equity){} (realized_pnl){} (unrealized_pnl){}".format(
            asset.avail, asset.margin, asset.market_value, asset.initial_equity,
            asset.dynamic_equity, asset.static_equity, asset.realized_pnl, asset.unrealized_pnl))
    book = context.get_account_book(SOURCE, ACCOUNT)
    asset = book.asset
    context.log.warning(
        "[account capital] (avail){} (margin){} (market_value){} (initial_equity){} (dynamic_equity){} (static_equity){} (realized_pnl){} (unrealized_pnl){}".format(
            asset.avail, asset.margin, asset.market_value, asset.initial_equity,
            asset.dynamic_equity, asset.static_equity, asset.realized_pnl, asset.unrealized_pnl))
    context.logger.warning("acc_pos")
    for key in book.long_positions:
        log_stock_pos(context, book.long_positions[key])
    # log_future_pos(context, pos)
    context.logger.warning("str_pos")
    for key in context.book.long_positions:
        log_stock_pos(context, context.book.long_positions[key])
        # log_future_pos(context, pos)

# 自定义期货持仓数据日志输出函数
def log_future_pos(context, pos):
    context.log.info(
        "(instrument_id){} (instrument_type){} (exchange_id){}(direction){} (volume){} (yesterday_volume){} (last_price){} (settlement_price){} (pre_settlement_price){} (avg_open_price){} (position_cost_price){} (margin){} (position_pnl){} (realized_pnl){} (unrealized_pnl){} ".format(
            pos.instrument_id, pos.instrument_type, pos.exchange_id,
            pos.direction, pos.volume, pos.yesterday_volume, pos.last_price, pos.settlement_price, pos.pre_settlement_price,
            pos.avg_open_price, pos.position_cost_price, pos.margin, pos.position_pnl, pos.realized_pnl, pos.unrealized_pnl))

# 自定义股票持仓数据日志输出函数
def log_stock_pos(context, pos):
    context.log.info(
        "(instrument_id){} (instrument_type){} (exchange_id){} (direction){} (volume){} (yesterday_volume){} (last_price){} (pre_close_price){} (close_price){} (avg_open_price){} (position_cost_price){} (realized_pnl){} (unrealized_pnl){} ".format(
            pos.instrument_id, pos.instrument_type, pos.exchange_id, pos.direction,
            pos.volume, pos.yesterday_volume, pos.last_price, pos.pre_close_price, pos.close_price, pos.avg_open_price,
            pos.position_cost_price, pos.realized_pnl, pos.unrealized_pnl))

# 自定义撤单回调函数
def cancel_order(context, order_id):
    action_id = context.cancel_order(order_id)
    if action_id > 0:
        context.log.info("[cancel order] (action_id){} (rid){} ".format(action_id, order_id))

函数定义

基本方法


pre_start

启动前调用函数,在策略启动前调用,用于完成添加交易账户,订阅行情,策略初始化计算等

参数

返回

返回 类型 说明

范例

def pre_start(context):
    context.add_account(source, account, 100000.0)
    context.subscribe(source, tickers, exchange)
    context.count = 0


post_start

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

参数

返回

返回 类型 说明

范例

def post_start(context):
    context.log.info("[log] {}".format("post_start"))
    context.add_timer(context.now() + 1*1000000000, lambda ctx, event: call(ctx, "test log1", "test log2"))
    context.add_timer(context.now() + 2*1000000000, log_pos)


pre_stop

退出前方法

参数

返回

返回 类型 说明

范例

# 退出前函数
def pre_stop(context):
    context.log.info("strategy will stop")


post_stop

退出前方法

参数

参数 类型 说明
context python对象 策略的全局变量,通过点标记(”.”)来获取其属性。

返回

返回 类型 说明

范例

# 退出前函数
def post_stop(context):
    context.log.info("process will stop")


on_quote

行情数据的推送会自动触发该方法的调用。

参数

参数 类型 说明
context python 对象 策略的全局变量,通过点标记(”.”)来获取其属性。
quote Quote 对象 行情数据。

返回

返回 类型 说明

范例

def on_quote(context, quote):
    context.log.info('[on_quote] {}, {}, {}'.format( quote.instrument_id, quote.last_price, quote.volume))


on_transaction

逐笔成交行情数据的推送会自动触发该方法的调用。

参数

参数 类型 说明
context python 对象 策略的全局变量,通过点标记(”.”)来获取其属性。
transaction Transaction 对象 逐笔成交行情数据。

返回

返回 类型 说明

范例

def on_transaction(context, transaction):
    context.log.info('[on_transaction] {}'.format(transaction))


on_entrust

逐笔委托行情数据的推送会自动触发该方法的调用。

参数

参数 类型 说明
context python 对象 策略的全局变量,通过点标记(”.”)来获取其属性。
entrust Entrust 对象 逐笔委托行情数据。

返回

返回 类型 说明

范例

def on_entrust(context, entrust):
    context.log.info('[on_entrust] {}'.format( entrust))


on_bar

BAR行情数据的推送会自动触发该方法的调用

参数

参数 类型 说明
context python 对象 策略的全局变量,通过点标记(”.”)来获取其属性。
bar Bar 对象 bar 行情数据

返回

返回 类型 说明

范例

def on_bar(context, bar):
    context.log.warning("[on_bar] {}".format(bar))


on_order

订单信息的更新会自动触发该方法的调用。

参数

参数 类型 说明
context python 对象 策略的全局变量,通过点标记(”.”)来获取其属性。
order Order 对象 订单信息更新数据。

返回

返回 类型 说明

范例

def on_order(context, order):
    context.log.info('[on_order] {}, {}, {}'.format( order.order_id, order.status, order.volume))


on_trade

策略订单成交信息的更新会自动触发该方法的调用。

参数 类型 说明
context python 对象 策略的全局变量,通过点标记(”.”)来获取其属性。
trade Trade 对象 订单成交更新数据。

返回

返回 类型 说明

范例

def on_trade(context, trade):
    context.log.info('[on_trade] {}, {}, {}'.format(trade.order_id, trade.volume, trade.price))



行情交易函数

context.add_account

添加交易柜台,策略需要先添加账户,才能使用该账户报单

参数

参数 类型 说明
source_id str 行情柜台ID
account_id str 账户ID
cash_limit float 策略首次运行时才设置初始资金

返回

返回 类型 说明
result bool

范例

# 添加柜台、账户以及初始资金
context.add_account(source_id, account_id, cash_limit)


context.subscribe

订阅行情

参数 类型 说明
source str 行情柜台ID
instrument list 代码列表
exchange_id Exchange 交易所ID
is_level2 bool 是否Level2

返回

返回 类型 说明

范例

# 向source柜台的exchange_id交易所订阅了instruments列表中的合约的行情
context.subscribe(source, instruments, exchange_id, is_level2=False)
#订阅bar行情,推送调用on_bar函数
context.subscribe("bar", instruments, exchange_id)


context.subscribe_all

订阅全市场行情

参数 类型 说明
source str 行情柜台ID
MarketType MarketType 权限订阅数据类型(可选参数)
SubscribeSecuDataType SubscribeSecuDataType 证券数据类型(可选参数)
SubscribeCategoryType SubscribeCategoryType 证券品种类型(可选参数)

返回

返回 类型 说明

范例

# 订阅source柜台全市场标的(不带可选参数)

context.subscribe_all(source)

#订阅某个柜台中某个交易所的某个品种(带可选参数)

context.subscribe_all(source, MarketType.kSSE, SubscribeCategoryType.kStock, SubscribeSecuDataType.kSnapshot) 

#可选参数 SubscribeSecuDataType,SubscribeCategoryType可以多选 

context.subscribe_all(source, MarketType.kSSE, SubscribeCategoryType.kStock | SubscribeCategoryType.kFund | SubscribeCategoryType.kOthers, SubscribeSecuDataType.kSnapshot | SubscribeSecuDataType.kTickExecution | SubscribeSecuDataType.kOrderQueue) 


context.insert_order

报单函数

参数 类型 说明
instrument_id str 合约ID
exchange_id str 交易所ID
account_id str 交易账号
limit_price float 价格
volume int 数量
priceType PriceType 对象 报单类型
side Side 对象 买卖方向
offset Offset 对象 开平方向
hedgeFlag HedgeFlag 对象 投机套保标识 (Python策略可以不填默认是投机 , c++策略需要填写)

返回

返回 类型 说明
order_id long 订单ID

范例

  • 通过交易账户acc_1以12.0元的价格买200股浦发银行:

context.insert_order("600000", Exchange.SSE, "acc_1", 12.0, 200, PriceType.Limit, Side.Buy, Offset.Open)

  • 通过交易账户acc_2以3500元的价格开仓买入2手上期所rb1906合约:

context.insert_order("rb1906", Exchange.SHFE, "acc_2", 3500.0, 2, PriceType.Limit, Side.Buy, Offset.Open)

注(期权):当买卖方向为:Lock(锁仓)、Unlock(解锁)、Exec(行权)、Drop(放弃行权)时,设定的price(委托价)以及offset(开平方向)都不生效


context.make_order

报单函数

参数 类型 说明
instrument_id str 合约ID
exchange_id str 交易所ID
source str 柜台ID
account_id str 交易账号
limit_price float 价格
volume int 数量
priceType PriceType 对象 报单类型
side Side 对象 买卖方向
offset Offset 对象 开平方向
hedgeFlag HedgeFlag 对象 投机套保标识 (Python策略可以不填默认是投机 , c++策略需要填写)

返回

返回 类型 说明
order_id long 订单ID

范例

  • 通过’xtp’柜台的交易账户acc_1以12.0元的价格买200股浦发银行:

context.make_order("600000", Exchange.SSE, "xtp","acc_1", 12.0, 200, PriceType.Limit, Side.Buy, Offset.Open)

insert_order和make_order都是报单函数,区别在于make_order需要填写柜台id(为了避免在不同柜台相同账户下单时的账户识别不准确问题)


context.cancel_order

撤单函数

参数

参数 类型 说明
order_id long 订单ID

返回

返回 类型 说明
action_id long 订单操作

范例

# 通过context.insert_order函数进行下单,同时用order_id记录下单的订单ID号,下单完成后,为了保证后续可能会出现的撤单操作能够正常执行,这里需要等待一段时间
order_id = context.insert_order(quote.instrument_id, exchange, account, quote.last_price - 10, volume, PriceType.Limit, Side.Buy, Offset.Open)
            if order_id > 0:
                context.log.info("[order] (rid){} (ticker){}".format(order_id, quote.instrument_id))
                context.add_timer(context.now() + 1*1000000000, lambda ctx, event: cancel_order(ctx, order_id))
                context.order_id  = order_id

# 将order_id传入cancel_order进行撤单操作,同时打印相关日志
def cancel_order(context,order_id):
    action_id =  context.cancel_order(order_id)
    if action_id > 0:
        context.log.info("[cancel order] (action_id){} (rid){} ".format(action_id, order_id))


投资组合相关功能

盈亏及持仓

功夫系统支持实时维护策略收益及持仓及对应的历史记录,针对不同的应用场景,提供共计四种不同的维护收益及持仓的模式。对于任一策略,具体采用的模式由两个 API 决定:context.hold_book() 及 context.hold_positions(),使用者需要在策略的 pre_start() 方法里决定是否调用这两个方法,系统在 pre_start() 处理完成时会根据是否调用这两个方法对应出的共计四种状态来设置维护收益及持仓的结果。

context.hold_book()

保持策略运行历史上的交易过的标的。缺省设置即没有调用此方法时,系统只会维护当前策略代码中通过 subscribe 方法订阅过的标的;当调用此方法后,系统会在策略启动后,根据该同名策略在历史上的交易情况,构造一份包含所有该同名策略所交易过标的,及当前策略代码中通过 subscribe 订阅的标的的账目。注意此方法仅影响标的列表,对于每个标的的具体持仓数值,是由 hold_positions() 方法来决定。

范例

# 历史曾执行过订阅某些标的
# context.subscribe(source, ['600000', '600001'])

# 当前代码中重置了 subscribe,且没有调用 context.hold_book(),则该策略只会收到新订阅的标的行情,且账目收益及持仓中只包含新订阅的标的
context.subscribe(source, ['600002', '600003'])

# 如果调用 hold_book,则该策略订阅行情列表中会自动包含历史记录中有的标的,且账目收益及持仓中也会包含对应标的的数据
context.hold_book()

context.hold_positions()

保持账目中每一标的的历史持仓。缺省设置即没有调用此方法时,系统会通过同步柜台查询到的持仓数据来构建策略账目,每次策略启动后,账目中所有标的的持仓都会同步为最新的柜台账户对应的持仓;当调用此方法后,系统会使用功夫内部记录的历史数据来恢复策略的账目持仓。缺省设置保证了策略账目中的持仓数据是绝对准确的,但无法反映功夫运行期间内的策略历史交易情况;如果需要获取之前运行策略时产生的历史持仓记录,则需要通过调用该方法来使系统使用本地存储的历史记录,在这种情况下,当因为各种因素(例如在功夫系统外使用别的软件对同一账户手动交易)都会使得功夫内部维护的持仓记录产生偏差,(例如同一账户下对应的不同策略持仓汇总之和不等于账户总持仓),当发生此类偏差时,建议使用缺省模式来从账户持仓恢复策略持仓。

范例

# 策略账目所包含的持仓标的列表取决于是否调用 context.hold_book(),但每个标的的具体持仓数值则由 context.hold_positions()来决定,当缺省即没有调用该方法时,策略启动后的账目中的标的持仓等于所对应账户下的标的持仓:
context.subscribe(source, ['600000', '600001'])

# 当调用 hold_positions() 方法后,策略启动后的账目中标的持仓等于上次运行策略结束时所对应的标的持仓:
context.hold_positions()

context.book

策略的投资组合

类型
book 对象

范例

#获取策略的投资组合,并打印相关参数
book = context.book
context.log.warning("[strategy capital] (avail){} (margin){}".format(book.asset.avail, book.asset.margin))


context.get_account_book(SOURCE, ACCOUNT)

账户的投资组合

类型
book 对象

范例

#获取账户的投资组合,并打印相关参数
book = context.get_account_book(SOURCE, ACCOUNT)
context.log.warning("[account capital] (avail){} (margin){} ".format(book.asset.avail, book.asset.margin))


辅助函数

context.log.info

输出INFO级别 Log 信息

参数 类型 说明
msg str Log信息

返回

返回 类型 说明

范例

context.log.info(msg)


context.log.warning

输出WARN级别Log信息

参数

参数 类型 说明
msg str Log信息

返回

返回 类型 说明

范例

context.log.warning(msg)


context.log.error

输出ERROR级别Log信息

参数

参数 类型 说明
msg str Log信息

返回

返回 类型 说明

范例

context.log.error(msg)


context.add_timer

注册时间回调函数

参数

参数 类型 说明
nano long 触发回调的纳秒时间戳
callback object 回调函数

返回

返回 类型 说明

范例

# 通过时间回调函数,在1s后撤去订单号为order_id的报单
context.add_timer(context.now() + 1*1000000000, lambda ctx, event: cancel_order(ctx, order_id))


context.add_time_interval

时间间隔回调函数

参数

参数 类型 说明
nano long 触发回调的纳秒时间戳
callback object 回调函数

返回

返回 类型 说明

范例

# 通过时间间隔回调函数,每过60s,调用一次func函数
context.add_time_interval(60 * 1000000000, lambda ctx, event: func(ctx))


常量定义

Source 柜台

属性 说明
CTP “ctp“ CTP柜台
XTP “xtp“ XTP柜台
SIM “sim“ SIM柜台

柜台使用方法

# 案例示范
from kungfu.wingchun.constants import Source

SOURCE = Source.XTP
# SOURCE = "xtp"
ACCOUNT = "1111111"

def pre_start(context):
	# 添加账户柜台信息
	context.add_account(SOURCE, ACCOUNT, 100000.0)


Exchange 交易所

属性 说明
SSE “SSE” 上交所
SZE “SZE” 深交所
SHFE “SHFE” 上期所
DCE “DCE” 大商所
CZCE “CZCE” 郑商所
CFFEX “CFFEX” 中金所
INE “INE” 能源中心

交易所使用方法

# 案例示范
from kungfu.wingchun.constants import Exchange

EXCHANGE = Exchange.SZE
EXCHANGE_2 = Exchange.SSE

def pre_start(context):
	# 订阅某些深交所股票的行情
    context.subscribe(SOURCE, tickers, EXCHANGE)
	# 订阅某些上交所股票的行情
    context.subscribe(SOURCE, tickers_2, EXCHANGE_2)


InstrumentType 代码类型

属性 说明
Unknown 未知
Stock 股票
Future 期货
Bond 债券
StockOption 股票期权
Fund 基金
TechStock 科创板股票
Index 指数
Repo 回购

合约类型判断方法

# 案例示范
from kungfu.wingchun.constants import InstrumentType

positions = context.get_account_book(SOURCE, ACCOUNT)

for key in positions.long_positions:
	pos = positions.long_positions[key]
	if pos.instrument_type == InstrumentType.Stock:
		context.log.info("这个ticker的合约类型是股票类型")
	elif pos.instrument_type == InstrumentType.Future:
		context.log.info("这个ticker的合约类型是期货类型")
	elif pos.instrument_type == InstrumentType.Bond:
		context.log.info("这个ticker的合约类型是债券类型")


PriceType 报单类型

属性 说明
Limit 限价,通用
Any 市价,通用,对于股票上海为最优五档剩余撤销,深圳为即时成交剩余撤销
FakBest5 上海深圳最优五档即时成交剩余撤销,不需要报价
ForwardBest 仅深圳本方方最优价格申报, 不需要报价
ReverseBest 上海最优五档即时成交剩余转限价,深圳对手方最优价格申报,不需要报价
Fak 股票(仅深圳)即时成交剩余撤销,不需要报价;期货即时成交剩余撤销,需要报价
Fok 股票(仅深圳)市价全额成交或者撤销,不需要报价;期货全部或撤销,需要报价

报单类型使用方法

# 案例示范
from kungfu.wingchun.constants import PriceType, Side, Offset

context.insert_order("600000", Exchange.SSE, "acc_1", 12.0, 200, PriceType.Limit, Side.Buy, Offset.Open)
# 通过交易账户acc_1以12.0元的限价价格买开200股浦发银行


Side 买卖

属性 说明
Buy
Sell
Lock 锁仓
Unlock 解锁
Exec 行权
Drop 放弃行权
MarginTrade 融资买入
ShortSell 融券卖出
RepayMargin 卖券还款
RepayStock 买券还券

买卖方向使用方法

# 案例示范
from kungfu.wingchun.constants import PriceType, Side, Offset

context.insert_order("600000", Exchange.SSE, "acc_1", 12.0, 200, PriceType.Limit, Side.Buy, Offset.Open)
# 通过交易账户acc_1以12.0元的限价价格买开200股浦发银行


Offset 开平

属性 说明
Open
Close
CloseToday 平今
CloseYesterday 平昨

开平使用方法

# 案例示范
from kungfu.wingchun.constants import PriceType, Side, Offset

context.insert_order("600000", Exchange.SSE, "acc_1", 12.0, 200, PriceType.Limit, Side.Buy, Offset.Open)
# 通过交易账户acc_1以12.0元的限价价格买开200股浦发银行


HedgeFlag 投机套保标识

属性 说明
Speculation 投机

注意 : Python策略中insert_order可以不写这个参数,因为已经默认是投机.c++策略中需要填写


Direction 多空

属性 说明
Long
Short

持仓方向使用方法

# 案例示范
from kungfu.wingchun.constants import Direction

positions = context.get_account_book(SOURCE, ACCOUNT)

for key in positions.long_positions:
	pos = positions.long_positions[key]
	if pos.direction == Direction .Long:
		context.log.info("这个ticker的持仓方向 : 多")
	elif pos.direction == Direction .Short:
		context.log.info("这个ticker的持仓方向 : 空")


OrderStatus 委托状态

属性 说明
Unknown 未知
Submitted 已提交
Pending 等待
Cancelled 已撤单
Error 错误
Filled 已成交
PartialFilledNotActive 部分成交不在队列中(部成部撤)
PartialFilledActive 部分成交还在队列中

订单状态获取

# 案例示范
from kungfu.wingchun.constants import OrderStatus

def on_order(context, order):
    if order.status == OrderStatus.Submitted:
        context.log.warning("此时的订单状态为 : 已提交")
    elif order.status == OrderStatus.Pending:
        context.log.warning("此时的订单状态为 : 等待中")
    elif order.status == OrderStatus.Filled:
        context.log.warning("此时的订单状态为 : 已成交")


MarketType 权限订阅数据类型

属性 说明
kNone 表示全市场
kNEEQ 北交所
kSHFE 上期所
kCFFEX 中金所
kDCE 大商所
kCZCE 郑商所
kINE 上期能源
kSSE 上交所
kSZSE 深交所
kMax 市场类型最大值

注意 : 暂时不支持直连港交所, 港交所行情数据通过深交所和上交所的港股通获取, 市场类型为kSZSE/kSSE


SubscribeSecuDataType 证券数据类型

属性 说明
kNone 订阅全部证券数据类别
kSnapshot 订阅快照数据类别
kTickExecution 订阅逐笔成交数据
kTickOrder 订阅逐笔委托数据
kOrderQueue 订阅委托队列数据


SubscribeCategoryType 证券品种类型

属性 说明
kNone 订阅全部证券品种类别
kStock 订阅股票证券品种类别
kFund 订阅基金证券品种类别
kBond 订阅债券证券品种类别
kIndex 订阅指数证券品种类别
kHKT 订阅港股通证券品种类别
kOption 订阅期权证券品种类别
kFutureOption 订阅期货/期货期权证券品种类别
kOthers 订阅其他证券品种类别


ExecType 标识

属性 说明
Unknown 未知
Cancel 撤单
Trade 成交


BsFlag 标识

属性 说明
Unknown 未知
Buy
Sell


数据结构


Quote 行情信息

属性 类型 说明
source_id str 柜台ID
trading_day str 交易日
data_time long 数据生成时间(交易所时间)
instrument_id str 合约ID
exchange_id str 交易所
instrument_type str 合约类型
pre_close_price float 昨收价
pre_settlement_price float 昨结价
last_price float 最新价
volume int 数量
turnover float 成交金额
pre_open_interest float 昨持仓量
open_interest float 持仓量
open_price float 今开盘
high_price float 最高价
low_price float 最低价
upper_limit_price float 涨停板价
lower_limit_price float 跌停板价
close_price float 收盘价
settlement_price float 结算价
bid_price list of float 申买价
ask_price list of float 申卖价
bid_volume list of float 申买量
ask_volume list of float 申卖量
iopv float 基金实时参考净值
trading_phase_code str 交易


Entrust 逐笔委托

属性 类型 说明
source_id str 柜台ID
trading_day str 交易日
data_time long 数据生成时间(交易所时间)
instrument_id str 合约ID
exchange_id str 交易所
instrument_type str 合约类型
price float 委托价格
volume int 委托量
side Side 委托方向
price_type PriceType 订单价格类型(市价、限价、本方最优)
main_seq long 主序号
seq long 子序号
biz_index int 业务序号


Transaction 逐笔成交

属性 类型 说明
source_id str 柜台ID
trading_day str 交易日
data_time long 数据生成时间(交易所时间)
instrument_id str 合约ID
exchange_id str 交易所
instrument_type str 合约类型
price float 成交价
volume int 成交量
bid_no long 买方订单号
ask_no long 卖方订单号
exec_type ExecType SZ: 成交标识
bs_flag BsFlag SH: 内外盘标识
main_seq long 主序号
seq long 子序号
biz_index int 业务序号


Order 订单回报

属性 类型 说明
order_id long 订单ID
insert_time long 订单写入时间(功夫时间)
update_time long 订单更新时间(功夫时间)
trading_day str 交易日
instrument_id str 合约ID
exchange_id str 交易所ID
account_id str 账号ID
client_id str Client ID
instrument_type str 合约类型
limit_price float 价格
frozen_price float 冻结价格(市价单冻结价格为0.0)
volume int 数量
volume_traded int 成交数量
volume_left int 剩余数量
tax float
commission float 手续费
status OrderStatus 订单状态
error_id int 错误ID
error_msg str 错误信息
parent_id int 母订单ID
side str 买卖方向
offset str 开平方向
price_type str 价格类型
volume_condition str 成交量类型
time_condition str 成交时间类型


Trade 订单成交

属性 类型 说明
order_id long 订单ID
parent_order_id long 母订单ID
trade_id long 成交ID
trade_time long 成交时间(功夫时间)
trading_day str 成交时间
instrument_id str 合约ID
exchange_id str 交易所ID
account_id str 账号ID
client_id str Client ID
instrument_type str 合约类型
side str 买卖方向
offset str 开平方向
price float 成交价格
volume int 成交量
tax float
commission float 手续费
close_today_volume int 今日收盘成交量
hedge_flag int 投机套保标识


Bar k线行情

属性 类型 说明
trading_day str 交易日
instrument_id str 合约代码
exchange_id str 交易所代码
start_time int 开始时间(功夫时间)
end_time int 结束时间(功夫时间)
open double 开始价格
close double 结束价格
low double 最低价格
high double 最高价格
volume int 区间交易量
start_volume int 初始交易量
tick_count int 区间有效tick

注意:功夫时间在最开始会以真实时间对时,然后根据cpu震动++,是个单调递增的时间,和真实时间是有差别的。交易所时间和本机时间也会有差别


Utils

属性 类型 说明
hash_instrument long 持仓列表中的key值
is_valid_price bool 判断当前价格是否为有效价格
is_final_status bool 判断当前状态是否为最终状态
get_instrument_type InstrumentType 获取类型

Utils范例

# 案例示范
from pykungfu import wingchun as wc

wc.utils.hash_instrument(exchange_id, instrument_id)

wc.utils.is_valid_price(quote.last_price)

wc.utils.is_final_status(order.status)

wc.utils.get_instrument_type(exchange_id, instrument_id)


Book 投资组合

属性 类型 说明
asset asset 投资组合资金信息
asset_margin asset_margin 两融相关信息
long_positions List of Position 投资组合的持仓列表,对应多头仓位
short_positions List of Position 投资组合的持仓列表,对应空头仓位
has_long_position bool 判断是否为多头仓位
has_short_position bool 判断是否为空头仓位
has_position bool 判断是否有仓位
get_long_position dict 多头持仓信息
get_short_position dict 空头持仓信息
has_position_for bool 判断是否有持仓

获取投资组合持仓列表范例

# 通过context.log.info打印组合投资的多头持仓列表
positions = context.get_account_book(SOURCE, ACCOUNT).long_positions
for key in positions:
      pos = positions[key]
      context.log.info("(instrument_id){} (direction){} (volume){} (yesterday_volume){} ".format(pos.instrument_id,  
                         pos.direction, pos.volume, pos.yesterday_volume))

# 通过context.log.info打印持仓列表

account_book = context.get_account_book(SOURCE, ACCOUNT)

account_book.asset_margin

account_book.has_long_position(exchange_id, instrument_id)

account_book.has_position(exchange_id, instrument_id)

account_book.get_long_position(exchange_id, instrument_id)

account_book.has_position_for(quote)
# account_book.has_position_for(order)
# account_book.has_position_for(trade)

Book.asset 投资组合资金信息

属性 类型 说明
avail float 可用资金
margin float 保证金(期货)
market_value float 市值
initial_equity float 初始权益
dynamic_equity float 动态权益
static_equity float 静态权益
realized_pnl float 已实现盈亏
unrealized_pnl float 未实现盈亏
accumulated_fee float 累计手续费
intraday_fee float 当日手续费
frozen_cash float 冻结资金
frozen_margin float 冻结保证金
frozen_fee float 冻结手续费
position_pnl float 持仓盈亏
close_pnl float 平仓盈亏

Book.asset_margin 两融 相关信息

属性 类型 说明
total_asset float 总资产
avail_margin float 可用保证金
cash_margin float 融资占用保证金
short_margin float 融券占用保证金
margin float 总占用保证金
cash_debt float 融资负债
short_cash float 融券卖出金额
short_market_value float 融券卖出证券市值
margin_market_value float 融资买入证券市值
margin_interest float 融资融券利息
margin_fee float 融资融券费用
settlement float 融资融券清算资金
credit float 信贷额度
collateral_ratio float 担保比例

投资组合持仓明细

参数

参数 类型 说明
instrument_id str 合约ID
exchange_id Exchange 交易所ID
direction Direction 持仓方向

返回

返回 类型 说明
position Position对象 账户持仓明细

范例

book = context.get_account_book(SOURCE, ACCOUNT)
context.log.info("[pos]{}".format(book.get_position( Direction.Long,Exchange.SSE,"600000").volume))


Position 持仓信息

期货持仓

属性 类型 说明
account_id str 账户ID
instrument_id str 合约ID
instrument_type InstrumentType 合约类型
exchange_id str 交易所
direction Direction 方向
volume int 总仓
yesterday_volume int 昨仓
frozen_total int 冻结数量
frozen_yesterday int 冻结昨仓
last_price float 最新价
settlement_price float 结算价
pre_settlement_price float 昨结价
avg_open_price float 开仓均价
position_cost_price float 持仓成本
margin float 保证金
position_pnl float 持仓盈亏
close_pnl float 平仓盈亏
realized_pnl float 已实现盈亏
unrealized_pnl float 未实现盈亏
trading_day float 交易日
update_time float 订单更新时间
source_id float 行情柜台ID
client_id str Client ID

股票持仓

属性 类型 说明
account_id str 账户ID
instrument_id str 合约ID
instrument_type InstrumentType 合约类型
exchange_id str 交易所
direction Direction 方向
volume int 总仓
yesterday_volume int 昨仓
frozen_total int 冻结数量
frozen_yesterday int 冻结昨仓
last_price float 最新价
pre_close_price float 昨收价
close_price float 收盘价
avg_open_price float 开仓均价
position_cost_price float 持仓成本
realized_pnl float 已实现盈亏
unrealized_pnl float 未实现盈亏
trading_day float 交易日
update_time float 订单更新时间
source_id float 行情柜台ID
client_id str Client ID


功夫自带python库(pipfile)

url = "http://mirrors.aliyun.com/pypi/simple/"
verify_ssl = false
name = "pypi"

[packages]
conan = "==1.22"
pywin32 = {version = "==227",sys_platform = "== 'win32'"}
pyinstaller = "==3.6"
click = "==7.1.1"
tabulate = "==0.8.6"
prompt_toolkit = "==1.0.14"
PyInquirer = "==1.0.3"
psutil = "==5.7.0"
chinesecalendar = "==1.4.0"
zhdate = "==0.1"
schema = "==0.7.1"
rx = "==3.0.1"
numpy = "==1.16.4"
pandas = "==0.24.2"
statsmodels = "==0.10.1"
sortedcontainers = "==2.1.0"
recordclass = "==0.12.0.1"
dotted_dict = "==1.1.2"
plotly = "==4.0.0"
tushare = "==1.2.39"

[dev-packages]
clang-format = "==9.0.0"

 

Scroll Up