历史文档

【历史文档】策略回测-交易相关方法(context)

由bigquant创建,最终由small_q 被浏览 1009 用户

更新

本文内容对应旧版平台与旧版资源,其内容不再适合最新版平台,请查看新版平台的使用说明

新版量化开发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)

\

{link}