您可以点击右上角的clone按钮复制到自己的策略列表中进行修改和测试,非常简单。
需要注意,您在首次创建策略的时候需要指定策略交易的品种(股票,期货,或者两者混合)。需要注意,一旦策略创建完毕,交易品种将不能变更。
策略算法编辑页面是运行回测的入口,如下图所示:
您可以在策略编辑页面中进行以下参数的设置:基础参数:
高阶设置:
在设置完回测参数之后,您可以点击'编译策略'来对策略进行编译,发现其中是否有错误;或点击'运行回测'直接运行回测。两者的区别如下:
点击"运行回测"将会带您进入完整的回测结果页面。如果您的策略有编译/运行错误,您将会被停留在改编辑页面以让您先解决问题。
您可以在编写策略时通过以下方式初始化设置自定义参数:
define_parameter('param1','float',1.3,'comment1')define_parameter('param2','int',10,'comment2')define_parameter('param3','bool',True,'comment3')define_parameter('param4','str','test','comment4')definit(context):#通过p这一关键字获取对应自定义参数logger.info(p.param1)logger.info(p.param2)logger.info(p.param3)logger.info(p.param4)defbefore_trading(context):passdefhandle_bar(context,bar_dict):passdefafter_trading(context):pass
平安银行的价格在2015-04-10为19.80,在除权除息以后的2015-04-13价格变为16.54,如果什么也不做,就会导致K线上的价格在2015-04-13突然降低,复权的作用就是为了让股价连续,消除价格和指标的走势畸变。
常见的复权机制有前复权和后复权。前复权就是保持现有的价格不变,将以前的价格缩减,在K线上的表现就是将除权除息日之前的K线向下移动;后复权就是保持先前的价格不变,将以后的价格提高,在K线上的表现就是将除权除息日之后的K线向上移动。
为了解决这一问题,米筐回测使用的数据采用了“动态复权”方式,以策略回测当前日期为基准进行前复权。用同一个例子来说明:回测2016年-2017年,数据会使用策略回测当前日期(即2017年)的复权因子进行前复权,这样就可以排除未来数据的干扰。更加直观的图像如下图所示:
目前米筐的API提供两种不同的获得历史数据的方式:history_bars();get_price()。其中history_bars()返回的是动态复权的数据;get_price()返回的是前复权的数据,您可以根据自己的需求选择不同的方法。
您可以在策略编辑页面"更多"选项下进行基准合约的设置,基准合约可以设置为空。在初次创建策略的时候,包含股票的策略默认基准合约都是沪深300指数000300.XSHG;单独期货策略默认没有基准合约。
在进行期货交易时,您可以通过设置保证金倍率来进行保证金的调整,这一倍率需大于0。
调整依据基准是交易所规定的最低保证金比例,可以通过instruments这一方法查询到。您可以在策略编辑页面"更多"选项下进行保证金倍率设置。该设置在单一股票类型策略中不会出现。
在新版策略框架中,原有通过context.commission设置佣金费率的方式已经被废弃,不再生效。您需要在策略参数高级设置界面中进行佣金倍率的设置,1即代表为默认佣金费率的一倍。该倍率不会影响最低佣金以及印花税的收取标准。
备注系统支持在策略代码中按照期货合约品种自定义佣金费率和平今费率(此设置在模拟交易中同样生效):
__config__={"base":{"future_info":{#期货品种"SC":{#平仓费率"close_commission_ratio":0.0001,#开仓费率"open_commission_ratio":0.0002,#平今费率"close_commission_today_ratio":0,#BY_MONEY为按照名义价值收取,BY_VOLUME为根据成交合约张数收取"commission_type":"BY_MONEY",}}}}期权交易费用收取方式和期货类似,初始默认费率表如下请参考:
交易费用参考上金所交易条款,初始默认费率,如下请参考:
在最新的版本中,我们加入了允许用户自定义撮合机制的功能。您可以在策略编辑页面"更多"选项下选择不同的撮合机制。目前提供的撮合方式有以下三种:
1.当前收盘价。即当前bar发单,以当前bar收盘价作为参考价撮合。
2.下一开盘价。即当前bar发单,以下一bar开盘价作为参考价撮合
3.已方最优。tick回测专用[仅限期货],市价单将以己方最优报盘价格成交(无己方报盘时以最新价成交)。
4.对手方最优。tick回测专用[仅限期货],以发单时下一个tick对手方最优报盘价格作为参考价撮合成交(无对手盘时以最新价作为参考价)。
5.最新价。tick回测专用,市价单将以最新价成交
一个完整的撮合机制需要包括两个方面:参考价与投资者在下单时的委托方式。投资者可以选择的委托方式包括有限价单和市价单。限价单(LimitOrder)如果买单价格>=参考价,或卖单价格<=参考价,以参考价加入滑点影响成交。市价单(MarketOrder)直接以参考价加入滑点影响成交。
对于分钟回测与日回测来说,默认成交数量都不超过当前bar成交量的25%。一旦超过,市价单会在部分成交之后被自动撤单;限价单会一直在订单队列中等待下一个bar数据撮合成交,直到当日收盘。当日收盘后,所有未成交限价单都将被系统自动撤单。您可以在策略编辑页面"更多"选项下进行是否开启限制成交量,以及开启之后成交百分比的设置。对于tick回测来说则没有成交量的限制。
所以在“下一开盘价”的撮合方式下,handle_bar内发单之后立刻通过cancel_order对该订单进行撤单操作,是一定会撤单成功的。但在“当前收盘价”的撮合方式下则很可能撤单失败,因为“当前收盘价”中下单之后立刻撮合成交。
需要注意
举例来说,策略A设置每周一开盘进行调仓操作,先卖后买。那么,以下这种方式在分钟回测中无法实现卖出资金立刻释放的(在开启验资的风控情况下,可能导致后面的买入操作因资金不足而拒单):
#scheduler调用的函数需要包括context,bar_dict两个参数defrebalance(context,bar_dict):order_shares('000001.XSHE',-100)order_shares('601998.XSHG',100)definit(context):scheduler.run_weekly(rebalance,weekday=1)有如下几种情况无法完成下单:
另外需要注意的是,如果当时市场处于涨停或跌停这种单边市情况,买单(对应涨停),卖单(对应跌停)是无法成交的。尽管bar数据中可能成交量不为0.判断单边市的标准我们采用的是:当前bar数据的收盘价等于涨停价,则当前市场处于涨停状态。跌停也是类似处理。
为了更好模拟实际交易中订单对市场的冲击,我们引入滑点的设置。您可以在策略编辑页面"更多"选项下进行滑点设置,该设置将在一定程度上使最后的成交价"恶化",也就是买得更贵,卖得更便宜。目前支持的滑点类型有百分比和跳/手,百分比:按照成交价的一定比例进行恶化,取值范围[0,1),例如,当股票市价为10元,参数设为0.1,则回测时买入价为10+10*0.1=11元;跳/手:按照最小价格变动单位对成交价进行恶化,例如,上例中设置值为5,最终成交价将变成10.05
注意,滑点默认为0,原有的默认0.246%的滑点值以及通过context.slippage设置的方式被废弃。
开启该功能之后,策略回测完毕将会在回测详情页面的"性能分析"选项卡下查看策略运行性能报告。需要注意的是,开启该功能将会导致策略运行效率的下降。
在回测中您无须担心拆分对股票价格带来的影响因为我们已经在数据的预处理中准确地帮你做了这个工作。
在股息事件中有四个关键的日期:
1.方案实施公告日:公司公布股息分配方案的日期。
2.股权登记日:在股权登记日这一天收盘时仍持有或买进该公司的股票的投资者可以享有此次股息分红。
3.除权除息日:股权登记日的下一个交易日即是除权除息日,该日证券交易所会计算出股票的除权除息价,以作为投资者在除权除息日开盘的参考。
4.股息到帐日:现金股息划拨到投资者资金账户的日期。
当您的投资策略在股权登记日时仍持有分股息的股票,那么您的投资策略将有资格参与此次股息分红。在除权除息日结束的时候您投资组合中的DividendRecivable会增加对应持有股票的股息分红数目。然后在股息到帐日那天DividendRecivable将会被搬入投资组合中的AvailableCash-您最终拿到了应收股息分红的金额,并且可以用这笔钱进行再投资了。
红利再投资俗称利滚利,是指基金进行现金分红时,基金持有人将分红所得的现金以当天基金价格直接用于购买该基金,增加原先持有基金的份额。
开启该功能以后,基金分红将按照当日净值折算成基金份额。
通常可以通过日志来了解程序的行为,或者用日志类解决程序中暗藏的问题。同样的,您也可以在您的策略中通过日志来协助开发与调试策略。
譬如,您希望在第一个交易日打印一条日志,把这一天发单的情况打印出来。为了实现这一功能,您只需如下图所示在代码中调用日志类即可:
需要注意,回测中系统只会保存开始的10000条记录,多出的信息将无法被保存。在实盘模拟中,每天的日志上限是1000条。
支持股票、期货、期权、可转债、场内基金合约的日/分钟/tick级别的回测,上金所现货日级别回测。不同品种的标的在发单接口、费用计算、账户和仓位计算等方面有所差异。
支持A股和ETF、LOF等场内基金回测
支持期货回测
支持商品、股指、ETF期权回测(需开通量化企业版)。
支持可转换债券、场内公开交易的可交换债券、分离交易可转债(债券等)的回测(需开通量化企业版)。
支持上海黄金交易所交易的黄金、白银、铂金等现货合约的回测(需开通量化企业版)。
当您输入了这个组合键之后,Ricequant在线IDE就会进入股票代码搜索和自动完成模式,接着您可以输入任何一种进行搜索和自动补全:
如果您创建的是单一的期货策略,则必须在策略初始化的时候订阅(subscribe)有效期货合约。由于期货有到期日,所以您需要保证在回测期间,始终都有正在交易的合约被订阅。
您可以通过在'我的策略'下点击'向导式策略生成器'来通过向导式生成策略,如下图:
您可以通过选股设置实现投资域的筛选,并利用各类指标设置选股条件,最后对选出的股票进行排序。界面如下图:
该部分不仅支持不同股票池的偏好设置,还支持板块、行业、ST股这三个细分投资域的偏好设置。
界面左边是米筐提供的所有指标的展示区域,右边是您所选择指标的设置区域。基于购物车理念,您可以更加方便地对您选择的指标进行参数调整,界面如下图:
您可以通过点击选择指标,所选出的指标会右边“我的指标”中展示,并进行相应的设置。选股指标包含五个分类,具体详情如下:
其中,财务指标与财务数据的差异为,财务数据是原始数据,财务指标是基于财务数据得到的指标。
可用于排序的指标有四类,分别为行情指标、技术指标、财务指标、财务数据,比选股因子少了形态指标。
您可以利用选股指标对股票池粗筛选出的股票进一步进行筛选。您可在选股条件部分对选股指标的数值范围进行设置,如下图:
您可以在该部分进行如下功能的设置:
其中,对于技术指标,您可基于自己的偏好调整其对应的参数。
为了支持更多个性化规则,您也可以点击“添加自定义规则”,通过比对两个指标的数值大小,筛选出符合您条件的股票。
对于您筛选出的股票,您可以从排序指标中选出用于排序的指标,在排序条件部分对所选指标进行升序或降序的处理,并赋予不同的权重,从而实现对股票的排序。对于技术指标,您可以对其参数进行偏好设置。如下图:
您可以在模型选择中设置您策略所需要的模型,米筐提供两种模型,分别为定期轮动、条件触发。
定期轮动为定期调仓交易模型,您可以基于选出的股票,设置调仓周期、最大持仓股票数量。该模型会定期在调仓日卖出不符合选股条件的股票,等权买入符合条件的股票。界面如下图:
对于条件触发模型,您可以设置买入条件、卖出条件。界面如下:
区别于定期轮动模型,条件触发模型将调仓周期分为了三个周期,分别为选股周期、买入周期、卖出周期。
买入条件:
您可以在买入条件设置选股周期、买入周期、最大持仓股票数、个股最大持仓比重,同时可以通过对行情、技术指标、财务指标、财务数据、形态指标设置买入条件。这部分提供的指标及指标设置情况可参考选股指标、选股条件。
卖出条件:
您可以在卖出条件设置卖出周期,同时也可设置行情、技术指标、财务指标、财务数据、形态指标。这部分提供的指标及指标设置情况可参考选股指标、选股条件。
您可以在“风险控制”部分对策略的风险进行设置。风险控制支持对止盈止损、大盘择时(开仓)、大盘择时(平仓)的设置。如下图:
风险控制可以实现对用户策略的整个过程风险的全面控制。在开仓前,可以通过大盘择时来判断是否买入;在买入后,可以通过止盈止损和大盘择时(平仓)实现事后风控。
您可以在“策略回测”部分对回测的参数进行相应的设置,如下图所示:
可以设置的参数如下:
在设置完回测参数之后,可通过‘保存'按钮来保存您的所有设置;点击"运行回测"将会带您进入完整的回测结果页面,您可以查看更加详细的策略回测分析结果,帮助您对策略的表现实现更细致的评估。
当回测运行没有出错,回测结果页面将会载入您的投资组合的各种交易、盈亏和风险信息。
下图是回测结果的介绍:
回测收益率:策略在期限内的收益率。
基准收益率:相同条件下,一个简单的买入并持有基准合约策略的收益率(默认基准合约为沪深300指数,这里假设指数可交易,最小交易单位为1)。
每日收益率:通过投资组合权益计算出的日收益率。
最大回撤(maxdrawdown):在回测期内,在任一交易日往后推,策略总权益走到最低点时收益率回撤幅度的最大值。最大回撤是评估策略极端风险管理能力的重要指标。其计算方式如下:
夏普率(sharperatio):衡量策略相对于无风险组合的表现,是策略所获得风险溢价的度量——即如果策略额外承担一单位的风险,可以获得多少单位的收益作为补偿。
索提诺比率(sortinoratio):衡量策略相对于目标收益的表现。其使用下行波动率作为风险度量,因此区别于夏普率。在目前的计算中,我们使用无风险组合收益作为目标收益,以此作为区分向上波动和向下波动的标准。
信息比率(informationratio):衡量策略相对于市场基准组合的表现。一般用于评估纯多头的主动交易策略(包括阿尔法策略和基准择时策略)。需要注意的是,信息率不适用于多-空结合的对冲策略的表现评估。
在我们提供的三个风险调整后收益指标中,信息率用于评估投资组合相对于市场基准组合的表现,一般适用于纯多头的主动交易策略(包括阿尔法策略和基准择时策略);夏普率用于评估投资组合相对于无风险组合的表现,一般适用于多-空结合的交易策略(例如市场中性策略或配对交易策略),或没有公认市场基准组合的投资品种的交易策略(例如期货CTA策略)。
索提诺比率使用下行波动率作为风险度量,因而有别于信息率和夏普率。下行波动率区分了收益向上波动和向下波动两种情况,并认为收益向下波动才代表风险。因此,索提诺比率的优点,在于其使用的风险度量更为切合我们实际投资中面对的风险;而其缺点则是不如信息率和夏普率常用,认知度较低,且其目标收益(区分收益波动是向上还是向下的标准)的设定是任意的,并不依赖于任何基准组合(不同于信息比率)。因此,在横向对比不同策略或基金业绩时,我们需要使用统一的目标收益来区分向上波动和向下波动。在实际计算中,我们以无风险组合收益作为索提诺比率的目标收益。