策略引擎简介
更加详细的调用方法,后续会慢慢整理。
也可找寻博主历史文章,搜索关键词使用方案,比如本文涉及函数tick_data!
感谢关注,咨询开通量化回测与获取实盘权限,欢迎和博主联系!
ptrade业务流程框架
ptrade量化引擎以事件触发为基础,通过初始化事件(initialize)、盘前事件(before_trading_start)、盘中事件(handle_data)、盘后事件(after_trading_end)来完成每个交易日的策略任务。
initialize和handle_data是一个允许运行策略的最基础结构,也就是必选项,before_trading_start和after_trading_end是可以按需运行的。
handle_data仅满足日线和分钟级别的盘中处理,tick级别的盘中处理则需要通过tick_data或者run_interval来实现。
ptrade还支持委托主推事件(on_order_response)、交易主推事件(on_trade_response),可以通过委托和成交的信息来处理策略逻辑,是tick级的一个补充。
除了以上的一些事件以外,ptrade也支持通过定时任务来运行策略逻辑,可以通过run_daily接口实现。
tick_data(可选)
tick_data(context, data)
使用场景
该函数仅交易模块可用
接口说明
该函数可以用于处理tick级别策略的交易逻辑,每隔3秒执行一次,如无tick处理需求,该函数可以在策略中不做定义。
注意事项:
-
该函数执行时间为9:30 -- 14:59。
-
该函数中的data和handle_data函数中的data是不一样的,请勿混肴。
-
参数data中包含的逐笔委托,逐笔成交数据需开通level2行情才能获取到数据,否则对应数据返回None。
-
参数data中的tick数据取自get_snapshot()并转换为DataFrame格式,如要更快速的获取快照强烈建议直接使用get_snapshot()获取。
-
当调用set_parameters()并设置tick_data_no_l2="1"时,参数data中将不包含逐笔委托、逐笔成交字段,当券商有l2行情时配置该参数可提升data取速;
-
当策略执行时间超过3s时,将会丢弃中间堵塞的tick_data。
-
在收盘后,将会清空队列中未执行的tick_data。
-
参数data中包含的逐笔委托,逐笔成交数据正常返回DataFrame格式,异常时返回None。
可调用接口
get_trading_day(研究/回测/交易) get_all_trades_days(研究/回测/交易)
get_trade_days(研究/回测/交易) get_cb_list(交易) get_history(回测/交易)
get_price(研究/回测/交易) get_individual_entrust(交易) get_individual_transaction(交易)
get_tick_direction(交易) get_sort_msg(交易) get_etf_info(交易) get_etf_stock_info(交易)
get_gear_price(交易) get_snapshot(交易) get_stock_name(研究/回测/交易)
get_stock_info(研究/回测/交易) get_stock_status(研究/回测/交易)
get_stock_exrights(研究/回测/交易) get_stock_blocks(研究/回测/交易)
get_index_stocks(研究/回测/交易) get_etf_stock_list(交易)
get_industry_stocks(研究/回测/交易) get_fundamentals(研究/回测/交易)
get_Ashares(研究/回测/交易) get_etf_list(交易) get_user_name(回测/交易)
get_research_path(研究/回测/交易) get_trade_name(交易) set_universe(回测/交易)
order(回测/交易) order_target(回测/交易) order_value(回测/交易)
order_target_value(回测/交易) order_market(交易) ipo_stocks_order(交易)
after_trading_order(交易) after_trading_cancel_order(交易) etf_basket_order(交易)
etf_purchase_redemption(交易) get_positions(回测/交易) order_tick(交易)
cancel_order(回测/交易) cancel_order_ex(交易) debt_to_stock_order(交易)
get_open_orders(回测/交易) get_order(回测/交易) get_orders(回测/交易)
get_all_orders(交易) get_trades(回测/交易) get_position(回测/交易) margin_trade(交易)
margincash_open(交易) margincash_close(交易) margincash_direct_refund(交易)
marginsec_open(交易) marginsec_close(交易) marginsec_direct_refund(交易)
get_margincash_stocks(交易) get_marginsec_stocks(交易) get_margin_contract(交易)
get_margin_contractreal(交易) get_margin_assert(交易) get_assure_security_list(交易)
get_margincash_open_amount(交易) get_margincash_close_amount(交易)
get_marginsec_open_amount(交易) get_marginsec_close_amount(交易)
get_margin_entrans_amount(交易) buy_open(回测/交易(期货))
sell_close(回测/交易(期货)) sell_open(回测/交易(期货)) buy_close(回测/交易(期货))
get_instruments(回测/交易(期货)) log(回测/交易) is_trade(回测/交易)
check_limit(交易) send_email(交易) send_qywx(交易)
get_MACD(回测/交易) get_KDJ(回测/交易) get_RSI(回测/交易)
get_CCI(回测/交易) create_dir(回测/交易) get_opt_contracts(研究/回测/交易(期权))
get_contract_info(研究/回测/交易(期权)) set_parameters(回测/交易)
get_covered_lock_amount(交易(期权)) get_covered_unlock_amount(交易(期权))
buy_open(交易(期权)) sell_close(交易(期权)) sell_open(交易(期权)) buy_close(交易(期权))
open_prepared(交易(期权)) close_prepared(交易(期权)) option_exercise(交易(期权))
option_covered_lock(交易(期权)) option_covered_unlock(交易(期权)) get_cb_info(研究/交易)
get_enslo_security_info(交易) get_ipo_stocks(交易)
参数
context: Context对象,存放有当前的账户及持仓信息;
data: 一个字典(dict),key为对应的标的代码(如:'600570.SS'),value为一个字典(dict),包含order(逐笔委托)、tick(当前tick数据)、transcation(逐笔成交)三项
结构如下:
{'股票代码':
{
'order(最近一条逐笔委托)':DataFrame/None,
'tick(当前tick数据)':DataFrame,
'transcation(最近一条逐笔成交)':DataFrame/None,
}
}
每项具体介绍:
order - 逐笔委托对应DataFrame包含字段:
business_time:时间戳毫秒级
hq_px:价格
business_amount:委托量
order_no:委托编号
business_direction:委托方向
0 – 卖;
1 – 买;
2 – 借入;
3 – 出借;
trans_kind:委托类别
1-- 市价委托;
2 -- 限价委托;
3 -- 本方最优;
tick - tick数据对应DataFrame包含字段:
amount:持仓量
avg_px:均价
bid_grp:买档位,dict类型,内容如:{1:[42.71,200,0],2:[42.74,200,0],3:[42.75,700,...,以档位为Key,以list为Value,每个Value包含:委托价格、委托数量和委托笔数;
business_amount:成交数量;
business_amount_in:内盘成交量;
business_amount_out:外盘成交量
business_balance:成交金额;
business_count:成交笔数;
circulation_amount:流通股本;
close_px:今日收盘
current_amount:最近成交量(现手);
down_px:跌停价格;
end_trade_date:最后交易日
entrust_diff:委差;
entrust_rate:委比;
high_px:最高价;
hsTimeStamp:时间戳,格式为YYYYMMDDHHMISS,如20170711141612,表示2017年7月11日14时16分12秒的tick数据信息;
issue_date:上市日期
last_px:最新成交价;
low_px:最低价;
offer_grp:卖档位,dict类型,内容如:{1:[42.71,200,0],2:[42.74,200,0],3:[42.75,700,...,以档位为Key,以list为Value,每个Value包含:委托价格、委托数量和委托笔数;
open_px:今开盘价;
pb_rate:市净率;
pe_rate:动态市盈率;
preclose_px:昨收价;
prev_settlement:昨结算
px_change_rate: 涨跌幅
settlement:结算价
start_trade_date:首个交易日
tick_size:最小报价单位
total_bid_turnover: 委买金额
total_bidqty: 委买量
total_offer_turnover: 委卖金额
total_offerqty: 委卖量
trade_mins:交易时间,距离开盘已过交易时间,如100则表示每日240分钟交易时间中的第100分钟;
trade_status:交易状态;
START -- 市场启动(初始化之后,集合竞价前)
PRETR -- 盘前
OCALL -- 开始集合竞价
TRADE -- 交易(连续撮合)
HALT -- 暂停交易
SUSP -- 停盘
BREAK -- 休市
POSTR -- 盘后
ENDTR -- 交易结束
STOPT -- 长期停盘,停盘n天,n>=1
DELISTED -- 退市
POSMT -- 盘后交易
PCALL -- 盘后集合竞价
INIT -- 盘后固定价格启动前
ENDPT -- 盘后固定价格闭市阶段
POSSP -- 盘后固定价格停牌
turnover_ratio:换手率
up_px:涨停价格;
vol_ratio:量比;
wavg_px:加权平均价;
transcation - 逐笔成交对应DataFrame包含字段:
business_time:时间戳毫秒级;
hq_px:价格;
business_amount:成交量;
trade_index:成交编号;
business_direction:成交方向;
0 – 卖;
1 – 买;
buy_no: 叫买方编号;
sell_no: 叫卖方编号;
trans_flag: 成交标记;
0 – 普通成交;
1 – 撤单成交;
trans_identify_am: 盘后逐笔成交序号标识;
0 – 盘中;
1 – 盘后;
channel_num: 成交通道信息;
返回
None
示例
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def tick_data(context,data):
# 获取买一价
security = g.security
current_price = eval(data[security]['tick']['bid_grp'][0])[1][0]
log.info(current_price)
# 获取买二价
# current_price = eval(data[security]['tick']['bid_grp'][0])[2][0]
# 获取买三量
# current_amount = eval(data[security]['tick']['bid_grp'][0])[3][1]
# 获取tick最高价
# current_high_price = data[security]['tick']['high_px'][0]
# 最近一笔逐笔成交的成交量
# transaction = data[security]["transcation"]
# business_amount = list(transaction["business_amount"])
# if len(business_amount) > 0:
# log.info("最近一笔逐笔成交的成交量:%s" % business_amount[0])
# 最近一笔逐笔委托的委托类别
# order = data[security]["order"]
# trans_kind = list(order["trans_kind"])
# if len(trans_kind) > 0:
# log.info("最近一笔逐笔委托的委托类别:%s" % trans_kind[0])
if current_price > 38.19:
# 按买一档价格下单
order_tick(security, 100, 1)
def handle_data(context, data):
pass