【历史文档】策略回测-交易相关方法(context)
由bigquant创建,最终由small_q 被浏览 1012 用户
更新
本文内容对应旧版平台与旧版资源,其内容不再适合最新版平台,请查看新版平台的使用说明
新版量化开发IDE(AIStudio):
https://bigquant.com/wiki/doc/aistudio-aiide-NzAjgKapzW
新版模版策略:
https://bigquant.com/wiki/doc/demos-ecdRvuM1TU
新版数据平台:
https://bigquant.com/data/home
https://bigquant.com/wiki/doc/dai-PLSbc1SbZX
新版表达式算子:
https://bigquant.com/wiki/doc/dai-sql-Rceb2JQBdS
新版因子平台:
https://bigquant.com/wiki/doc/bigalpha-EOVmVtJMS5
\
symbol
定义
symbol(symbol_str)
通过股票代码获取股票对象
参数
symbol_str – 股票代码字符串
返回
Equity 对象
示例代码
# 获取浦发银行Equity对象
context.symbol('600000.SHA')
symbols
定义
symbols(*args)
通过多个股票代码获取股票对象列表
参数
args – iterable[str],股票代码字符串列表
返回
Equity 对象列表
示例代码
context.symbols('000001.SZA','000002.SZA')
future_symbol
定义
future_symbol(symbol_str)
通过期货代码生成期货对象
参数
symbol_str – 期货代码字符串
返回
Equity 对象列表
示例代码
# 获取螺纹钢1901.SHF的Equity对象
context.future_symbol('RB1901.SHF')
order
定义
order(self, asset, amount, position_effect=None, limit_price=None, stop_price=None, style=None)
生成订单,amount为负,表示做空。调用成功后, 您可以调用get_open_orders取得所有未完成的交易, 也可以调用cancel_order取消交易。 生成订单的前提是该标的data.can_trade返回为True,停牌或没有数据data.can_trade为False,因此停牌的标的直接下单会报错。
参数
asset – Asset 标的,支持期货和股票 amount – float 交易数量, 正数表示买入, 负数表示卖出
position_effect - str(可选参数) 期货开平控制,默认值是'auto',可用的类型如下:
position_effect = 'open' # 开仓 position_effect = 'close' # 平仓 position_effect = 'close_today' # 平今 position_effect = 'close_yesterday' # 平昨 position_effect = 'auto' # 自动开平仓 position_effect = 'target' # 按目标仓位建仓 limit_price - float(可选参数) 订单的限价 stop_price - float(可选参数) 订单的止损价
style–ExecutionStyle(可选参数) 指定下单类型,默认为市价单,可用的下单类型如下:
style=MarketOrder(),下市价单 style=StopOrder(stop_price),下止损单,通常用来止损或者锁定利润 style=LimitOrder(limit_price),下限价单,限定一个价格买入或卖出 style=StopLimitOrder(limit_price=price1, stop_price=price2),指定限价和止损价格
示例代码
股票
from zipline.finance.execution import MarketOrder, LimitOrder, StopOrder, StopLimitOrder
# 买入平安银行股票100股
context.order(context.symbol('000001.SZA'), 100) # 下一个市价单
context.order(context.symbol('000001.SZA'), 100, style=MarketOrder()) # 下一个市价单, 功能同上
# 下一个限价单(买入), 价位应低于市价,价格小于等于10元买入
context.order(context.symbol('000001.SZA'), 100, style=LimitOrder(10.0))
# 下一个止损单(卖出),价格小于等于10元卖出100股
context.order(context.symbol('000001.SZA'), -100, style=StopOrder(10.0))
期货
# 卖开2手
context.order(sid, -2, position_effect='open')
# 买平2手
context.order(sid, 2 , position_effect='close')
# 自动开平仓,有相反仓位,先进行平仓,不足指定数量,余下的数量进行开仓。
context.order(sid, -2, position_effect='auto') # 如果没有多头仓位,直接卖开2手;如有1手多头仓位,卖平一手,再卖开1手;若有超过2手的多头仓位,直接卖平2手
# 目标仓位建仓,调整净持仓到目标数量的持仓
context.order(sid, -2, position_effect='target') # 若仓位是[多:2,空:0],则卖平2手,卖开2手;若仓位为[多:3,空:-1],则卖平3手,卖开1手;仓位为[多:0, 空:-1],则卖开1手。
order_target
定义
order_target(asset, amount, style=OrderType)
买卖股票,使成交之后最终持有的股票数量达到预期目标的amount(股数) 买卖期货,使成交之后最终持有的合约手数达到预期目标的amount
参数
asset – 标的, 支持期货和股票 amount – 交易数量, 正数表示买入, 负数表示卖出 style –(可选参数)指定下单类型,默认为市价单,可用的下单类型如下:
style=MarketOrder(),下市价单 style=StopOrder(stop_price),下止损单,通常用来止损或者锁定利润 style=LimitOrder(limit_price),下限价单,限定一个价格买入或卖出 style=StopLimitOrder(limit_price=price1, stop_price=price2),指定限价和止损价格
示例代码
# 成交之后最终持有的股票数量为预期目标的0股,即卖出平安银行所有股票
context.order_target(context.symbol('000001.SZA'), 0)
# 成交之后最终持有的股票数量为预期目标的200股。如果目前没有持有平安银行,则需要买入平安银行200股,如果已经持有平安银行100股,那么只需要买入100股,因此生成的订单为100股买单。
context.order_target(context.symbol('000001.SZA'), 200)
order_lots
定义
order_lots(asset, amount)
按照手数买卖股票, 按市价买入 amount(手数)* 100 股
参数
asset – 股票 amount – 手数
示例代码
# 买入1手(100股)平安银行
context.order_lots(context.symbol('000001.SZA'), 1)
order_value
定义
order_value(asset, value, style=OrderType)
买卖股票,按股票交易金额生成订单,value为负,表示做空。 买卖期货,按保证金金额生成订单,value为负,表示做空。
参数
asset – 标的,支持股票和期货 value – 交易金额, 正数表示买入, 负数表示卖出
style –(可选参数)指定下单类型,默认为市价单,可用的下单类型如下:
style=MarketOrder(),下市价单 style=StopOrder(stop_price),下止损单,通常用来止损或者锁定利润 style=LimitOrder(limit_price),下限价单,限定一个价格买入或卖出 style=StopLimitOrder(limit_price=price1, stop_price=price2),指定限价和止损价格
示例代码
# 卖出价值为10000元的平安银行股票
context.order_value(context.symbol('000001.SZA'), -10000)
# 买入价值为10000元的平安银行股票
context.order_value(context.symbol('000001.SZA'), 10000)
order_target_value
定义
order_target_value(asset, value, style=OrderType)
调整股票持有市值到预期目标的value 调整期货保证金仓位到预期目标的value
参数
asset – 标的,支持股票和期货 value – 交易金额, 正数表示买入, 负数表示卖出 style –(可选参数)指定下单类型,默认为市价单,可用的下单类型如下:
style=MarketOrder(),下市价单 style=StopOrder(stop_price),下止损单,通常用来止损或者锁定利润 style=LimitOrder(limit_price),下限价单,限定一个价格买入或卖出 style=StopLimitOrder(limit_price=price1, stop_price=price2),指定限价和止损价格
示例代码
# 预期平安银行持有市值为0,即卖出平安银行所有股票
context.order_target_value(context.symbol('000001.SZA'), 0)
# 调整平安银行股票持有市值到10000元市值,如果没有持有平安银行股票,则需要生成买入10000元平安银行的买单,如果已经持有4000元市值,那么只需生成买入6000元平安银行的买单。
context.order_target_value(context.symbol('000001.SZA'), 10000)
order_target_percent
定义
order_target_percent(asset, percent, style=OrderType)
调整股票仓位至占投资组合(股票+现金)总金额的一定百分比(percent)
参数
asset – 股票 value – 交易金额, 正数表示买入, 负数表示卖出 style –(可选参数)指定下单类型,默认为市价单,可用的下单类型如下:
style=MarketOrder(),下市价单 style=StopOrder(stop_price),下止损单,通常用来止损或者锁定利润 style=LimitOrder(limit_price),下限价单,限定一个价格买入或卖出 style=StopLimitOrder(limit_price=price1, stop_price=price2),指定限价和止损价格
示例代码
# 调整平安银行股票到投资组合10%市值仓位,如果目前投资组合价值10000元,那么生成的订单为买入1000元(10000*0.1)平安银行的股票。由于资产配置中多采用等权重配置,因此order_target_percent下单函数比较常用。
context.order_target_percent(context.symbol('000001.SZA'), 0.1)
# 卖出平安银行所有股票,当生成卖出全部股票的订单时,多使用如下这种方式。
context.order_target_percent(context.symbol('000001.SZA'), 0)
cancel_order
定义
cancel_order(order)
取消订单,支持股票和期货
参数
order – Order对象或者order_id
示例代码
# 在每个交易日开始之前, 将订单撤销
def before_trading_start(context):
# 得到当前未完成订单
for orders in context.get_open_orders().values():
# 循环,撤销订单
for _order in orders:
context.cancel_order(_order)
get_order
定义
get_order(order)
获取订单,支持股票和期货
参数
order – Order对象或者order_id
返回
Order对象
示例代码
order_object = context.order_target(sid, 100)
print('订单:', context.get_order(order_object))
get_open_orders
定义
get_open_order(sid=None)
获取未成交的订单,支持股票和期货
参数
sid – Equity 对象,为可选参数,如果缺省,则返回全部Order
返回
未成交的订单(挂单)- dict,key是order_id,value是Order对象
示例代码
# 每个交易日开始之前, 获取订单
def before_trading_start(context):
open_orders = context.get_open_orders()
update_order_amount
定义
update_order_amount(order)
更新订单,只支持从下单数量上进行更新,目前只支持股票
参数
order – Order对象或者order_id
示例代码
def handle_data(context, data):
sid = context.order(context.symbol('000002.SZA'), 100)
print('获取修改前订单: ', context.get_order(sid))
context.update_order_amount(sid, 200)
print('获取修改后订单: ', context.get_order(sid))
get_commission
定义
get_commission(security_code)
获取期货品种的手续费信息
参数
security_code – str 例如,'IF','M',或者['SR','RB']
返回
手续费信息 - tuple,分别代表开仓、平仓(包含平昨)、平今手续费
示例代码
def initialize(context):
context.set_commission(futures_commission=PerContract(cost={'RB':(0.000045,0.000045,0.000045)}))
print('查看手续费设置: ', context.get_commission('RB'))
get_datetime
定义
get_datetime()
获取当前时间,和data.current_dt作用一样
参数
(无)
返回
当前时间 - datetime
示例代码
def handle_data(context, data):
print('获取当前时间: ', context.get_datetime())
record
定义
record(*args, **kwargs)
记录函数,在交易执行时记录用户自定义数据,该数据存放在回测输出结果的 m.raw_perf中
参数
kwargs – 记录的名称及数值
示例代码
# 以平安银行为例
sid = context.symbol('000001.SZA')
# 获取最新价格
price = data.current(sid, 'price')
# 计算短周期均线
short_ma = data.history(sid, 'close', 5, '1d').mean()
# 计算长周期均线
long_ma = data.history(sid, 'close', 20, '1d').mean()
# 将最新价、短周期均线、长周期均线记录在m.raw_perf中以便查询和调用
record(short_ma=short_ma, long_ma=long_ma, price=price)
\