.. py:function:: init(context) 初始化方法 - 在回测和实时模拟交易只会在启动的时候触发一次。你的算法会使用这个方法来设置你需要的各种初始化配置。 context 对象将会在你的算法的所有其他的方法之间进行传递以方便你可以拿取到。 :param context: 策略上下文 :type context: :class:`~rqalpha.core.strategy_context.StrategyContext` object :example: .. code-block:: python def init(context): # cash_limit的属性是根据用户需求自己定义的,你可以定义无限多种自己随后需要的属性,ricequant的系统默认只是会占用context.portfolio的关键字来调用策略的投资组合信息 context.cash_limit = 5000
.. py:function:: handle_bar(context, bar_dict) bar数据的更新会自动触发该方法的调用。策略具体逻辑可在该方法内实现,包括交易信号的产生、订单的创建等。 在实时模拟交易中,该函数在交易时间内会每分钟被触发一次。 :param context: 策略上下文 :type context: :class:`~rqalpha.core.strategy_context.StrategyContext` object :param bar_dict: key 为 order_book_id,value 为 bar 对象 :type bar_dict: Dict[:class:`~rqalpha.model.bar.BarObject`] :example: .. code-block:: python def handle_bar(context, bar_dict): # put all your algorithm main logic here. # ... order_shares('000001.XSHE', 500) # ...
.. py:function:: handle_tick(context, tick) 在 tick 级别的策略中,已订阅快照数据的更新会自动触发该方法的调用。策略具体逻辑可在该方法内实现,包括交易信号的产生、订单的创建等。 若订阅了多个合约,不同合约快照数据的更新会分别触发该方法。(触发时间包括集合竞价和连续交易时段)。 :param context: 策略上下文 :type context: :class:`~rqalpha.core.strategy_context.StrategyContext` object :param tick: key为order_book_id,value为bar数据。当前合约池内所有合约的bar数据信息都会更新在bar_dict里面 :type tick: :class:`~rqalpha.model.tick.TickObject` object :example: .. code-block:: python def handle_bar(context, tick): # put all your algorithm main logic here. # ... order_shares(tick.order_book_id, tick.last) # ...
.. py:function:: open_auction(context, bar_dict) 盘前集合竞价发生时会触发该函数的调用,在该函数内发出的订单会以当日开盘价被撮合。 tick级别回测频率不触发集合竞价事件。 :param context: 策略上下文 :type context: :class:`~rqalpha.core.strategy_context.StrategyContext` object :param bar_dict: key 为 order_book_id,value 为 **不完整的** bar 对象,该对象仅有 open, limit_up, limit_down 等字段,没有 close 等字段 :type bar_dict: Dict[:class:`~rqalpha.model.bar.BarObject`] :example: .. code-block:: python def open_auction(context, bar_dict): # put all your algorithm main logic here. # ... order_book_id = "000001.XSHE" order_shares(order_book_id, bar_dict[order_book_id].open) # ...
.. py:function:: before_trading(context) 每天在策略开始交易前会被调用。不能在这个函数中发送订单。需要注意,该函数的触发时间取决于用户当前所订阅合约的交易时间。 举例来说,如果用户订阅的合约中存在有夜盘交易的期货合约,则该函数可能会在前一日的20:00触发,而不是早晨08:00. :param context: 策略上下文 :type context: :class:`~rqalpha.core.strategy_context.StrategyContext` object :example: .. code-block:: python def before_trading(context): logger.info("This is before trading")
.. py:function:: after_trading(context) 每天在收盘后被调用。不能在这个函数中发送订单。您可以在该函数中进行当日收盘后的一些计算。 在实时模拟交易中,该函数会在每天15:30触发。 :param context: 策略上下文 :type context: :class:`~rqalpha.core.strategy_context.StrategyContext` object
该类型可供后续下单接口中 price_or_style 参数使用
.. module:: rqalpha.model.order
.. autoclass:: MarketOrder .. code-block:: python order_shares("000001.XSHE", amount=100, price_or_style=MarketOrder())
市价单
.. autoclass:: LimitOrder :param float limit_price: 价格 .. code-block:: python order_shares("000001.XSHE", amount=100, price_or_style=LimitOrder(10))
限价单
.. autoclass:: TWAPOrder :param int start_min: 分钟起始时间 :param int end_min: 分钟结束时间 .. code-block:: python order_shares("000001.XSHE", amount=100, price_or_style=TWAPOrder(931, 945))
算法时间加权价格订单
.. autoclass:: VWAPOrder :param int start_min: 分钟起始时间 :param int end_min: 分钟结束时间 .. code-block:: python order_shares("000001.XSHE", amount=100, price_or_style=VWAPOrder(931, 945))
算法成交量加权价格订单
.. module:: rqalpha.api
.. autofunction:: submit_order
.. autofunction:: order
.. autofunction:: order_to
.. autofunction:: order_shares
.. autofunction:: order_lots
.. autofunction:: order_value
.. autofunction:: order_percent
.. autofunction:: order_target_value
.. autofunction:: order_target_percent
.. autofunction:: order_target_portfolio
.. autofunction:: buy_open
.. autofunction:: sell_close
.. autofunction:: sell_open
.. autofunction:: buy_close
.. autofunction:: cancel_order
.. autofunction:: get_open_orders
.. autofunction:: exercise
.. autofunction:: get_position
.. autofunction:: get_positions
.. autofunction:: all_instruments
.. autofunction:: instruments
.. autofunction:: history_bars
.. autofunction:: current_snapshot(order_book_id)
.. autofunction:: get_trading_dates(start_date, end_date)
.. autofunction:: get_previous_trading_date(date)
.. autofunction:: get_next_trading_date(date)
.. autofunction:: history_ticks
.. autofunction:: get_yield_curve(date=None, tenor=None)
.. autofunction:: industry
.. autofunction:: sector
.. autofunction:: get_dividend
.. autofunction:: is_suspended(order_book_id)
.. autofunction:: is_st_stock(order_book_id)
.. autofunction:: get_future_contracts(underlying_symbol)
.. autofunction:: update_universe
.. autofunction:: subscribe
.. autofunction:: unsubscribe
.. autofunction:: subscribe_event
.. autofunction:: deposit
.. autofunction:: withdraw
.. autofunction:: finance
.. autofunction:: repay
.. py:function:: after_trading(context) 在生成的图标结果中,某一个根线上增加一个点。 :param series_name: 序列名称 :type series_name: str :param value: 值 :type value: float
.. py:function:: scheduler.run_daily(function, time_rule=None) 每日运行一次指定的函数,只能在init内使用。 注意,schedule一定在其对应时间点的handle_bar之前执行, 日频则忽略time_rule设置, 在当天handle_bar之前执行。 :param func function: 使传入的function每日运行。注意,function函数一定要包含(并且只能包含)context, bar_dict两个输入参数 :param int time_rule: 通过 market_open, market_close,physical_time 来设置当天运行的时间,为None时默认为9:31分执行 :example: 以下的范例代码片段是一个非常简单的例子,在每天交易后查询现在portfolio中剩下的cash的情况: .. code-block:: python3 :linenos: #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)
.. py:function:: scheduler.run_weekly(function, weekday=x, tradingday=t, time_rule=None) 每周运行一次指定的函数,只能在init内使用。 注意: * tradingday中的负数表示倒数。 * tradingday表示交易日。如某周只有四个交易日,则此周的tradingday=4与tradingday=-1表示同一天。 * weekday和tradingday不能同时使用。 :param func function: 使传入的function每日交易开始前运行。注意,function函数一定要包含(并且只能包含)context, bar_dict两个输入参数。 :param int weekday: 1~5 分别代表周一至周五,用户必须指定 :param int tradingday: 范围为[-5,1],[1,5] 例如,1代表每周第一个交易日,-1代表每周倒数第一个交易日,用户可以不填写。 :param int time_rule: 通过 market_open, market_close,physical_time 来设置当天运行的时间,为None时默认为9:31分执行 :example: 以下的代码片段非常简单,在每周二固定运行打印一下现在的portfolio剩余的资金: .. code-block:: python3 :linenos: #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)
.. py:function:: scheduler.run_monthly(function, tradingday=t, time_rule=None) 每月运行一次指定的函数,只能在init内使用。 注意: * tradingday的负数表示倒数。 * tradingday表示交易日,如某月只有三个交易日,则此月的tradingday=3与tradingday=-1表示同一。 :param func function: 使传入的function每日交易开始前运行。注意,function函数一定要包含(并且只能包含)context, bar_dict两个输入参数。 :param int tradingday: 范围为[-23,1], [1,23] ,例如,1代表每月第一个交易日,-1代表每月倒数第一个交易日,用户必须指定。 :param int time_rule: 通过 market_open, market_close,physical_time 来设置当天运行的时间,为None时默认为9:31分执行 :example: 以下的代码片段非常简单的展示了每个月第一个交易日的时候我们进行一次财务数据查询,这对根据财务数据来调节股票组合的策略会非常有用: .. code-block:: python3 :linenos: #scheduler调用的函数需要包括context, bar_dict两个参数 def query_fundamental(context, bar_dict): # 查询revenue前十名的公司的股票并且他们的pe_ratio在25和30之间。打fundamentals的时候会有auto-complete方便写查询代码。 fundamental_df = get_fundamentals( query( fundamentals.income_statement.revenue, fundamentals.eod_derivative_indicator.pe_ratio ).filter( fundamentals.eod_derivative_indicator.pe_ratio > 25 ).filter( fundamentals.eod_derivative_indicator.pe_ratio < 30 ).order_by( fundamentals.income_statement.revenue.desc() ).limit( 10 ) ) # 将查询结果dataframe的fundamental_df存放在context里面以备后面只需: context.fundamental_df = fundamental_df # 实时打印日志看下查询结果,会有我们精心处理的数据表格显示: logger.info(context.fundamental_df) update_universe(context.fundamental_df.columns.values) # 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。 def init(context): # 每月的第一个交易日查询以下财务数据,以确保可以拿到最新更新的财务数据信息用来调整仓位 scheduler.run_monthly(query_fundamental, tradingday=1)
scheduler还可以用来做定时间运行,比如在每天开盘后的一小时后或一分钟后定时运行,这里有很多种组合可以让您达到各种自己想要达到的定时运行的目的。
使用的方法是和上面的 :func:`scheduler.run_daily` , :func:`scheduler.run_weekly` 和 :func:`scheduler.run_monthly` 进行组合加入time_rule来一起使用。
注意:
- market_open与market_close都跟随中国A股交易时间进行设置,即09:31~15:00。
- physical_time用于设置物理时间,与market_open和market_close的相对时间不同。
- physical_time更多用于交易时间不确定的品种,如商品期货。
- 使用time_rule定时运行只会在分钟级别回测和实时模拟交易中有定义的效果,在日回测中只会默认依然在该天运行,并不能在固定的时间运行。
- 在分钟回测中如未指定time_rule,则默认在开盘后一分钟运行,即09:31分。
- 目前暂不支持开盘交易(即 09:30分交易) 。
- market_open(minute=120)将在11:30执行, market_open(minute=121)在13:01执行,中午休市的区间会被忽略。
- time_rule='before_trading'表示在开市交易前运行scheduler函数。该函数运行时间将在before_trading函数运行完毕之后handle_bar运行之前。
time_rule: 定时具体几点几分运行某个函数。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,physical_time参数如下:
参数 类型 注释 hour int - option [1,4] 具体在market_open/market_close后/前第多少小时执行, 股票的交易时间为[9:31 - 11:30],[13:01 - 15:00]共240分钟,所以hour的范围为 [1,4] minute int - option [1,240] 具体在market_open/market_close的后/前第多少分钟执行,同上,股票每天交易时间240分钟,所以minute的范围为 [1,240],中午休市的时间区间会被忽略。
example:
每天的开市后10分钟运行:
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')每天十点运行:
scheduler.run_daily(function, time_rule=physical_time(hour=10, minute=0))
.. module:: rqalpha.core.strategy_context
.. autoclass:: StrategyContext :members:
.. autoclass:: RunInfo :members:
.. module:: rqalpha.model.bar
.. autoclass:: BarObject :members: :show-inheritance: :inherited-members:
.. module:: rqalpha.model.tick
.. autoclass:: TickObject :members: :show-inheritance: :inherited-members:
.. module:: rqalpha.model.order
.. autoclass:: Order :members: :show-inheritance: :inherited-members:
.. module:: rqalpha.portfolio
.. autoclass:: Portfolio :members: :show-inheritance: :inherited-members:
.. module:: rqalpha.portfolio.account
.. autoclass:: Account :members: :inherited-members:
.. module:: rqalpha.mod.rqalpha_mod_sys_accounts.position_model
.. autoclass:: StockPosition :members: :inherited-members:
.. autoclass:: FuturePosition :members: :inherited-members:
.. module:: rqalpha.model.instrument
.. py:class:: Instrument .. py:attribute:: order_book_id 【str】股票:证券代码,证券的独特的标识符。应以'.XSHG'或'.XSHE'结尾,前者代表上证,后者代表深证。期货:期货代码,期货的独特的标识符(郑商所期货合约数字部分进行了补齐。例如原有代码'ZC609'补齐之后变为'ZC1609')。主力连续合约UnderlyingSymbol+88,例如'IF88' ;指数连续合约命名规则为UnderlyingSymbol+99 .. py:attribute:: symbol 【str】股票:证券的简称,例如'平安银行'。期货:期货的简称,例如'沪深1005'。 .. py:attribute:: abbrev_symbol 【str】证券的名称缩写,在中国A股就是股票的拼音缩写,例如:'PAYH'就是平安银行股票的证券名缩写;在期货市场中例如'HS1005',主力连续合约与指数连续合约都为'null'。 .. py:attribute:: round_lot 【int】股票:一手对应多少股,中国A股一手是100股。期货:一律为1。 .. py:attribute:: sector_code(股票专用) 【str】板块缩写代码,全球通用标准定义 .. py:attribute:: sector_code_name(股票专用) 【str】以当地语言为标准的板块代码名 .. py:attribute:: industry_code(股票专用) 【str】国民经济行业分类代码,具体可参考下方“Industry列表” .. py:attribute:: industry_name(股票专用) 【str】国民经济行业分类名称 .. py:attribute:: listed_date 【str】股票:该证券上市日期。期货:期货的上市日期,主力连续合约与指数连续合约都为'0000-00-00'。 .. py:attribute:: de_listed_date 【str】股票:退市日期。期货:交割日期。 .. py:attribute:: type 【str】合约类型,目前支持的类型有: 'CS', 'INDX', 'LOF', 'ETF', 'Future' .. py:attribute:: concept_names(股票专用) 【str】概念股分类,例如:'铁路基建','基金重仓'等 .. py:attribute:: exchange 【str】交易所。股票:'XSHE' - 深交所, 'XSHG' - 上交所。期货:'DCE' - 大连商品交易所, 'SHFE' - 上海期货交易所,'CFFEX' - 中国金融期货交易所, 'CZCE'- 郑州商品交易所 .. py:attribute:: board_type(股票专用) 【str】板块类别,'MainBoard' - 主板,'GEM' - 创业板 .. py:attribute:: status(股票专用) 【str】合约状态。'Active' - 正常上市, 'Delisted' - 终止上市, 'TemporarySuspended' - 暂停上市, 'PreIPO' - 发行配售期间, 'FailIPO' - 发行失败 .. py:attribute:: special_type(股票专用) 【str】特别处理状态。'Normal' - 正常上市, 'ST' - ST处理, 'StarST' - \*ST代表该股票正在接受退市警告, 'PT' - 代表该股票连续3年收入为负,将被暂停交易, 'Other' - 其他 .. py:attribute:: contract_multiplier(期货专用) 【float】合约乘数,例如沪深300股指期货的乘数为300.0 .. py:attribute:: underlying_order_book_id(期货专用) 【str】合约标的代码,目前除股指期货(IH, IF, IC)之外的期货合约,这一字段全部为'null' .. py:attribute:: underlying_symbol(期货专用) 【str】合约标的名称,例如IF1005的合约标的名称为'IF' .. py:attribute:: maturity_date(期货专用) 【str】期货到期日。主力连续合约与指数连续合约都为'0000-00-00' .. py:attribute:: settlement_method(期货专用) 【str】交割方式,'CashSettlementRequired' - 现金交割, 'PhysicalSettlementRequired' - 实物交割 .. py:attribute:: product(期货专用) 【str】产品类型,'Index' - 股指期货, 'Commodity' - 商品期货, 'Government' - 国债期货
Instrument对象也支持如下方法:
合约已上市天数:
instruments(order_book_id).days_from_listed()
如果合约首次上市交易,天数为0;如果合约尚未上市或已经退市,则天数值为-1
合约距离到期天数:
instruments(order_book_id).days_to_expire()
如果策略已经退市,则天数值为-1
最小价格变动单位:
instruments(order_book_id).tick_size()
.. module:: rqalpha.const
.. py:class:: POSITION_DIRECTION .. py:attribute:: LONG 多方向 .. py:attribute:: SHORT 空方向
.. py:class:: SIDE .. py:attribute:: BUY 买 .. py:attribute:: SELL 卖
.. py:class:: POSITION_EFFECT .. py:attribute:: OPEN 开仓 .. py:attribute:: CLOSE 平仓 .. py:attribute:: CLOSE_TODAY 平今 .. py:attribute:: EXERCISE 行权 .. py:attribute:: MATCH 轧差
.. py:class:: ORDER_TYPE .. py:attribute:: MARKET 市价单 .. py:attribute:: LIMIT 限价单 .. py:attribute:: ALGO 算法单
.. py:class:: ORDER_STATUS .. py:attribute:: PENDING_NEW 待报 .. py:attribute:: ACTIVE 已报 .. py:attribute:: FILLED 全成 .. py:attribute:: CANCELLED 已撤 .. py:attribute:: REJECTED 拒单
.. py:class:: RUN_TYPE .. py:attribute:: BACKTEST 回测 .. py:attribute:: PAPER_TRADING 实盘模拟
.. module:: rqalpha.events
.. py:class:: EVENT .. py:attribute:: ORDER_PENDING_NEW 订单创建成功 .. py:attribute:: ORDER_CREATION_PASS 订单已报 .. py:attribute:: ORDER_CREATION_REJECT 订单创建被拒 .. py:attribute:: ORDER_PENDING_CANCEL 订单待撤 .. py:attribute:: ORDER_CANCELLATION_PASS 订单撤单成功 .. py:attribute:: ORDER_CANCELLATION_REJECT 订单撤单被拒 .. py:attribute:: ORDER_UNSOLICITED_UPDATE 订单已报被拒 .. py:attribute:: TRADE 成交