# 策略开发 API
# 基本方法
你的算法策略目前必须实现至少两个方法:init
和 handle_bar
,而before_trading
和after_trading
是可选择实现的方法。
# init (必须实现)
init(context)
初始化方法 - 在回测和实时模拟交易只会在启动的时候触发一次。你的算法会使用这个方法来设置你需要的各种初始化配置。
context
对象将会在你的算法的所有其他的方法之间进行传递以方便你可以拿取到。
参数
参数 类型 注释 context python 简单对象 将会在整个算法中当做一个全局变量来使用。属性通过点标记(".")来取到。
返回
无
范例
def init(context):
# cash_limit的属性是根据用户需求自己定义的,你可以定义无限多种自己随后需要的属性,ricequant的系统默认只是会占用context.portfolio的关键字来调用策略的投资组合信息
context.cash_limit = 5000
# handle_bar (必须实现)
handle_bar(context, bar_dict)
bar 数据的更新会自动触发该方法的调用。策略具体逻辑可在该方法内实现,包括交易信号的产生、订单的创建等。在实时模拟交易中,该函数在交易时间内会每分钟被触发一次。
注意:由于该方法会每分钟被触发,请尽量不要在该函数中放入查询类(如带有 query()参数的 API)代码以免运行时间过长,该类逻辑可放在 init() 中执行。
参数
参数 类型 注释 context python 简单对象 储存策略自定义参数、设置、仓位、投资组合信息的全局变量,属性通过点标记(".")来取到 bar_dict dict key 为 order_book_id,value 为 bar 数据。当前合约池内所有合约的 bar 数据信息都会更新在 bar_dict 里面
返回
无
范例
def handle_bar(context, bar_dict):
# put all your algorithm main logic here.
# ...
order_shares('000001.XSHE', 500)
# ...
# handle_tick
handle_tick(context, tick)
已订阅(subscribe)合约tick 数据的更新会自动触发该方法的调用。策略具体逻辑可在该方法内实现,包括交易信号的产生、订单的创建等。
参数
参数 类型 注释 context python 简单对象 储存策略自定义参数、设置、仓位、投资组合信息的全局变量,属性通过点标记(".")来取到 tick tick 已订阅合约的 tick 行情
返回
无
范例
def handle_tick(context, tick):
# put all your algorithm main logic here.
# ...
logger.info(tick.last)
# ...
# open_auction (选择实现)
open_auction(context, bar_dict)
可选择实现的函数。盘前集合竞价发生时会触发该函数的调用,在该函数内发出的订单会以当日开盘价被撮合。
参数
参数 类型 注释 context python 简单对象 储存策略自定义参数、设置、仓位、投资组合信息的全局变量,属性通过点标记(".")来取到 bar_dict dict key 为 order_book_id,value 为 bar 数据。当前合约池内所有合约的 bar 数据信息都会更新在 bar_dict 里面
返回
无
范例
def open_auction(context, bar_dict):
# put all your algorithm main logic here.
# ...
order_book_id = "000001.XSHE"
order_shares(order_book_id, 500)
# ...
# before_trading (选择实现)
before_trading(context)
可选择实现的函数。每天在策略开始交易前会被调用。**不能在这个函数中发送订单。**需要注意,该函数的触发时间取决于用户当前所订阅合约的交易时间。
举例来说,如果用户订阅的合约中存在有夜盘交易的期货合约,则该函数可能会在前一日的 20:30 触发,而不是早晨 08:00.
参数
参数 类型 注释 context python 简单对象 储存策略自定义参数、设置、仓位、投资组合信息的全局变量,属性通过点标记(".")来取到。
返回
无
范例
def before_trading(context):
# 拿取财务数据的逻辑
fundamental_df = get_factor(factor_names)
# 把查询到的财务数据保存到conext对象中
context.fundamental_df = fundamental_df
# 手动更新股票池
update_universe(context.fundamental_df.index.values)
# after_trading (选择实现)
after_trading(context)
可选择实现的函数。每天在收盘后被调用。**不能在这个函数中发送订单。**您可以在该函数中进行当日收盘后的一些计算。
在实时模拟交易中,该函数会在每天 15:30 触发。
参数
参数 类型 注释 context python 简单对象 储存策略自定义参数、设置、仓位、投资组合信息的全局变量,属性通过点标记(".")来取到。
返回
无
# 交易相关函数
# order_shares - 指定股数交易(股票专用)
order_shares(id_or_ins, amount, style=MarketOrder())
落指定股数的买/卖单,最常见的落单方式之一。如有需要落单类型当做一个参量传入,如果忽略掉落单类型,那么默认是市价单(market order)。
参数
参数 类型 注释 id_or_ins str 或 instrument 对象 order_book_id 或 symbol 或 instrument 对象,用户必须指定 amount float-required 需要落单的股数。正数代表买入,负数代表卖出。将会根据一手 xx 股来向下调整到一手的倍数,比如中国 A 股就是调整成 100 股的倍数。 style OrderType 订单类型,默认是市价单。目前支持的订单类型有:
- style=MarketOrder()
- style=LimitOrder(limit_price)
返回
Order 对象
范例
- 购买 Buy 2000 股的平安银行股票,并以市价单发送:
order_shares('000001.XSHE', 2000)
- 卖出 2000 股的平安银行股票,并以市价单发送:
order_shares('000001.XSHE', -2000)
- 购买 1000 股的平安银行股票,并以限价单发送,价格为¥ 10:
order_shares('000001.XSHE', 1000, style=LimitOrder(10))
# order_lots - 指定手数交易(股票专用)
order_lots(id_or_ins, amount, style=OrderType)
指定手数发送买/卖单。如有需要落单类型当做一个参量传入,如果忽略掉落单类型,那么默认是市价单(market order)。
参数
参数 类型 注释 id_or_ins str或 instrument 对象 order_book_id 或 symbol 或 instrument 对象,用户必须指定 amount float 多少手的数目。正数表示买入,负数表示卖出,用户必须指定 style OrderType 订单类型,默认是市价单。目前支持的订单类型有:
- style=MarketOrder
- style=LimitOrder(limit_price)
返回
Order 对象
范例
- 买入 20 手的平安银行股票,并且发送市价单:
order_lots('000001.XSHE', 20)
- 买入 10 手平安银行股票,并且发送限价单,价格为¥ 10:
order_lots('000001.XSHE', 10, style=LimitOrder(10))
# order_value - 指定价值交易(股票专用)
order_value(id_or_ins, cash_amount, style=OrderType)
使用想要花费的金钱买入/卖出股票,而不是买入/卖出想要的股数,正数代表买入,负数代表卖出(暂不支持卖空)。股票的股数总是会被调整成对应的 100 的倍数(在 A 中国 A 股市场 1 手是 100 股)。当您提交一个卖单时,该方法代表的意义是您希望通过卖出该股票套现的金额。如果金额超出了您所持有股票的价值,那么您将卖出所有股票。需要注意,如果资金不足,该 API 将不会创建发送订单。
参数
参数 类型 注释 id_or_ins str或 instrument 对象 order_book_id 或 symbol 或 instrument 对象,用户必须指定 cash_amount float 需要花费现金购买/卖出证券的数目。正数代表买入,负数代表卖出,用户必须指定 style OrderType 订单类型,默认是市价单。目前支持的订单类型有:
- style=MarketOrder()
- style=LimitOrder(limit_price)
返回
Order 对象
范例
- 买入价值¥ 10000 的平安银行股票,并以市价单发送。如果现在平安银行股票的价格是¥ 7.5,那么下面的代码会买入 1300 股的平安银行,因为少于 100 股的数目将会被自动删除掉:
order_value('000001.XSHE', 10000)
- 卖出价值¥ 10000 的现在持有的平安银行:
order_value('000001.XSHE', -10000)
# order_percent - 一定比例下单(股票专用)
order_percent(id_or_ins, percent, style=OrderType)
发送一个等于目前投资组合价值(市场价值和目前现金的总和)一定百分比的买/卖单,正数代表买,负数代表卖(暂不支持卖空)。股票的股数总是会被调整成对应的一手的股票数的倍数(1 手是 100 股)。百分比是一个小数,并且小于 1(<100%),0.5 表示的是 50%.需要注意,百分比不能为 1,因为下单时手续费将会计入下单金额中。当买入股票所需金额加上手续费大于资金时,该 API 将不会创建发送订单。
参数
参数 类型 注释 id_or_ins str或 instrument 对象 order_book_id 或 symbol 或 instrument object,用户必须指定 percent float 占有现有的投资组合价值的百分比。正数表示买入,负数表示卖出。用户必须指定 style OrderType 订单类型,默认是市价单。目前支持的订单类型有:
- style=MarketOrder()
- style=LimitOrder(limit_price)
返回
Order 对象
范例
- 买入等于现有投资组合 50%价值的平安银行股票。如果现在平安银行的股价是¥ 10/股并且现在的投资组合总价值是¥ 4000,用来买入的资金为¥ 2000,那么将会买入 200 股的平安银行股票。(不包含交易成本和滑点的损失):
order_percent('000001.XSHE', 0.5)
# order_target_value - 目标价值下单(股票专用)
order_target_value(id_or_ins, cash_amount, style=OrderType)
买入/卖出并且自动调整该证券的仓位到一个目标价值(暂不支持卖空)。如果还没有任何该证券的仓位,那么会买入全部目标价值的证券。如果已经有了该证券的仓位,则会买入/卖出调整该证券的现在仓位和目标仓位的价值差值的数目的证券。需要注意,如果资金不足,该 API 将不会创建发送订单。
参数
参数 类型 注释 id_or_ins str或 instrument 对象 order_book_id 或 symbol 或 instrument object,用户必须指定 cash_amount float-required 最终的该证券的仓位目标价值 style OrderType 订单类型,默认是市价单。目前支持的订单类型有:
- style=MarketOrder()
- style=LimitOrder(limit_price)
返回
Order 对象
范例
- 如果现在的投资组合中持有价值¥ 3000 的平安银行股票的仓位并且设置其目标价值为¥ 10000,以下代码范例会发送价值¥ 7000 的平安银行的买单到市场。(向下调整到最接近每手股数即 100 的倍数的股数):
order_target_value('000001.XSHE', 10000)
# order_target_percent - 目标比例下单(股票专用)
order_target_percent(id_or_ins, percent, style=OrderType)
买入/卖出证券以自动调整该证券的仓位到占有一个指定的投资组合的目标百分比(暂不支持卖空)。
- 如果投资组合中没有任何该证券的仓位,那么会买入等于现在投资组合总价值的目标百分比的数目的证券。
- 如果投资组合中已经拥有该证券的仓位,那么会买入/卖出目标百分比和现有百分比的差额数目的证券,最终调整该证券的仓位占据投资组合的比例至目标百分比。
其实我们需要计算一个 position_to_adjust (即应该调整的仓位)
position_to_adjust = target_position - current_position
投资组合价值等于所有已有仓位的价值和剩余现金的总和。买/卖单会被下舍入一手股数(A 股是 100 的倍数)的倍数。目标百分比应该是一个小数,并且最大值应该<=1,比如 0.5 表示 50%。
如果position_to_adjust
计算之后是正的,那么会买入该证券,否则会卖出该证券。
需要注意,如果资金不足,该 API 将不会创建发送订单。
参数
参数 类型 注释 id_or_ins str或 instrument 对象 order_book_id 或 symbol 或 instrument object,用户必须指定 percent float-required 仓位最终所占投资组合总价值的目标百分比。 style OrderType 订单类型,默认是市价单。目前支持的订单类型有:
- style=MarketOrder()
- style=LimitOrder(limit_price)
返回
Order 对象
范例
- 如果投资组合中已经有了平安银行股票的仓位,并且占据目前投资组合的 10%的价值,那么以下代码会买入平安银行股票最终使其占据投资组合价值的 15%:
order_target_percent('000001.XSHE', 0.15)
# buy_open - 买开(期货专用)
buy_open(id_or_ins, amount, price=None, style=None)
买入开仓。
参数
参数 类型 注释 id_or_ins str 或 instrument 对象 order_book_id 或 symbol 或 instrument 对象 amount float 下单的手数 price float 下单价格,默认为 None,表示市价单,填写价格则代表限价单。此参数主要用于简化 style 参数 style OrderType 订单类型,默认是市价单。目前支持的订单类型有:
- style=MarketOrder()
- style=LimitOrder(limit_price)
返回
Order 对象
范例
- 以价格为 3500 的限价单开仓买入 2 张上期所 AG1607 合约:
buy_open('AG1607', amount=2, price=3500)
# sell_close - 平多仓(期货专用)
sell_close(id_or_ins, amount, price=None, style=None, close_today=False)
平多仓。
参数
参数 类型 注释 id_or_ins str 或 instrument 对象 order_book_id 或 symbol 或 instrument 对象 amount float 下单的手数 price float 下单价格,默认为 None,表示市价单,填写价格则代表限价单。此参数主要用于简化 style 参数 style OrderType 订单类型,默认是市价单。目前支持的订单类型有:
- style=MarketOrder()
- style=LimitOrder(limit_price)
close_today bool 是否为平今单。默认为 False。上期所对于平今仓需要显式设置平今为 True
返回
Order 对象 或 order list
注意,当前持仓如果包含昨仓与今仓,平仓时候默认按照先进先出的规则,函数可能存在返回 order list 的情况。
例如,目前持仓多方向 8 张,其中昨仓 3 今仓 5。如果平仓 4 张,按照先进先出原则,此时策略框架会创建两个平仓单,一个平 3 张昨仓,一个平 1 张今仓。
# sell_open - 卖开(期货专用)
sell_open(id_or_ins, amount, price=None, style=None)
卖出开仓。
参数
参数 类型 注释 id_or_ins str 或 instrument 对象 order_book_id 或 symbol 或 instrument 对象 amount float 下单的手数 price float 下单价格,默认为 None,表示市价单,填写价格则代表限价单。此参数主要用于简化 style 参数 style OrderType 订单类型,默认是市价单。目前支持的订单类型有:
- style=MarketOrder()
- style=LimitOrder(limit_price)
返回
Order 对象
# buy_close - 平空仓(期货专用)
buy_close(id_or_ins, amount, price=None, style=None, close_today=False)
平空仓。
参数
参数 类型 注释 id_or_ins str或instrument 对象 order_book_id 或 symbol 或 instrument 对象 amount float 下单的手数 price float 下单价格,默认为 None,表示市价单,填写价格则代表限价单。此参数主要用于简化 style 参数 style OrderType 订单类型,默认是市价单。目前支持的订单类型有:
- style=MarketOrder()
- style=LimitOrder(limit_price)
close_today bool 是否为平今单。默认为 False。上期所对于平今仓需要显式设置平今为 True
返回
Order 对象 或 order list
注意,当前持仓如果包含昨仓与今仓,平仓时候默认按照先进先出的规则,函数可能存在返回 order list 的情况。
例如,目前持仓多方向 8 张,其中昨仓 3 今仓 5。如果平仓 4 张,按照先进先出原则,此时策略框架会创建两个平仓单,一个平 3 张昨仓,一个平 1 张今仓。
范例
- 市价单将现有 IF1603 空仓买入平仓 2 张:
buy_close('IF1603', 2)
# cancel_order - 撤单
cancel_order(order)
参数
参数 类型 注释 order Order 需要撤销的 order 对象,用户必须指定
返回
无
# get_open_orders - 拿到未成交订单信息
get_open_orders()
获取一个 order 对象的 list,凡在此 list 中的 order 都未被完全成交或取消。
参数
无
返回
list of Orders, 当前所有活跃的订单(未全部成交,未被撤单)。
# exercise -行权
exercise(id_or_ins, amount, convert=False)
行权。针对期权、可转债等含权合约,行使合约权利方被赋予的权利。
参数
参数 类型 注释 id_or_ins str或instrument 对象 行权合约,order_book_id 或 symbol 或 instrument 对象 amount int 参与行权的合约数量 convert bool 是否为转股(转债行权时可用)
返回
范例
# 行使一张豆粕1905购2350的权力
exercise("M1905C2350", 1)
# get_position - 持仓查询
get_position(order_book_id, direction)
查询指定合约、方向的仓位信息和策略收益信息。
参数
参数 类型 注释 order_book_id str 合约代码 direction POSITION_DIRECTION 持仓多空方向, 如股票仓位查询, 请填写 POSITION_DIRECTION.LONG
返回
POSITION 对象。注意, 如果当前策略并未持有该合约仓位, 仍然会返回持仓对象, 但仓位数量、开仓均价等字段都为 0
范例
def init(context):
# 使用关键字 g 保存全局变量
context.count = 0
context.s1 = '000001.XSHE'
def handle_bar(context, bar_dict):
# 打印持仓信息
print(get_position(context.s1, POSITION_DIRECTION.LONG))
if context.count == 0:
px = bar_dict[context.s1].last + 0.2
submit_order(context.s1, amount=100, side=SIDE.BUY, price=px)
context.count += 1
# get_positions - 全量持仓查询
get_positions()
查询当前策略全部持仓列表及对应的收益信息。
参数
无
返回
position list 注意, 如果当前策略无任何持仓, 则 list 为空。
# context 属性
# now - 当前时间
context.now
使用以上的方式就可以在handle_bar
中拿到当前的 bar 的时间,比如 day bar 的话就是那天的时间,minute bar 的话就是这一分钟的时间点。
返回数据类型为 datetime.datetime
# portfolio - 投资组合信息
context.portfolio
该投资组合在单一股票或期货策略中分别为股票投资组合和期货投资组合。在股票+期货的混合策略中代表汇总之后的总投资组合。请参考 portfolio
# stock_account - 股票资金账户信息
context.stock_account
获取股票资金账户信息。请参考 stock_account
# future_account - 期货资金账户信息
context.future_account
获取期货资金账户信息。请参考 future_account
# run_info - 策略运行信息
context.run_info
属性 类型 注释 run_type RUN_TYPE RUN_TYPE.BACKTEST 表示当前策略在进行回测,RUN_TYPE.PAPER_TRADING 表示当前策略在进行实盘模拟 start_date datetime.date 策略的开始日期 end_date datetime.date 策略的结束日期 frequency str 策略频率,'1d'或'1m' stock_starting_cash float 股票账户初始资金 future_starting_cash float 期货账户初始资金 slippage float 滑点水平 margin_multiplier float 保证金倍率 commission_multiplier float 佣金倍率 benchmark str 基准合约代码 matching_type MATCHING_TYPE 撮合方式,MATCHING_TYPE.NEXT_BAR_OPEN 代表以下一 bar 开盘价撮合,MATCHING_TYPE.CURRENT_BAR_CLOSE 代表以当前 bar 收盘价撮合
# universe - 策略合约池
context.universe
在运行update_universe,subscribe或者unsubscribe的时候,合约池会被更新。
需要注意,合约池内合约的交易时间(包含股票的策略默认会在股票交易时段触发)是 handle_bar 被触发的依据。
# scheduler 定时器
# scheduler.run_daily - 每天运行
scheduler.run_daily(function)
每日运行一次指定的函数,只能在 init 内使用。
注意,schedule 一定在其对应时间点的 handle_bar 之前执行,如果定时运行函数运行时间较长,则中间的 handle_bar 事件将会被略过。
参数
参数 类型 注释 function function 使传入的 function
每日运行。注意,function 函数一定要包含(并且只能包含)context, bar_dict 两个输入参数
返回
无
范例
以下的范例代码片段是一个非常简单的例子,在每天交易开始时查询现在portfolio
中剩下的 cash 的情况:
#scheduler调用的函数需要包括context, bar_dict两个输入参数
def log_cash(context, bar_dict):
logger.info("Remaning cash: %r" % context.portfolio.cash)
def init(context):
#...
# 每天运行一次
scheduler.run_daily(log_cash)
# scheduler.run_weekly - 每周运行
scheduler.run_weekly(function, weekday=x, tradingday=t)
每周运行一次指定的函数,只能在 init 内使用。
注意:
tradingday
中的负数表示倒数。tradingday
表示交易日。如某周只有四个交易日,则此周的tradingday=4
与tradingday=-1
表示同一天。weekday
和tradingday
不能同时使用。
参数
参数 类型 注释 function function 使传入的 function
每日交易开始前运行。注意,function 函数一定要包含(并且只能包含)context, bar_dict 两个输入参数weekday int 1~5 分别代表周一至周五,用户必须指定 tradingday int 范围为[-5,1],[1,5] 例如,1 代表每周第一个交易日,-1 代表每周倒数第一个交易日,用户可以不填写
返回
无
范例
以下的代码片段非常简单,在每周二固定运行打印一下现在的portfolio
剩余的资金:
#scheduler调用的函数需要包括context, bar_dict两个参数
def log_cash(context, bar_dict):
logger.info("Remaning cash: %r" % context.portfolio.cash)
def init(context):
#...
# 每周二打印一下剩余资金:
scheduler.run_weekly(log_cash, weekday=2)
# 每周第二个交易日打印剩余资金:
#scheduler.run_weekly(log_cash, tradingday=2)
# scheduler.run_monthly - 每月运行
scheduler.run_monthly(function,tradingday=t)
每月运行一次指定的函数,只能在 init 内使用。
注意:
tradingday
的负数表示倒数。tradingday
表示交易日,如某月只有三个交易日,则此月的 tradingday=3 与 tradingday=-1 表示同一。
参数
参数 类型 注释 function function 使传入的 function
每日交易开始前运行。注意,function 函数一定要包含(并且只能包含)context, bar_dict 两个输入参数tradingday int 范围为[-23,1], [1,23] ,例如,1 代表每月第一个交易日,-1 代表每月倒数第一个交易日,用户必须指定
返回
无
范例
以下的代码片段非常简单的展示了每个月第一个交易日的时候我们进行一次财务数据查询,这样子会非常有用在一些根据财务数据来自动调节仓位股票组合的算法来说:
#scheduler调用的函数需要包括context, bar_dict两个参数
def query_fundamental(context, bar_dict):
# 查询revenue前十名的公司的股票并且他们的pe_ratio在25和30之间。
stocks = all_instruments('CS').order_book_id
fundamental_df = get_factor(stocks, ['pe_ratio', 'revenue'])
fundamental_df = fundamental_df[(fundamental_df['pe_ratio'] > 25) & (fundamental_df['pe_ratio'] < 30)]
fundamental_df = fundamental_df.sort_values(by='revenue', ascending=False).head(10).reset_index(1, drop=True)
# 将查询结果dataframe的fundamental_df存放在context里面以备后面只需:
context.fundamental_df = fundamental_df
# 实时打印日志看下查询结果,会有我们精心处理的数据表格显示:
logger.info(context.fundamental_df)
update_universe(context.fundamental_df.index.values)
# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
def init(context):
# 每月的第一个交易日查询以下财务数据,以确保可以拿到最新更新的财务数据信息用来调整仓位
scheduler.run_monthly(query_fundamental, tradingday=1)
# time_rule - 定时间运行
scheduler
还可以用来做定时间运行,比如在每天开盘后的一小时后或一分钟后定时运行,这里有很多种组合可以让您达到各种自己想要达到的定时运行的目的。
使用的方法是和上面的scheduler.run_daily
,scheduler.run_weekly
和scheduler.run_monthly
进行组合加入time_rule
来一起使用。
注意:
market_open
与market_close
都跟随中国 A 股交易时间进行设置,即 09:31~15:00。- 使用
time_rule
定时运行只会在分钟级别回测和实时模拟交易中有定义的效果,在日回测中只会默认依然在该天运行,并不能在固定的时间运行。 - 在分钟回测中如未指定
time_rule
,则默认在开盘后第一个分钟线运行,即 09:31 分, 等同于 market_open(minute=0, hour=0)。 - 如果两个
schedule
,分别使用market_open
与market_close
规则,但规则触发时间在同一时刻,则market_open
的handle
一定在market_close
的handle
前执行。 - market_open(minute=119)将在 11:30 执行, market_open(minute=120)在 13:01 执行,中午休市的区间会被忽略。
- time_rule='before_trading'表示在开市交易前运行 scheduler 函数。该函数运行时间将在 before_trading 函数运行完毕之后 handle_bar 运行之前。
参数
参数 类型 注释 time_rule market_open, market_close, str 定时具体几点几分运行某个函数。time_rule='before_trading' 表示开始交易前运行;market_open(hour=x, minute=y)表示 A 股市场开市后 x 小时 y 分钟运行,market_close(hour=x, minute=y)表示 A 股市场收市前 x 小时 y 分钟运行。如果不设置 time_rule
默认的值是中国 A 股市场开市后一分钟运行。
market_open, market_close 参数如下:
参数 类型 注释 hour int - option [1,4] 具体在 market_open/market_close 后/前第多少小时执行, 股票的交易时间为[9:31 - 11:30],[13:01 - 15:00]共 240 分钟,所以 hour 的范围为 [1,4] minute int - option [0,239] 具体在 market_open/market_close 的后/前第多少分钟执行,同上,股票每天交易时间 240 分钟,minute 的范围为 [0,239],中午休市的时间区间会被忽略
返回
无
范例
- 每天的开市后 10 分钟(股票即 9:41)运行:
scheduler.run_daily(function, time_rule=market_open(minute=10))
- 每周的第 t 个交易日闭市前 1 小时运行:
scheduler.run_weekly(function, tradingday=t, time_rule=market_close(hour=1))
- 每月的第 t 个交易日开市后 1 小时运行:
scheduler.run_monthly(function, tradingday=t, time_rule=market_open(hour=1))
- 每天开始交易前运行:
scheduler.run_daily(function, time_rule='before_trading')
# 数据查询相关函数
# get_pit_financials_ex - 查询季度财务信息(point-in-time 形式)
get_pit_financials_ex(order_book_ids, fields, count, statements='latest')
以给定 N 个报告期回溯的方式获取过去 N 个季度基础财务数据(三大表),即利润表(income_statement),资产负债表(balance_sheet),现金流量表(cash_flow_statement)。
参数
参数 | 类型 | 说明 |
---|---|---|
fields | list | 需要返回的财务字段。支持的字段仅限三大基础财报,具体可以参看财务数据页介绍。 |
count | int | 往前追朔多少期财报数据,例如填 2 代表站在回测日期往前追朔 3 个报告期的数据;填 0,返回最近一期的数据,该参数必填 。 |
order_book_ids | str or str list | 合约代码,可传入 order_book_id, order_book_id list ,该参数必填。 |
statements | str | 基于查询日期,返回某一个报告期的所有记录或最新一条记录,设置 statements 为 all 时返回所有记录,statements 等于 latest 时返回最新的一条记录,默认为 latest. |
返回
pandas DataFrame
固定字段 | 类型 | 说明 |
---|---|---|
fields | list | 需要返回的财务字段。支持的字段仅限三大基础财报,具体可以参看财务数据页介绍。 |
if_adjusted | int | 是否为非当期财报数据, 0 代表当期,1 代表非当期(比如 18 年的财报会披露本期和上年同期的数值,17 年年报的财务数值在 18 年年报中披露的记录则为非当期, 17 年年报的财务数值在 17 年年报中披露则为当期。 |
quarter | str | 报告期 |
info_date | str | 公告发布日 |
范例
- 获取股票最近一个报告期的 revenue、net_profit 数据
[In]
get_pit_financials_ex(fields=['revenue','net_profit'], count=0,order_book_ids=['000001.XSHE'],statements='latest')
[Out]
info_date net_profit revenue net_profit
order_book_id quarter
000001.XSHE 2015q4 2017-03-17 2.186500e+10 9.616300e+10
# get_factor - 获取因子
get_factor(order_book_ids, factors,count=1,universe=None,expect_df=False)
获取股票截止 T-1 日的因子数据,包括财务因子、alpha101 因子、技术指标 等。
参数
参数 | 类型 | 说明 |
---|---|---|
order_book_ids | str or str list | 合约代码,可传入 order_book_id, order_book_id list |
factors | str or str list | 因子名称,可查询 rqdatac.get_all_factor_names() 得到所有有效因子字段 |
count | int | 默认为 1,获取多少个交易日的数据 |
universe | str | 当获取界面因子时,universe 指定了因子计算时的股票池 |
expect_df | bool | 默认为 False,当设置为 True 时,返回 multi-index DataFrame。 |
返回
pandas DataFrame
范例
def init(context):
# 查询revenue前十名的公司的股票并且他们的pe_ratio在55和60之间。
stocks = all_instruments('CS').order_book_id
fundamental_df=get_factor(stocks,['pe_ratio','revenue'])
fundamental_df = fundamental_df[(fundamental_df['pe_ratio'] > 55) & (fundamental_df['pe_ratio'] < 60)]
fundamental_df = fundamental_df.sort_values(by='revenue', ascending=False).head(10).reset_index(1,drop=True)
# 将查询结果dataframe的fundamental_df存放在context里面以备后面只需:
context.fundamental_df = fundamental_df
# 实时打印日志看下查询结果,会有我们精心处理的数据表格显示:
logger.info(context.fundamental_df)
update_universe(context.fundamental_df.index.values)
# all_instruments - 所有合约基础信息
all_instruments(type=None)
获取某个国家市场的所有合约信息。使用者可以通过这一方法很快地对合约信息有一个快速了解,目前仅支持中国市场。
参数
参数 类型 说明 type str 需要查询合约类型,例如:type='CS'代表股票。默认是所有类型
其中 type 参数传入的合约类型和对应的解释如下:
合约类型 说明 CS Common Stock, 即股票 ETF Exchange Traded Fund, 即交易所交易基金 LOF Listed Open-Ended Fund,即上市型开放式基金 (以下分级基金已并入) INDX Index, 即指数 Future Futures,即期货,包含股指、国债和商品期货 Spot Spot,即现货,目前包括上海黄金交易所现货合约 Option 期权,包括目前国内已上市的全部期权合约 Convertible 沪深两市场内有交易的可转债合约
返回
pandas DataFrame - 所有合约的基本信息。
范例
- 获取中国市场所有上市型开放式基金的基础信息:
[In]all_instruments('LOF')
[Out]
abbrev_symbol order_book_id product sector_code symbol
0 CYGA 150303.XSHE null null 华安创业板50A
1 JY500A 150088.XSHE null null 金鹰500A
2 TD500A 150053.XSHE null null 泰达稳健
3 HS500A 150110.XSHE null null 华商500A
4 QSAJ 150235.XSHE null null 鹏华证券A
...
提示
个人版用户使用all_instruments()
时若不指定type
参数会因为没有期权/可转债/现货数据权限报错
# instruments - 合约详细信息
instruments(id_or_symbols)
获取某个国家市场内一个或多个合约最新的详细信息。目前仅支持中国市场。
参数
参数 类型 说明 id_or_symbols str OR str list 合约代码或合约代码列表,可传入 order_book_id, order_book_id list。中国市场的 order_book_id 通常类似'000001.XSHE'。需要注意,国内股票、ETF、指数合约代码分别应当以'.XSHG'或'.XSHE'结尾,前者代表上证,后者代表深证。
比如查询平安银行这个股票合约,则键入'000001.XSHE',前面的数字部分为交易所内这个股票的合约代码,后半部分为对应的交易所代码。
期货则无此要求
返回
一个Instrument 对象,或一个 instrument list。
目前系统并不支持跨国家市场的同时调用。传入 order_book_id list 必须属于同一国家市场,不能混合着中美两个国家市场的 order_book_id。请注意,在回测和模拟交易中使用 instruments 返回的都是合约的最新信息。
范例
- 获取单一股票合约的详细信息:
[In]instruments('000001.XSHE')
[Out]
Instrument(order_book_id=000001.XSHE, symbol=平安银行, abbrev_symbol=PAYH, listed_date=19910403, de_listed_date=null, board_type=MainBoard, sector_code_name=金融, sector_code=Financials, round_lot=100, exchange=XSHE, special_type=Normal, status=Active)
- 获取多个股票合约的详细信息:
[In]instruments(['000001.XSHE', '000024.XSHE'])
[Out]
[Instrument(order_book_id=000001.XSHE, symbol=平安银行, abbrev_symbol=PAYH, listed_date=19910403, de_listed_date=null, board_type=MainBoard, sector_code_name=金融, sector_code=Financials, round_lot=100, exchange=XSHE, special_type=Normal, status=Active), Instrument(order_book_id=000024.XSHE, symbol=招商地产, abbrev_symbol=ZSDC, listed_date=19930607, de_listed_date=null, board_type=MainBoard, sector_code_name=金融, sector_code=Financials, round_lot=100, exchange=XSHE, special_type=Normal, status=Active)]
- 获取合约已上市天数:
instruments('000001.XSHE').days_from_listed()
- 获取合约距离到期天数:
instruments('IF1701').days_to_expire()
# history_bars - 某一合约历史数据
history_bars(order_book_id, bar_count, frequency, fields=None, skip_suspended=True, include_now=False)
获取指定合约的历史行情,同时支持日以及分钟历史数据。不能在 init 中调用。
参数
参数 类型 注释 order_book_id str 合约代码,必填项 bar_count int 获取的历史数据数量,必填项 frequency str 获取数据什么样的频率进行。'1d'或'1m'分别表示每日和每分钟,必填项。您可以指定不同的分钟频率,例如'5m'代表 5 分钟线 fields str OR str list 返回数据字段。必填项。见下方列表 skip_suspended bool 是否跳过停牌,默认 True,跳过停牌 include_now bool 是否包括不完整的 bar 数据。默认为 False,不包括。举例来说,在 09:39 的时候获取上一个 5 分钟线,默认将获取到 09:31~09:35 合成的 5 分钟线。如果设置为 True,则将获取到 09:36~09:39 之间合成的"不完整"5 分钟线 adjust_type str 复权方式,默认为 pre
。
不复权 -none
,
动态前复权 -pre
,后复权 -post
fields | 字段名 |
---|---|
open | 开盘价 |
high | 最高价 |
low | 最低价 |
close | 收盘价 |
volume | 成交量 |
total_turnover | 成交额 |
datetime | int 类型时间戳 |
open_interest | 持仓量(期货专用) |
settlement | 结算价(期货日线专用) |
prev_settlement | 结算价(期货日线专用) |
返回
ndarray ,方便直接与 talib 等计算库对接,效率较 history 返回的 DataFrame 更高。
范例
- 获取最近 5 天的日线收盘价序列(策略当前日期为 20160706)
[In]
logger.info(history_bars('000002.XSHE', 5, '1d', 'close'))
[Out]
[ 8.69 8.7 8.71 8.81 8.81]
- 获取最近 2 个 5 分钟 bar 数据时间戳以及成交量(策略当前日期为 2015-02-10)
[In]
logger.info('INCLUDE NOW')
logger.info(history_bars(context.s1, 2, '5m', ['datetime','volume'],include_now=True))
logger.info('NO INCLUDE NOW')
logger.info(history_bars(context.s1, 2, '5m', ['datetime','volume'],include_now=False))
[Out]
2016-07-01 09:31:00.00 INFO INCLUDE NOW
2016-07-01 09:31:00.00 INFO [(20160630150000, 1420219) (20160701093100, 665317)]
2016-07-01 09:31:00.00 INFO NO INCLUDE NOW
2016-07-01 09:31:00.00 INFO [(20160630145500, 654006) (20160630150000, 1420219)]
注:
- bar 数据为切片数据,例如当前时间为 12:00,使用
history_bars(context.s1,3,'60m','close',include_now=True)
,获取到的是(9:30,10:30],(10:30,11:30],(11:30,12:00]三个时间段的数据(切片是从开盘计算)。 - 对于获取日线数据,期货指数连续合约(99 结尾合约)在盘中实时行情的场景下将只能获取截止到上一交易日的数据,无法获取当天截止到当前的日线数据;其他合约则无此限制。
# history_ticks - 某一合约历史 tick 数据
history_ticks(order_book_id, count)
获取指定合约的历史 tick 行情。只能在 handle_tick 中调用。
参数
参数 类型 注释 order_book_id str 合约代码,必填项 count int 获取的历史 tick 数据数量,必填项
返回
list tick 数据的列表。
范例
[In]
logger.info(history_ticks('TF1803', 2))
[Out]
2017-12-25 09:14:00.300000 INFO [Tick(ask_vols: [1.0], asks: [96.640000000000001], bid_vols: [1.0], bids: [96.635000000000005], datetime: 2017-12-22 15:34:34.700000, high: 96.64, last: 96.64, limit_down: 95.27, limit_up: 97.58, low: 96.425, open: 96.47, open_interest: 46121.0, order_book_id: TF1803, prev_close: 96.64, prev_settlement: 96.425, total_turnover: 7463149750.0, volume: 7729.0), Tick(ask_vols: [1.0], asks: [96.599999999999994], bid_vols: [1.0], bids: [96.579999999999998], datetime: 2017-12-25 09:14:00.300000, high: 96.6, last: 96.6, limit_down: 95.445, limit_up: 97.755, low: 96.6, open: 96.6, open_interest: 46115.0, order_book_id: TF1803, prev_close: 96.64, prev_settlement: 96.6, total_turnover: 8694000.0, volume: 9.0)]
# get_price - 合约历史数据
get_price(order_book_ids, start_date, end_date=None, frequency='1d', fields=None, adjust_type='pre', skip_suspended=False,expect_df=False)
获取指定合约或合约列表的历史行情(包含起止日期,日线或分钟线),不能在'handle_bar'函数中进行调用。
注意, 这一函数主要是为满足在研究平台编写策略习惯而引入。在编写策略中,使用history_bars进行数据获取会更方便。
参数
参数 类型 说明 order_book_ids str OR str list 合约代码,合约代码,可传入 order_book_id, order_book_id list start_date str, datetime.date, datetime.datetime, pandasTimestamp 开始日期,用户必须指定 end_date str, datetime.date, datetime.datetime, pandasTimestamp 结束日期,默认为策略当前日期前一天 frequency str 历史数据的频率。 现在支持日/分钟级别的历史数据,默认为'1d'。使用者可自由选取不同频率,例如'5m'代表 5 分钟线 fields str OR str list 返回字段名称 adjust_type str 权息修复方案。前复权 - pre
,后复权 -post
,不复权 -none
。skip_suspended bool 是否跳过停牌数据。默认为 False,不跳过,用停牌前数据进行补齐。True 则为跳过停牌期。注意,当设置为 True 时,函数 order_book_id 只支持单个合约传入 expect_df bool 默认返回原有的 Panel 数据结构。如果调为真,则返回 pandas dataframe
返回
pandas Panel/DataFrame/Series
- 传入一个 order_book_id,多个 fields,函数会返回一个pandas DataFrame
- 传入一个 order_book_id,一个 field,函数会返回pandas Series
- 传入多个 order_book_id,一个 field,函数会返回一个pandas DataFrame
- 传入多个 order_book_id,函数会返回一个pandas Panel
参数 类型 说明 open float 开盘价 close float 收盘价 high float 最高价 low float 最低价 limit_up float 涨停价 limit_down float 跌停价 total_turnover float 总成交额 volume float 总成交量 settlement float 结算价 (仅限期货日线数据) prev_settlement float 昨日结算价(仅限期货日线数据) open_interest float 累计持仓量(期货专用) trading_date pandasTimeStamp 交易日期(仅限期货分钟线数据),对应期货夜盘的情况
范例
- 获取单一股票历史日线行情(返回pandas DataFrame):
[In]get_price('000001.XSHE', start_date='2015-04-01', end_date='2015-04-12')
[Out]
open close high low total_turnover volume limit_up limit_down
2015-04-01 10.7300 10.8249 10.9470 10.5469 2.608977e+09 236637563.0 11.7542 9.6177
2015-04-02 10.9131 10.7164 10.9470 10.5943 2.222671e+09 202440588.0 11.9102 9.7397
2015-04-03 10.6486 10.7503 10.8114 10.5876 2.262844e+09 206631550.0 11.7881 9.6448
2015-04-07 10.9538 11.4015 11.5032 10.9538 4.898119e+09 426308008.0 11.8288 9.6787
2015-04-08 11.4829 12.1543 12.2628 11.2929 5.784459e+09 485517069.0 12.5409 10.2620
2015-04-09 12.1747 12.2086 12.9208 12.0255 5.794632e+09 456921108.0 13.3684 10.9403
2015-04-10 12.2086 13.4294 13.4294 12.1069 6.339649e+09 480990210.0 13.4294 10.9877
...
# current_snapshot - 当前快照数据
current_snapshot(id_or_symbol)
获得当前市场快照数据。只能在日内交易阶段调用,获取当日调用时点的tick数据。市场快照数据记录了每日从开盘到当前的数据信息(集合竞价数据同样支持),可以理解为一个动态的 day bar 数据。在目前分钟回测中,快照数据为当日所有分钟线累积而成,一般情况下,最后一个分钟线获取到的快照数据应当与当日的日线行情保持一致。需要注意,在实盘模拟中,该函数返回的是调用当时的市场快照情况,所以在同一个 handle_bar 中不同时点调用可能返回的数据不同。如果当日截止到调用时候对应股票没有任何成交,那么 snapshot 中的 close, high, low 几个价格水平都将以 0 表示,而 last 将以最近的成交价表示。
参数
参数 类型 注释 id_or_symbol str 合约代码或简称
返回
调用时点的市场快照tick
范例
- 在 handle_bar 中调用该函数,假设策略当前时间是 20160104 09:33
[In]
logger.info(current_snapshot('000001.XSHE'))
[Out]
2016-01-04 09:33:00.00 INFO
Snapshot(order_book_id: '000001.XSHE', datetime: datetime.datetime(2016, 1, 4, 9, 33), open: 10.0, high: 10.025, low: 9.9667, last: 9.9917, volume: 2050320, total_turnover: 20485195, prev_close: 9.99)
# get_dominant_future - 期货主力合约
get_dominant_future(underlying_symbol,rule=0)
获取某一期货品种策略当前日期的主力合约代码。
合约首次上市时,以当日收盘同品种持仓量最大者作为从第二个交易日开始的主力合约。当同品种其他合约持仓量在收盘后超过当前主力合约 1.1 倍时,从第二个交易日开始进行主力合约的切换。日内不会进行主力合约的切换。合约品种详情请见交易费用 。
参数
参数 类型 说明 underlying_symbol str 期货合约品种,例如沪深 300 股指期货为'IF' rule str or int 默认是 rule=0,采用最大昨仓为当日主力合约,每个合约只能做一次主力合约,不会重复出现。针对股指期货,只在当月和次月选择主力合约。
当 rule=1 时,主力合约的选取只考虑最大昨仓这个条件。
返回
str - 主力合约 order_book_id
范例
- 获取某一天的主力合约代码(策略当前日期是 20160801)
[In]
get_dominant_future('IF')
[Out]
'IF1608'
# get_future_contracts - 期货可交易合约列表
get_future_contracts(underlying_symbol)
获取某一期货品种在策略当前日期的可交易合约 order_book_id 列表。按照到期月份,下标从小到大排列,返回列表中第一个合约对应的就是该品种的近月合约。
参数
参数 类型 说明 underlying_symbol str 期货合约品种,例如沪深 300 股指期货为'IF'
返回
str list - 当日可交易的 order_book_id list
范例
[In]
logger.info(get_future_contracts('IF'))
[Out]
['IF1612', 'IF1701', 'IF1703', 'IF1706']
# get_securities_margin - 融资融券信息
get_securities_margin(id_or_symbols, count=1, fields=None,expect_df=False)
获取融资融券信息。包括深证融资融券数据以及上证融资融券数据情况。既包括个股数据,也包括市场整体数据。需要注意,T 日的数据将在 T+1 日上午 09:00 左右更新,所以可能无法在 before_trading 阶段获取到上一交易日的最新数据。融资融券的开始日期为 2010 年 3 月 31 日。
参数
参数 类型 说明 id_or_symbols str or str list 可输入 order_book_id, order_book_id list。另外,输入'XSHG'或'sh'代表整个上证整体情况;'XSHE'或'sz'代表深证整体情况 count int 回溯获取的数据个数。默认为当前能够获取到的最近的数据 fields str OR str list 默认为所有字段。见下方列表 expect_df bool 默认返回原有的 Panel 数据结构。如果调为真,则返回 pandas dataframe
fields | 字段名 |
---|---|
margin_balance | 融资余额 |
buy_on_margin_value | 融资买入额 |
margin_repayment | 融资偿还额 |
short_balance | 融券余额 |
short_balance_quantity | 融券余量 |
short_sell_value | 融券卖出额 |
short_sell_quantity | 融券卖出量 |
short_repayment_quantity | 融券偿还量 |
total_balance | 融资融券余额 |
返回
- 多个 order_book_id,单个 field 的时候返回pandas DataFrame,index 为 date,column 为 order_book_id
- 单个 order_book_id,多个 fields 的时候返回pandas DataFrame,index 为 date,column 为 fields
- 单个 order_book_id,单个 field 返回pandas Series
- 多个 order_book_id,多个 fields 的时候返回pandas Panel
Items axis 为 fields
Major_axis axis 为时间戳
Minor_axis axis 为 order_book_id
范例
- 获取沪深两个市场一段时间内的融资余额
[In]
logger.info(get_securities_margin('510050.XSHG', count=5))
[Out]
margin_balance buy_on_margin_value short_sell_quantity margin_repayment short_balance_quantity short_repayment_quantity short_balance total_balance
2016-08-01 7.811396e+09 50012306.0 3597600.0 41652042.0 15020600.0 1645576.0 NaN NaN
2016-08-02 7.826381e+09 34518238.0 2375700.0 19532586.0 14154000.0 3242300.0 NaN NaN
2016-08-03 7.733306e+09 17967333.0 4719700.0 111043009.0 16235600.0 2638100.0 NaN NaN
2016-08-04 7.741497e+09 30259359.0 6488600.0 22068637.0 17499000.0 5225200.0 NaN NaN
2016-08-05 7.726343e+09 25270756.0 2865863.0 40423859.0 14252363.0 6112500.0 NaN NaN
- 获取沪深两个市场一段时间内的融资余额
[In]
logger.info(get_securities_margin(['XSHE', 'XSHG'], count=5, fields='margin_balance'))
[Out]
XSHE XSHG
2016-08-01 3.837627e+11 4.763557e+11
2016-08-02 3.828923e+11 4.763931e+11
2016-08-03 3.823545e+11 4.769321e+11
2016-08-04 3.833260e+11 4.776380e+11
2016-08-05 3.812751e+11 4.766928e+11
- 获取上证个股以及整个上证市场融资融券情况
[In]
logger.info(get_securities_margin(['XSHG', '601988.XSHG', '510050.XSHG'], count=5))
[Out]
<class 'pandas.core.panel.Panel'>
Dimensions: 8 (items) x 5 (major_axis) x 3 (minor_axis)
Items axis: margin_balance to total_balance
Major_axis axis: 2016-08-01 00:00:00 to 2016-08-05 00:00:00
Minor_axis axis: XSHG to 510050.XSHG
- 获取 50ETF 融资偿还额情况
[In]
logger.info(get_securities_margin('510050.XSHG', count=5, fields='margin_repayment'))
[Out]
2016-08-01 41652042.0
2016-08-02 19532586.0
2016-08-03 111043009.0
2016-08-04 22068637.0
2016-08-05 40423859.0
Name: margin_repayment, dtype: float64
# get_shares - 流通股信息
get_shares(id_or_symbols, count=1, fields=None,expect_df=False)
获取某只股票在一段时间内的流通情况。
参数
参数 类型 说明 id_or_symbols str 可输入 order_book_id, order_book_id list count int 回溯获取的数据个数。默认为当前能够获取到的最近的数据 fields str oR str list 默认为所有字段。见下方列表 expect_df bool 默认返回原有的 Panel 数据结构。如果调为真,则返回 pandas dataframe
fields | 字段名 |
---|---|
total | 总股本 |
circulation_a | 流通 A 股 |
management_circulation | 已流通高管持股 |
non_circulation_a | 非流通 A 股合计 |
total_a | A 股总股本 |
返回
- 多个 order_book_id,多个 fields 的时候返回pandas Panel
- 单个 order_book_id,多个 fields 的时候返回pandas DataFrame
- 单个 order_book_id,单个 field 返回pandas Series
范例
- 获取平安银行总股本数据
[In]
logger.info(get_shares('000001.XSHE', count=5, fields='total'))
[Out]
2016-08-01 1.717041e+10
2016-08-02 1.717041e+10
2016-08-03 1.717041e+10
2016-08-04 1.717041e+10
2016-08-05 1.717041e+10
Name: total, dtype: float64
# get_stock_connect - 沪深港通持股信息
get_stock_connect(id_or_symbols, count=1, fields=None,expect_df=False)
获取 A 股股票在香港上市交易的持股情况。
参数
参数 类型 说明 id_or_symbols str 可输入 order_book_id, order_book_id list,注这里输入的是 A 股编码 count int 回溯获取的数据个数。默认为当前能够获取到的最近的数据 fields str oR str list 默认为所有字段。见下方列表 expect_df bool 默认返回原有的 Panel 数据结构。如果调为真,则返回 pandas dataframe
fields 字段名 shares_holding 持股量 holding_ratio 持股比例
返回
- 多个 order_book_id,多个 fields 的时候返回pandas Panel
- 单个 order_book_id,多个 fields 的时候返回pandas DataFrame
- 单个 order_book_id,单个 field 返回pandas Series
范例
- 获取平安银行数据
[In]
logger.info(get_stock_connect('000001.XSHE', count=1, fields='shares_holding'))
[Out]
2018-05-10 414866956
Name: total, dtype: float64
# get_turnover_rate - 历史换手率
get_turnover_rate(id_or_symbols, count=1, fields=None,expect_df=False)
参数
参数 类型 说明 id_or_symbols str or str list 可输入 order_book_id, order_book_id list count int 回溯获取的数据个数。默认为当前能够获取到的最近的数据 fields str OR str list 默认为所有字段。见下方列表 expect_df bool 默认返回原有的 Panel 数据结构。如果调为真,则返回 pandas dataframe
fields | 字段名 |
---|---|
today | 当天换手率 |
week | 过去一周平均换手率 |
month | 过去一个月平均换手率 |
year | 过去一年平均换手率 |
current_year | 当年平均换手率 |
返回
- 如果只传入一个 order_book_id,多个 fields,返回pandas DataFrame
- 如果传入 order_book_id list,并指定单个 field,函数会返回一个pandas DataFrame
- 如果传入 order_book_id list,并指定多个 fields,函数会返回一个pandas Panel
范例
- 获取平安银行历史换手率情况
[In]
logger.info(get_turnover_rate('000001.XSHE', count=5))
[Out]
today week month three_month six_month year \
2016-08-01 0.5190 0.4478 0.3213 0.2877 0.3442 0.5027
2016-08-02 0.3070 0.4134 0.3112 0.2843 0.3427 0.5019
2016-08-03 0.2902 0.3460 0.3102 0.2823 0.3432 0.4982
2016-08-04 0.9189 0.4938 0.3331 0.2914 0.3482 0.4992
2016-08-05 0.4962 0.5031 0.3426 0.2960 0.3504 0.4994
current_year total
2016-08-01 0.3585 1.1341
2016-08-02 0.3570 1.1341
2016-08-03 0.3565 1.1339
2016-08-04 0.3604 1.1339
2016-08-05 0.3613 1.1338
# industry - 行业股票列表
industry(code)
获得属于某一行业的所有股票列表。
参数
参数 类型 注释 code str OR industry_code item 行业名称或行业代码。例如,农业可填写 industry_code.A01 或 'A01'
返回
获得属于某一行业的所有股票的 order_book_id list。
范例
def init(context):
stock_list = industry('A01')
logger.info("农业股票列表:" + str(stock_list))
得到的结果是:
INITINFO 农业股票列表:['600354.XSHG', '601118.XSHG', '002772.XSHE', '600371.XSHG', '600313.XSHG', '600672.XSHG', '600359.XSHG', '300143.XSHE', '002041.XSHE', '600762.XSHG', '600540.XSHG', '300189.XSHE', '600108.XSHG', '300087.XSHE', '600598.XSHG', '000998.XSHE', '600506.XSHG']
我们目前使用的行业分类来自于中国国家统计局的国民经济行业分类,可以使用这里的任何一个行业代码来调用行业的股票列表:
行业代码 | 行业名称 |
---|---|
A01 | 农业 |
A02 | 林业 |
A03 | 畜牧业 |
A04 | 渔业 |
A05 | 农、林、牧、渔服务业 |
B06 | 煤炭开采和洗选业 |
B07 | 石油和天然气开采业 |
B08 | 黑色金属矿采选业 |
B09 | 有色金属矿采选业 |
B10 | 非金属矿采选业 |
B11 | 开采辅助活动 |
B12 | 其他采矿业 |
C13 | 农副食品加工业 |
C14 | 食品制造业 |
C15 | 酒、饮料和精制茶制造业 |
C16 | 烟草制品业 |
C17 | 纺织业 |
C18 | 纺织服装、服饰业 |
C19 | 皮革、毛皮、羽毛及其制品和制鞋业 |
C20 | 木材加工及木、竹、藤、棕、草制品业 |
C21 | 家具制造业 |
C22 | 造纸及纸制品业 |
C23 | 印刷和记录媒介复制业 |
C24 | 文教、工美、体育和娱乐用品制造业 |
C25 | 石油加工、炼焦及核燃料加工业 |
C26 | 化学原料及化学制品制造业 |
C27 | 医药制造业 |
C28 | 化学纤维制造业 |
C29 | 橡胶和塑料制品业 |
C30 | 非金属矿物制品业 |
C31 | 黑色金属冶炼及压延加工业 |
C32 | 有色金属冶炼和压延加工业 |
C33 | 金属制品业 |
C34 | 通用设备制造业 |
C35 | 专用设备制造业 |
C36 | 汽车制造业 |
C37 | 铁路、船舶、航空航天和其它运输设备制造业 |
C38 | 电气机械及器材制造业 |
C39 | 计算机、通信和其他电子设备制造业 |
C40 | 仪器仪表制造业 |
C41 | 其他制造业 |
C42 | 废弃资源综合利用业 |
C43 | 金属制品、机械和设备修理业 |
D44 | 电力、热力生产和供应业 |
D45 | 燃气生产和供应业 |
D46 | 水的生产和供应业 |
E47 | 房屋建筑业 |
E48 | 土木工程建筑业 |
E49 | 建筑安装业 |
E50 | 建筑装饰和其他建筑业 |
F51 | 批发业 |
F52 | 零售业 |
G53 | 铁路运输业 |
G54 | 道路运输业 |
G55 | 水上运输业 |
G56 | 航空运输业 |
G57 | 管道运输业 |
G58 | 装卸搬运和运输代理业 |
G59 | 仓储业 |
G60 | 邮政业 |
H61 | 住宿业 |
H62 | 餐饮业 |
I63 | 电信、广播电视和卫星传输服务 |
I64 | 互联网和相关服务 |
I65 | 软件和信息技术服务业 |
J66 | 货币金融服务 |
J67 | 资本市场服务 |
J68 | 保险业 |
J69 | 其他金融业 |
K70 | 房地产业 |
L71 | 租赁业 |
L72 | 商务服务业 |
M73 | 研究和试验发展 |
M74 | 专业技术服务业 |
M75 | 科技推广和应用服务业 |
N76 | 水利管理业 |
N77 | 生态保护和环境治理业 |
N78 | 公共设施管理业 |
O79 | 居民服务业 |
O80 | 机动车、电子产品和日用产品修理业 |
O81 | 其他服务业 |
P82 | 教育 |
Q83 | 卫生 |
Q84 | 社会工作 |
R85 | 新闻和出版业 |
R86 | 广播、电视、电影和影视录音制作业 |
R87 | 文化艺术业 |
R88 | 体育 |
R89 | 娱乐业 |
S90 | 综合 |
# sector - 板块股票列表
sector(code)
获得属于某一板块的所有股票列表。
参数
参数 类型 注释 code str OR sector_code items 板块代码。例如,能源板块可填写'Energy'
返回
属于该板块的股票 order_book_id 或 order_book_id list.
范例
def init(context):
id = sector("ConsumerDiscretionary")
logger.info(id)
得到的结果是:
INIT INFO
['002045.XSHE', '603099.XSHG', '002486.XSHE', '002536.XSHE', '300100.XSHE', '600633.XSHG', '002291.XSHE', ..., '600233.XSHG']
目前支持的板块分类如下,其取值参考自 MSCI 发布的全球行业标准分类:
板块代码 | 中文板块名称 | 英文板块名称 |
---|---|---|
Energy | 能源 | energy |
Materials | 原材料 | materials |
ConsumerDiscretionary | 非必需消费品 | consumer discretionary |
ConsumerStaples | 必需消费品 | consumer staples |
HealthCare | 医疗保健 | health care |
Financials | 金融 | financials |
RealEstate | 房地产 | real estate |
InformationTechnology | 信息技术 | information technology |
TelecommunicationServices | 电信服务 | telecommunication services |
Utilities | 公共服务 | utilities |
Industrials | 工业 | industrials |
# get_instrument_industry - 获取股票行业分类
get_instrument_industry(order_book_ids,level=1,source="citics")
获得
参数
参数 类型 注释 order_book_jds str OR list 股票代码 source str 分类依据。 citics: 中信, gildata: 聚源 level integer 行业分类级别,共三级,默认返回一级分类。参数 0,1,2,3 一一对应,其中 0 返回三级分类完整情况
返回
所属合约的对应行业分类。
pandas DataFrame
范例
def init(context):
pass
def before_trading(context):
print(get_instrument_industry(["000001.XSHE","000002.XSHE"],level=1,source="citics"))
def handle_bar(context, bar_dict):
pass
得到的结果是:
2016-01-04 00:00:00 INFO first_industry_code first_industry_name
order_book_id
000001.XSHE 40 银行
000002.XSHE 42 房地产
2016-01-05 00:00:00 INFO first_industry_code first_industry_name
order_book_id
000001.XSHE 40 银行
000002.XSHE 42 房地产
# concept - 概念股票列表
concept(concept_name1, concept_name2, ...)
获取属于某个或某几个概念的股票列表。
参数
参数 类型 说明 concept_names str or 多个str 概念名称。可以从概念列表中选择一个或多个概念填写
返回
属于该概念的股票 order_book_id 或 order_book_id list.
范例
- 得到一个概念的股票列表:
[In]concept('民营医院')
[Out]
['600105.XSHG',
'002550.XSHE',
'002004.XSHE',
'002424.XSHE',
...]
- 得到某几个概念的股票列表:
[In]concept('民营医院', '国企改革')
[Out]
['601607.XSHG',
'600748.XSHG',
'600630.XSHG',
...]
概念列表
3D打印 3D玻璃 4G概念 5G概念 360私有化 AB股 AH股 BDI指数 IPV6 ITO导电玻璃
LED MLCC MSCI概念 O2O概念 OLED P2P概念 PET薄膜 PM2.5 PPP模式 QFII重仓
ST概念 S股 VA VB1 VC VD3 VE 一带一路 万达私有化 三七概念
三沙概念 三网融合 三聚氰胺 上海国资改革 上海房价上涨 上海自贸区 不锈钢概念 丙烯类 东盟自贸区 东莞房价上涨
丝绸之路 两桶油改革 中厚板 中央政务区 中字头 中山房价上涨 中成药 中药饮片 中超概念 中韩自贸区
临沂房价上涨 丹参概念 举牌概念 乙二醇概念 乳业 二胎概念 云计算 互联网+ 互联网金融 京津冀一体化
人免疫球蛋白概念 人凝血因子概念 人参概念 人工智能 人工牛黄概念 人民币贬值概念 人脑工程 人脸识别 人血白蛋白概念 休闲食品
低碳经济 体检与健康管理 体育产业 何首乌概念 佛山房价上涨 供应链金融 供热 保健酒 债转股 健康中国
充电桩 光伏概念 光伏电池 光学膜 光学镜头 免疫治疗 党参概念 兜底增持概念 全息技术 六味地黄
六氟磷酸锂 兰州房价上涨 共享单车 养老概念 养老金持股 军工 军民融合 农业现代化 农机 农村电商
冬虫夏草概念 冷轧 冷链物流 切片 创投 制冷剂 券商 前海概念 动力煤 化学制剂
化学原料药 北京冬奥会 北京房价上涨 北斗导航 区块链 医用医疗器械 医用耗材 医疗器械 医疗机构配套服务 医药中间体
医药工业配套服务 医药电商 医药设备和实验室工程 医院 单抗概念 单晶硅 南京房价上涨 南宁房价上涨 南昌房价上涨 南通房价上涨
印刷电路板(PCB) 厦门房价上涨 参股券商 参股新股 可燃冰 合同能源 合肥房价上涨 吉林房价上涨 含氟精细化工 含氟聚合物材料
呼和浩特房价上涨 咖啡因概念 哈尔滨房价上涨 唐山房价上涨 徐州房价上涨 微信小程序 快递 恒大概念 惠州房价上涨 成渝特区
啤酒 固废处理 国产软件 国企改革 土地流转 在线教育 地下管网 地热能 地黄概念 型材
型材(钢材) 基因工程药物 基因测序 塑料钞票 增强现实 壳资源 复合肥 大数据 大理房价上涨 大输液
大连房价上涨 大金融 大飞机 天津房价上涨 家用电器 宽带中国 尼龙66切片 尼龙薄膜 尾气治理 尿素
天津自贸区 天然气 天然气供应 太阳能 头孢 宁波房价上涨 安防 宜兴房价上涨 实体药店 家用医疗器械
川贝概念 工业4.0 工业导爆索 工业雷管 己二酸概念 布洛芬概念 常州房价上涨 广州房价上涨 廊坊房价上涨 建筑节能
彩票概念 成都房价上涨 房地产开发 房屋租赁 手游概念 振兴东北 摘帽 新零售 无人机 无人零售
数字电视 文化传媒 新三板 新型城镇化 新材料 新疆基建 新疆振兴 新股与次新股 新能源 新能源车
无人驾驶 无汞电解二氧化锰 无烟煤 棒材(钢材) 武汉房价上涨 民营医院 民营银行 氟化工 氧化铁 氧化锆
无线充电 无锡房价上涨 昆山房价上涨 普通电解二氧化锰 景点旅游 智慧停车 智慧城市 智能交通 智能医疗 智能家居
智能电网 智能电视 智能穿戴 智能音箱 有机硅类 期货概念 机器人概念 杀菌剂 杀虫剂 杭州亚运会
杭州房价上涨 杭州湾大湾区 板材 板材(钢材) 板蓝根概念 染料类 柴油 柴胡概念 核电 棉花
氨纶 水利建设 水泥 水电 汕头房价上涨 江苏国资改革 污水处理 汽油 汽车电子概念 沈阳房价上涨
沥青类 沪港通 油品升级 油改概念 油气设备服务 泉州房价上涨 济南房价上涨 海参 海口房价上涨 海峡西岸
海工装备 海洋经济 海绵城市 涤纶类 液晶面板 液氨 液碱 深圳国资改革 深圳房价上涨 深港通
湖州房价上涨 滨海新区 火电 炭黑概念 炸药 烟台房价上涨 烧碱 热轧 焦炭概念 焦煤
煤化工 煤改气 燃料乙醇 燃料电池 牛黄概念 物流电商平台 物联网 特斯拉 特色小镇 特钢概念
特高压 独家药品 猪 王者荣耀概念 环戊烷 环氧丙烷 玻璃基板 玻璃概念 玻璃纤维 玻纤类
珠海房价上涨 生态农业 生物医药 生物疫苗 生物质能 甲醇概念 电力改革 电商概念 电子信息 电子发票
电子竞技 疫苗 病毒防治 白炭黑 白酒 白银 白马股 盖板玻璃 石墨烯 石油
磁性材料 磷矿石 磷酸 磷酸盐 磷酸铁 磷铵 票交所 福州房价上涨 福建自贸区 禽流感
移动互联网 移动支付 稀土 稀土永磁 稀缺资源 管材 管材(钢材) 粘胶短纤 粘胶长丝 粤港澳自贸区
精对苯二甲酸(PTA) 糖 红参概念 红花概念 纯碱概念 线材(钢材) 绍兴房价上涨 维生素 网上药店 网红直播
网约车 网络安全 网络游戏 美丽中国 耐火材料 职业教育 联碱 联通混改 聚丙烯 聚氨酯
聚氨酯胶 聚氯乙烯 聚氯乙烯树脂 聚氯乙烯糊树脂 聚酯切片 聚酯薄膜 聚醚类 肉制品 股权冻结 股权转让
胶印油墨 能源互联网 腾讯概念 自来水 自由贸易港 航母概念 航空煤油 节能照明 节能环保 芜湖房价上涨
芯片概念 苏州房价上涨 苹果概念 茯苓概念 草甘膦 药品分销 葡萄酒 蓝宝石 虚拟现实 蚂蚁金服概念
蚌埠房价上涨 蛋氨酸 融资融券 螺纹钢 血塞(栓)通 血液制品 装配式建筑 西安房价上涨 西安自贸区 西洋参概念
覆铜板 触摸屏概念 证金持股 诊断试剂 语音技术 调味品 贵阳房价上涨 赛马概念 超导概念 超级品牌
超级电容 超细纤维类 足球概念 跨境电商 车联网 转融券标的 轮胎 连翘概念 迪士尼 送转预期
通用航空 郑州房价上涨 醋酸丁酯 重庆房价上涨 量子通信 金华房价上涨 金融IC 金融改革 金融机具 金银花概念
钒电池 钛白粉 钢坯 钨 钴 钼 铁精粉 铁路基建 铅 铜
铝 铝电解电容器 银川房价上涨 银杏叶概念 锂 锂电池概念 锂离子电解液 锂锰电解二氧化锰 锌 锡盐
锦纶丝类 锦纶切片 镇江房价上涨 镍 长春房价上涨 长沙房价上涨 阻燃树脂 阿胶概念 阿里概念 除草剂
雄安新区 集成电路 青岛房价上涨 青霉素类概念 靶材 页岩气 顺酐类 风电 风能 食品安全
饲料概念 驴皮概念 高校 高端装备 高送转 高铁 鸡 鸡尾酒 黄磷 黄芩概念
黄芪概念 黄连概念 黄酒 黄金 黄金水道 黑磷
# index_components - 指数成分股
index_components(order_book_id, date=None)
获取某一指数的股票构成列表,也支持指数的历史构成查询。
参数
参数 类型 说明 order_book_id str 指数代码,可传入 order_book_id date str, date, datetime, pandas Timestamp 查询日期,默认为策略当前日期。如指定,则应保证该日期不晚于策略当前日期
返回
构成该指数股票的 order_book_id list
范例
- 得到上证指数在策略当前日期的构成股票的列表:
[In]index_components('000001.XSHG')
[Out]['600000.XSHG', '600004.XSHG', ...]
# get_dividend - 分红数据
get_dividend(order_book_id, start_date)
获取某只股票到策略当前日期前一天的分红情况(包含起止日期)。
参数
参数 类型 说明 order_book_id str 可输入 order_book_id 或 symbol start_date str, date, datetime, pandasTimestamp 开始日期,用户必须指定,需要早于策略当前日期
返回
ndarray - 查询时间段内某个股票的分红数据
- declaration_announcement_date: 分红宣布日,上市公司一般会提前一段时间公布未来的分红派息事件
- book_closure_date: 股权登记日
- dividend_cash_before_tax: 税前分红
- ex_dividend_date: 除权除息日,该天股票的价格会因为分红而进行调整
- payable_date: 分红到帐日,这一天最终分红的现金会到账
- round_lot: 分红最小单位,例如:10 代表每 10 股派发 dividend_cash_before_tax 单位的税前现金
范例
- 获取平安银行 2013-01-04 到策略当前日期前一天的分红数据:
[In]
get_dividend('000001.XSHE', start_date='20130104')
[Out]
[(20130614, 20130619, 20130620, 20130620, 1.7 , 10)
(20140606, 20140611, 20140612, 20140612, 1.6 , 10)
(20150407, 20150410, 20150413, 20150413, 1.74, 10)]
# get_split - 拆分数据
get_split(order_book_id, start_date)
获取某只股票到策略当前日期前一天的拆分情况(包含起止日期)。
参数
参数 类型 说明 order_book_id str 证券代码,证券的独特的标识符,例如:'000001.XSHE' start_date str, date, datetime, pandasTimestamp 开始日期,用户必须指定,需要早于策略当前日期
返回
pandas DataFrame - 查询时间段内的某个股票的拆分数据
- ex_dividend_date: 除权除息日,该天股票的价格会因为拆分而进行调整
- book_closure_date: 股权登记日
- split_coefficient_from: 拆分因子(拆分前)
- split_coefficient_to: 拆分因子(拆分后)
例如:每 10 股转增 2 股,则 split_coefficient_from = 10, split_coefficient_to = 12.
范例
[In]
get_split('000001.XSHE', start_date='2010-01-04')
[Out]
book_closure_date payable_date split_coefficient_from \
ex_dividend_date
2013-06-20 2013-06-19 2013-06-20 10
split_coefficient_to
ex_dividend_date
2013-06-20 16.0
# get_trading_dates - 交易日列表
get_trading_dates(start_date, end_date)
获取某个国家市场的交易日列表(起止日期加入判断)。目前仅支持中国市场。
参数
参数 类型 说明 start_date str, date, datetime, pandasTimestamp 开始日期,用户必须指定 end_date str, date, datetime, pandasTimestamp 结束日期,用户必须指定
返回
datetime.date list
范例
[In]get_trading_dates(start_date='2016-05-05', end_date='20160505')
[Out]
[datetime.date(2016, 5, 5)]
# get_previous_trading_date - 上一交易日
get_previous_trading_date(date, n=1)
获取指定日期的上一(或 n)交易日。
参数
参数 类型 说明 date str, date, datetime, pandasTimestamp 指定日期 n int 第 n 个交易日,默认为 1
返回
datetime.date
范例
[In]get_previous_trading_date(date='2016-05-02')
[Out]
[datetime.date(2016, 4, 29)]
# get_next_trading_date - 下一交易日
get_next_trading_date(date, n=1)
获取指定日期的下一交易日
参数
参数 类型 说明 date str, date, datetime, pandasTimestamp 指定日期 n int 第 n 个交易日,默认为 1
返回
datetime.date
范例
[In]get_next_trading_date(date='2016-05-01')
[Out]
[datetime.date(2016, 5, 3)]
# get_price_change_rate - 获取历史涨跌幅
get_price_change_rate(id_or_symbols, count=1)
获取股票或指数的历史涨跌幅。注意目前只支持股票与指数两类合约,基金、期货等目前并不支持。历史涨跌幅基于前复权价格。
参数
参数 类型 说明 id_or_symbols str or str list 可输入 order_book_id, order_book_id list count int 回溯获取的数据个数。默认为当前能够获取到的最近的数据
返回
- 传入多个 order_book_id,函数会返回pandas DataFrame
- 传入一个 order_book_id,函数会返回pandas Series
范例
- 获取平安银行以及沪深 300 指数一段时间的涨跌幅情况。
[In]
get_price_change_rate(['000001.XSHE', '510050.XSHG'], 1)
[Out]
2016-06-01 15:30:00.00 INFO order_book_id 000001.XSHE 510050.XSHG
date
2016-05-31 0.026265 0.033964
2016-06-02 15:30:00.00 INFO order_book_id 000001.XSHE 510050.XSHG
date
2016-06-01 -0.006635 -0.008308
# get_yield_curve - 收益率曲线
get_yield_curve(date=None, tenor=None)
获取某个国家市场指定日期的收益率曲线水平。
数据为 2002 年至今的中债国债收益率曲线,来源于中央国债登记结算有限责任公司。
注意:回测中的默认返回会是回测日期的前一个交易日。
当回测、模拟实盘中带有期货品种,且品种合约有夜盘交易时(意味着期货合约交易日去到下一天),此时的收益率曲线会是当天数据,然而可能还未生成。因此建议针对回测里可能测到的当前日期和模拟实盘策略,先查验 trading_day 然后再调取收益率曲线。
参数
参数 类型 说明 date str, date, datetime, pandasTimestamp 查询日期,默认为策略当前日期前一天 tenor str 标准期限,'0S' - 隔夜,'1M' - 1 个月,'1Y' - 1 年,默认为全部期限
返回
pandas DataFrame - 查询时间段内无风险收益率曲线
范例
[In]
get_yield_curve('20130104')
[Out]
0S 1M 2M 3M 6M 9M 1Y 2Y \
2013-01-04 0.0196 0.0253 0.0288 0.0279 0.0280 0.0283 0.0292 0.0310
3Y 4Y ... 6Y 7Y 8Y 9Y 10Y \
2013-01-04 0.0314 0.0318 ... 0.0342 0.0350 0.0353 0.0357 0.0361
...
# is_suspended - 全天停牌判断
is_suspended(order_book_id, count=1)
判断某只股票是否全天停牌。
参数
参数 类型 说明 order_book_id str 某只股票的代码,可传入单只股票的 order_book_id, symbol count int 回溯获取的数据个数。默认为当前能够获取到的最近的数据
返回
count 为 1 时
bool
count>1 时
list
# is_st_stock - ST 股判断
is_st_stock(order_book_id, count=1)
判断一只或多只股票在一段时间内是否为 ST 股(包括 ST 与*ST)。
ST 股是有退市风险因此风险比较大的股票,很多时候您也会希望判断自己使用的股票是否是'ST'股来避开这些风险大的股票。另外,我们目前的策略比赛也禁止了使用'ST'股。
参数
参数 类型 注释 order_book_id str 股票的代码,可传入 order_book_id, symbol count int 回溯获取的数据个数。默认为当前能够获取到的最近的数据
返回
count 为 1 时
bool
count>1 时
list
# 其他方法
# subscribe_event - 事件订阅
subscribe_event(event_type, handler)
注册回调函数, 当对应事件更新时, 回调逻辑被触发。视对应事件不同, 可用于对订单状态更新、成交发生等事件监控。
参数
参数 类型 注释 event_type EVENT 需要订阅的事件类别 handler function 回调函数, 函数定义中需要包含 event 这一参数
返回
无
范例
精确控制订单生命周期。您可以使用 RQAlpha 策略框架提供的事件订阅机制来控制订单生命周期, 例如成交发生、订单被撤销等。可以在策略初始化时通过 subscribe_event 这一 API 从 支持的事件列表 中选择对应的事件进行订阅并注册回调函数。这样, 当事件发生的时候, 对应回调函数会被触发。
下面的例子展示了回调函数的注册机制, 当订单创建成功以及成交发生的时候, 对应的回调函数将会分别被触发。
def init(context):
# 注册成交事件
subscribe_event(EVENT.TRADE, on_trade)
# 注册订单成功创建事件
subscribe_event(EVENT.ORDER_CREATION_PASS, on_order_created)
context.count = 0
context.s1 = '000001.XSHE'
# 回调函数定义中需要包含 context, event 参数
def on_trade(context, event):
# 获取成交信息
trade = event.trade
if trade.order_book_id == context.s1:
print(trade)
# 回调函数定义中需要包含 event 这一参数
def on_order_created(context, event):
# 获取订单信息
order = event.order
print(order)
def handle_bar(context, bar_dict):
px = bar_dict['000001.XSHE'].last + 0.2
if context.count == 0:
# 订单创建, 并使用关键字 context 保存全局变量
submit_order(context.s1, amount=100, side=SIDE.BUY, price=px)
context.count += 1
# update_universe - 更新股票池
update_universe(order_book_id)
该方法用于更新现在关注的证券的集合(e.g.:股票池)。PS:会在下一个 bar 事件触发时候产生(新的关注的股票池更新)效果。并且 update_universe 会是覆盖(overwrite)的操作而不是在已有的股票池的基础上进行增量添加。比如已有的股票池为['000001.XSHE', '000024.XSHE']
然后调用了update_universe(['000030.XSHE'])
之后,股票池就会变成000030.XSHE
一个股票了,随后的数据更新也只会跟踪000030.XSHE
这一个股票了。
参数
参数 类型 注释 order_book_id str OR str list 合约代码,可传入 order_book_id, order_book_id list
范例
下面的代码是将股票池变更为只有 2 个股票000001.XSHE
和000024.XSHE
:
update_universe(['000001.XSHE', '000024.XSHE'])
当然,您也可以使用合约简称:
update_universe(['平安银行', '招商地产'])
# subscribe - 订阅行情
subscribe(order_book_id)
订阅合约行情。该操作会导致合约池内合约的增加,从而影响handle_bar
中处理 bar 数据的数量。
需要注意,用户在初次编写策略时候需要首先订阅合约行情,否则handle_bar
不会被触发。
参数
参数 类型 说明 order_book_id str, str list 合约代码,或代码列表,例如'IF1503'
返回
无
# unsubscribe - 取消订阅行情
unsubscribe(order_book_id)
取消订阅合约行情。取消订阅会导致合约池内合约的减少,如果当前合约池中没有任何合约,则策略直接退出。
参数
参数 类型 说明 order_book_id str, str list 合约代码,或代码列表
返回
无
# reg_indicator - 注册指标
reg_indicator(name, func_obj, freq='1d', win_size=10)
参数
参数 类型 说明 name str 定义的指标名称 func_obj function 函数对象 freq str 指标计算的周期。支持日级别与分钟级别,'1d'代表每日,'5m'代表 5 分钟 win_size int 获取数据回溯窗口。该指标用于在注册指标时让系统获取回溯获取数据的最大窗口,便于数据的加载与预计算
返回
无
# get_indicator - 获取指标
get_indicator(order_book_id, name)
参数
参数 类型 说明 order_book_id str 合约代码 name str 定义的指标名称
name 为您注册的指标中的 name 参数,使用案例请见自定义技术指标。
返回
定义指标返回值
# get_file - 读取文件
get_file(file_path)
读取您的私有文件(您的私有文件可以在研究模块中看到)
参数 类型 注释 file_path str 相对路径,相对于您的私有的在研究模块空间的根目录的路径
返回
返回文件的原始内容,不做任何 decode。
范例
以下代码可以在回测中使用,读取自己的私有文件:day_px.csv 之后,然后通过 pandas 转换成 dataframe 类型进行方便使用:
# 可以自己import我们平台支持的第三方python模块,比如pandas、numpy等。
import pandas as pd
from six import BytesIO
# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
def init(context):
# 由于保存的是原数据文件,因此需要用BytesIO进行转换
body = get_file('day_px.csv')
data=pd.read_csv(BytesIO(body))
logger.info(data)
# put_file - 存储文件
put_file(file_path, data, append=False)
将指定信息存储到指定目录的文件中。该 API 只能在回测中调用,研究平台不支持但是存储的文件能够在研究模块中取用。若要在研究平台存储文件,可以参考研究平台 get_file 的样例
参数
参数 类型 注释 file_path str 相对路径,相对于您的私有的在研究模块空间的根目录的路径 data str, bytes 保存的信息。如果为 str 类型,则会默认以 utf-8 方式编码存储 append bool 是否续写文件。默认为 False,即每次调用时都会清除原文件内容
返回
无
范例
运行结束之后,您就能够在研究平台中看到 test_file.csv 文件了。
put_file('test_file.csv', 'hello world')
在使用put_file()
函数时,如果要存储的数据类型是 DataFrame,则函数中的 data 参数应该添加 DataFrame 的to_csv()
方法。
范例
以下代码可在回测中进行使用,通过get_price()
读取某个股票在某段时间内的历史行情数据,读取的结果为一个 DataFrame 数据,再通过put_file()
将数据进行存储:
#可以自己import我们平台支持的第三方python模块,比如pandas、numpy等。
import pandas as pd
# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
def init(context):
file_data = get_price('000001.XSHE','20190901','20190920','1m')
put_file('test_file.csv',pd.DataFrame.to_csv(file_data))
# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
def handle_bar(context, bar_dict):
# 开始编写你的主要的算法逻辑
pass
运行结束后,您就能够在研究平台中看到 test_file.csv 文件了。
# get_csv - 读取 csv 数据
get_csv(csv_file_path)
get_csv 函数支持 pandas.read_csv 的全部参数。
参数
参数 | 类型 | 注释 |
---|---|---|
'csv_file_path' | str - required | ipython 策略研究部分上传的 csv 文件的路径。 |
返回
pandas Dataframe
- 里面保存着 csv 文件中的数据内容
范例
如果仅仅是想使用 csv 文件格式的话可以使用 get_csv 接口,我们在投资研究部分提供了上传自己数据的功能,您从这里进入 ipython 投资研究:
接着可以点击右上角的上传文件:
那么在 ipython 策略研究的首页可以看到上传之后的 csv 文件,此处我们上传了一个 csv 文件:revenue.csv 用来做随后的例子
我们看下这个 csv 文件中的数据内容:
2015-01-10,2937842929.6,113463565.69,1733702964.32
2014-01-10,2926316060.58,116181575.59,883935497.71
2013-01-10,2616532214.37,90146425.57,948898049.5
2012-01-10,2681016310.35,,620593405.65
2011-01-10,2034147254.71,,499812019.44
2010-01-10,,,508985888.73
随后我们可以在编写策略的时候使用get_csv
来调用:
def init(context):
context.csv_df = get_csv("revenue.csv")
logger.info(context.csv_df)
我们把 renuve.csv 中的数据读取出来以后是一个dataframe
然后存放到了context.csv_df
里面以供之后的策略使用,可以运行以后看下打印出来的结果:
INITINFO 2015-01-10 2937842929.6 113463565.69 1733702964.32
0 2014-01-10 2.926316e+09 1.161816e+08 8.839355e+08
1 2013-01-10 2.616532e+09 9.014643e+07 9.488980e+08
2 2012-01-10 2.681016e+09 NaN 6.205934e+08
3 2011-01-10 2.034147e+09 NaN 4.998120e+08
4 2010-01-10 NaN NaN 5.089859e+08
# plot - 画图
plot(series_name, value)
plot
函数可以将时间序列的数据传给页面进行绘图,结果是以时间为横轴,value 为纵轴的曲线。
参数
参数 类型 注释 series_name str 绘制曲线的名称,用户必须填写 value float 当前日期的曲线的点的值,用户必须填写
范例
# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
def handle_bar(context, bar_dict):
# TODO: 开始编写你的算法吧!
plot('close', bar_dict['000001.XSHE'].close)
plot('high', bar_dict['000001.XSHE'].high)
plot('low', bar_dict['000001.XSHE'].low)
plot('open', bar_dict['000001.XSHE'].open)
以上代码画图的结果截图:
# 重要对象
# Bar 对象
属性 | 类型 | 注释 |
---|---|---|
order_book_id | str | 合约代码 |
symbol | str | 合约简称 |
datetime | datetime.datetime | 时间戳 |
open | float | 开盘价 |
close | float | 收盘价 |
high | float | 最高价 |
low | float | 最低价 |
volume | float | 成交量 |
total_turnover | float | 成交额 |
prev_close | float | 昨日收盘价 |
limit_up | float | 涨停价 |
limit_down | float | 跌停价 |
isnan | bool | 当前 bar 数据是否有行情。例如,获取已经到期的合约数据,isnan 此时为 True |
suspended | bool | 是否全天停牌 |
prev_settlement | float | 昨结算(期货日线数据专用) |
settlement | float | 结算(期货日线数据专用) |
注意,在股票策略中 bar 对象可以拿到所有股票合约的 bar 信息。如下
def handle_bar(context,bar_dict):
volume = bar_dict['000001.XSHE'].volume
#拿到'000001.XSHE'当前bar的成交量
但在期货策略中,bar 对象只能拿到订阅的合约的 bar 信息。
# Order 对象
属性 | 类型 | 注释 |
---|---|---|
order_id | int | 唯一标识订单的 id |
order_book_id | str | 合约代码 |
datetime | datetime.datetime | 订单创建时间 |
side | SIDE | 订单方向 |
price | float | 订单价格,只有在订单类型为'限价单'的时候才有意义 |
quantity | int | 订单数量 |
filled_quantity | int | 订单已成交数量 |
unfilled_quantity | int | 订单未成交数量 |
type | ORDER_TYPE | 订单类型 |
transaction_cost | float | 费用 |
avg_price | float | 成交均价 |
status | ORDER_STATUS | 订单状态 |
message | str | 信息。比如拒单时候此处会提示拒单原因 |
trading_datetime | datetime.datetime | 订单的交易日期(对应期货夜盘) |
position_effect | POSITION_EFFECT | 订单开平(期货专用) |
# Tick 对象
属性 | 类型 | 注释 |
---|---|---|
order_book_id | str | 合约代码 |
datetime | datetime.datetime | 当前快照数据的时间戳 |
open | float | 当日开盘价 |
high | float | 截止到当前的最高价 |
low | float | 截止到当前的最低价 |
last | float | 当前最新价 |
prev_settlement | float | 昨日结算价 |
prev_close | float | 昨日收盘价 |
volume | float | 截止到当前的成交量 |
limit_up | float | 涨停价 |
limit_down | float | 跌停价 |
open_interest | float | 截止到当前的持仓量 |
asks | list | 卖出报盘价格,asks[0]代表盘口卖一档报盘价 |
ask_vols | list | 卖出报盘数量,ask_vols[0]代表盘口卖一档报盘数量 |
bids | list | 买入报盘价格,bids[0]代表盘口买一档报盘价 |
bid_vols | list | 买入报盘数量,bid_vols[0]代表盘口买一档报盘数量 |
# Portfolio 对象
- portfolio 对象
属性 | 类型 | 注释 |
---|---|---|
total_returns | float | 投资组合至今的累积收益率 |
daily_returns | float | 投资组合每日收益率 |
daily_pnl | float | 当日盈亏,子账户当日盈亏的加总 |
total_value | float | 总权益,为子账户总权益加总总 |
unit_net_value | float | 单位净值 |
annualized_returns | float | 投资组合的年化收益率 |
positions | dict | 一个包含所有仓位的字典,以 order_book_id 作为键,position 对象作为值,关于 position 的更多的信息可以在下面的部分找到。 |
# Account 对象
- 股票账户 stock_account 对象,可以
属性 | 类型 | 注释 |
---|---|---|
cash | float | 可用资金 |
total_value | float | 总权益 |
positions | dict | 一个包含股票子组合仓位的字典,以 order_book_id 作为键,position 对象作为值,关于 position 的更多的信息可以在下面的部分找到。 |
dividend_receivable | float | 投资组合在分红现金收到账面之前的应收分红部分。具体细节在分红部分 |
- 期货账户 future_account 对象
属性 | 类型 | 注释 |
---|---|---|
cash | float | 可用资金 |
float | 当日持仓盈亏 | |
float | 当日平仓盈亏 | |
total_value | float | 总权益 |
positions | dict | 一个包含期货子组合仓位的字典,以 order_book_id 作为键,position 对象作为值 |
# Position 对象
- 股票 position 对象
属性 | 类型 | 注释 |
---|---|---|
order_book_id | str | 合约代码 |
direction | POSITION_DIRECTION | 持仓方向 |
quantity | int | 当前持仓股数 |
market_value | float | 获得该持仓的实时市场价值 |
trading_pnl | float | 当前持仓当日的交易盈亏 |
position_pnl | float | 当前持仓当日的持仓盈亏 |
last_price | float | 仓位标的最新市场价 |
- 期货 position 对象
属性 | 类型 | 注释 |
---|---|---|
order_book_id | str | 合约代码 |
direction | POSITION_DIRECTION | 持仓方向 |
old_quantity | int | 昨日持仓股数 |
quantity | int | 当前持仓股数 |
margin | float | 合约保证金 |
market_value | float | 获得该持仓的实时市场价值 |
trading_pnl | float | 当前持仓当日的交易盈亏 |
position_pnl | float | 当前持仓当日的持仓盈亏 |
last_price | float | 仓位标的最新市场价 |
# Instrument 对象
- 股票,ETF,指数 Instrument 对象
参数 | 类型 | 说明 |
---|---|---|
order_book_id | str | 证券代码,证券的独特的标识符。应以'.XSHG'或'.XSHE'结尾,前者代表上证,后者代表深证 |
symbol | str | 证券的简称,例如'平安银行' |
round_lot | int | 一手对应多少股,中国 A 股一手是 100 股 |
sector_code | str | 板块缩写代码,全球通用标准定义 |
sector_code_name | str | 以当地语言为标准的板块代码名 |
industry_code | str | 国民经济行业分类代码,具体可参考下方"Industry 列表" |
industry_name | str | 国民经济行业分类名称 |
listed_date | str | 该证券上市日期 |
de_listed_date | str | 退市日期 |
type | str | 合约类型,目前支持的类型有: 'CS', 'INDX', 'LOF', 'ETF', 'Future' |
str | 概念股分类,例如:'铁路基建','基金重仓'等 | |
exchange | str | 交易所,'XSHE' - 深交所, 'XSHG' - 上交所 |
board_type | str | 板块类别,'MainBoard' - 主板,'GEM' - 创业板,'SME' - 中小板 |
status | str | 合约状态。'Active' - 正常上市, 'Delisted' - 终止上市, 'TemporarySuspended' - 暂停上市, |
special_type | str | 特别处理状态。'Normal' - 正常上市, 'ST' - ST 处理, 'StarST' - *ST 代表该股票正在接受退市警告, 'PT' - 代表该股票连续 3 年收入为负,将被暂停交易, 'Other' - 其他 |
trading_hours | str | 合约最新的交易时间,如需历史数据请使用rqdatac.get_trading_hours |
- 期货 Instrument 对象
参数 | 类型 | 说明 |
---|---|---|
order_book_id | str | 期货代码,期货的独特的标识符(郑商所期货合约数字部分进行了补齐。例如原有代码'ZC609'补齐之后变为'ZC1609')。主力连续合约 UnderlyingSymbol+88,例如'IF88' ;指数连续合约命名规则为 UnderlyingSymbol+99 |
symbol | str | 期货的简称,例如'沪深 1005' |
margin_rate | float | 期货合约最低保证金率 |
round_lot | float | 期货全部为 1.0 |
listed_date | str | 期货的上市日期。主力连续合约与指数连续合约都为'0000-00-00' |
type | str | 合约类型,'Future' |
contract_multiplier | float | 合约乘数,例如沪深 300 股指期货的乘数为 300.0 |
underlying_order_book_id | str | 合约标的代码,目前除股指期货(IH, IF, IC)之外的期货合约,这一字段全部为'null' |
underlying_symbol | str | 合约标的名称,例如 IF1005 的合约标的名称为'IF' |
maturity_date | str | 期货到期日。主力连续合约与指数连续合约都为'0000-00-00' |
exchange | str | 交易所,'DCE' - 大连商品交易所, 'SHFE' - 上海期货交易所,'CFFEX' - 中国金融期货交易所, 'CZCE'- 郑州商品交易所 |
trading_hours | str | 合约最新的交易时间,如需历史数据请使用rqdatac.get_trading_hours |
- 期权 Instrument 对象
字段 | 类型 | 说明 |
---|---|---|
order_book_id | str | 合约代码,50ETF 期权为数字代码,例如 10000615 |
symbol | str | 合约简称 |
round_lot | float | 最小下单手数,期权全部为 1.0 |
listed_date | str | 合约上市日期 |
type | str | 合约类型,'Option' 代表期权 |
contract_multiplier | float | 合约乘数,50ETF 期权只保存分红调整后的最新数据,变动历史请参考日线数据 |
underlying_order_book_id | str | 合约标的代码 |
underlying_symbol | str | 合约所属品种 |
maturity_date | str | 合约到期日 |
exchange | str | 交易所,'DCE' - 大连商品交易所, 'SHFE' - 上海期货交易所,'CFFEX' - 中国金融期货交易所, 'CZCE'- 郑州商品交易所 |
strike_price | float | 期权行权价,50ETF 期权只保存分红调整后的最新数据,变动历史请参考日线数据 |
option_type | str | 'C' 代表认购,'P'代表认沽 |
exercise_type | str | 'E' 代表欧式期权,'A' 代表美式期权 |
product_name | str | ETF 期权字母简称 |
- 现货 Instrument 对象
字段 | 类型 | 说明 |
---|---|---|
order_book_id | str | 合约代码 |
symbol | str | 合约简称 |
exchange | str | 交易所,'SGEX' - 上海黄金期货交易所 |
listed_date | str | 合约上市日期 |
de_listed_date | str | 退市日期 |
type | str | 合约类型,'Spot' 代表现货 |
trading_hours | str | 合约最新的交易时间,如需历史数据请使用rqdatac.get_trading_hours |
- 可转债 Instrument 对象
字段 | 类型 | 说明 |
---|---|---|
order_book_id | str | 合约代码 |
symbol | str | 合约简称 |
exchange | str | 交易所,'SXHE' - 深交所,'SXHG' - 上交所 |
listed_date | str | 合约上市日期 |
de_listed_date | str | 退市日期 |
type | str | 合约类型,'Spot' 代表现货 |
market_tplus | str | 交易制度。'0'表示 T+0,'1'表示 T+1,往后顺推 |
Instrument 对象也支持如下方法:
- 获取合约已上市天数:
instruments('000001.XSHE').days_from_listed()
如果合约首次上市交易,天数为 0;如果合约尚未上市或已经退市,则天数值为-1
- 合约距离到期天数。
instruments(order_book_id).days_to_expire()
如果策略已经退市,则天数值为-1
- 获取合约最小价格变动单位。
tick_size()
例如,instruments('IF1608').tick_size()获取的就是股指期货的最小价格变动单位,为 0.2,即“一跳”的水平。
# 枚举常量
# ORDER_STATUS - 订单状态
枚举值 | 说明 |
---|---|
PENDING_NEW | 待报 |
ACTIVE | 可撤 |
FILLED | 全成 |
PENDING_CANCEL | 待撤 |
CANCELLED | 已撤 |
REJECTED | 拒单 |
# SIDE - 买卖方向
枚举值 | 说明 |
---|---|
BUY | 买 |
SELL | 卖 |
# POSITION_EFFECT - 交易动作
枚举值 | 说明 |
---|---|
OPEN | 开仓 |
CLOSE | 平仓 |
CLOSE_TODAY | 平今 |
EXERCISE | 行权 |
MATCH | 轧平 |
# ORDER_TYPE - 订单类型
枚举值 | 说明 |
---|---|
MARKET | 市价单 |
LIMIT | 限价单 |
# RUN_TYPE - 策略运行类型
枚举值 | 说明 |
---|---|
BACKTEST | 回测 |
PAPER_TRADING | 实盘模拟 |
LIVE_TRADING | 实盘 |
# POSITION_DIRECTION - 持仓多空方向
枚举值 | 说明 |
---|---|
LONG | 多方向 |
SHORT | 空方向 |
# EVENT - 事件类型
枚举值 | 说明 |
---|---|
ORDER_PENDING_NEW | 策略创建订单 |
ORDER_CREATION_PASS | 订单已报送至柜台 |
ORDER_UNSOLICITED_UPDATE | 外部撤单(策略并未发出撤单申请, 但收到了返回的撤单成功确认, 例如通过柜台系统撤单) |
ORDER_PENDING_CANCEL | 策略创建撤单请求 |
ORDER_CANCELLATION_PASS | 撤单成功 |
ORDER_CREATION_REJECT | 拒单 |
TRADE | 成交 |