#导入函数库importjqdata#初始化函数,设定基准definitialize(context):#定义一个全局变量,保存要操作的股票#方式一:操作一只股票#g.security='601318.XSHG'#中国平安股票#方式二:操作多只股票#g.security=['601101.XSHG','601106.XSHG']#方式三:操作指数成分股g.security=get_index_stocks('000300.XSHG')#沪深300print(g.security)执行显示沪深300指数成分股:
开启真实价格回测功能很简单,只需一步即可搞定:在initialize中使用set_option。
#导入函数库importjqdata#初始化函数,设定基准definitialize(context):#定义一个全局变量,保存要操作的股票#方式一:操作一只股票#g.security='601318.XSHG'#中国平安股票#方式二:操作多只股票#g.security=['601101.XSHG','601106.XSHG']#方式三:操作指数成分股g.security=get_index_stocks('000300.XSHG')#沪深300set_option('use_real_price',True)由于沪深300不存在分红和股票拆合,显示效果和上图一致。
在模拟交易中,在未开启动态复权(真实价格)模式时,我们是使用基于模拟交易创建日期的后复权价格。
后复权模式示意图如下图所示:
不开启真实价格模拟盘的运算结果是没有错误,只是会理解起来更费劲一些。
如果想知道今天的真实价格,还需知道模拟创建的日期,并进行复权计算。为了让用户使用更便于理解、更真实的模拟系统,强烈建议开启动态复权(真实价格)模式。开启方式:在代码中调用set_option('use_real_price',True)。
开启动态复权(真实价格)模式示意图如下图所示:
开启动态复权(真实)模式后,看到的价格都是最新的,每到新的一天,如果持仓中有股票发生了拆合或者分红或者其他可能影响复权因子的情形,会根据复权因子自动调整股票的数量.。但不要跨日期缓存这些API返回的结果。
交易税费包含券商手续费和印花税。可以通过set_order_cost来设置具体的交易税费的参数。
set_order_cost(cost,type,ref=None)修改代码如下所示:
#导入函数库importjqdata#初始化函数,设定基准definitialize(context):#定义一个全局变量,保存要操作的股票#方式一:操作一只股票#g.security='601318.XSHG'#中国平安股票#方式二:操作多只股票#g.security=['601101.XSHG','601106.XSHG']#方式三:操作指数成分股g.security=get_index_stocks('000300.XSHG')#沪深300set_option('use_real_price',True)#股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税,每笔交易佣金最低扣5块钱set_order_cost(OrderCost(#OrderCost对象open_tax=0,#买入时印花税close_tax=0.001,#卖出时印花税open_commission=0.0003,#买入时佣金close_commission=0.0003,#卖出时佣金close_today_commission=0,#平今日仓佣金min_commission=5#最低佣金),type='stock'#股票)(1)券商手续费中国A股市场目前为双边收费,券商手续费系默认值为万分之三,即0.03%,最少5元。
印花税对卖方单边征收,对买方不再征收,系统默认为千分之一,即0.1%。
注意:针对特定的交易品种类别设置手续费时,必须将ref设为None;若针对特定的交易品种或者标的,需要将type设置为对应的交易品种类别,将ref设置为对应的交易品种或者标的。
该函数在回测中的非交易日是不会触发的(如回测结束日期为2016年1月5日,则程序在2016年1月1日-3日时,handle_data不会运行,4日继续运行)。
#导入函数库importjqdata#初始化函数,设定基准definitialize(context):#定义一个全局变量,保存要操作的股票#方式一:操作一只股票#g.security='601318.XSHG'#中国平安股票#方式二:操作多只股票#g.security=['601101.XSHG','601106.XSHG']#方式三:操作指数成分股g.security=get_index_stocks('000300.XSHG')#沪深300set_option('use_real_price',True)#股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税,每笔交易佣金最低扣5块钱set_order_cost(OrderCost(#OrderCost对象open_tax=0,#买入时印花税close_tax=0.001,#卖出时印花税open_commission=0.0003,#买入时佣金close_commission=0.0003,#卖出时佣金close_today_commission=0,#平今日仓佣金min_commission=5#最低佣金),type='stock'#股票)defhandle_data(context,data):print('Hello')执行效果如下所示:
该方法返回值是一个dict,其中key是股票代码,value是拥有最新价、涨停价、跌停价等属性对象。
value值对应的属性对象:
defhandle_data(context,data):print(get_current_data()['601318.XSHG'].name,get_current_data()['601318.XSHG'].industry_code,get_current_data()['601318.XSHG'].day_open,get_current_data()['601318.XSHG'].high_limit,get_current_data()['601318.XSHG'].low_limit,)输出结果如下所示:
attribute_history:获取历史数据,可查询单个标的多个数据字段,返回数据格式为DataFrame或Dict(字典)。
attribute_history(security,count,unit='1d',fields=['open','close','high','low','volume','money'],skip_paused=True,df=True,fq='pre')查看某一支股票的历史数据,可以选这只股票的多个属性,默认跳过停牌日期。当取天数据时,不包括当天的,即使是在收盘后;分钟数据包括当前分钟的数据;
defhandle_data(context,data):#print(#get_current_data()['601318.XSHG'].name,#get_current_data()['601318.XSHG'].industry_code,#get_current_data()['601318.XSHG'].day_open,#get_current_data()['601318.XSHG'].high_limit,#get_current_data()['601318.XSHG'].low_limit,#)print(attribute_history('601318.XSHG',#股票代码5#每天返回前5天的历史数据))执行显示效果如下:
按股数下单。
order(security,amount,style=None,side='long',pindex=0,close_today=False)买卖标的。调用成功后,您将可以调用[get_open_orders]取得所有未完成的交易,也可以调用[cancel_order]取消交易。
-security:标的代码-amount:交易数量,正数表示买入,负数表示卖出-style:参见[OrderStyle](#OrderStyle),None代表MarketOrder-side:'long'/'short',操作多单还是空单。默认为多单,**股票、基金暂不支持开空单**。-pindex:在使用set_subportfolios创建了多个仓位时,指定subportfolio的序号,从0开始,比如0指定第一个subportfolio,1指定第二个subportfolio,**默认为0**。-close_today:平今字段,close_today:平今字段,仅对上海国际能源中心,上海期货交易所,中金所生效,其他交易所将会报错(其他交易所没有区分平今与平昨,均按照先开先平的方法处理)。-对上海国际能源中心,上海期货交易所,中金所的标的:-close_today=True,只平今仓-close_today=False,优先平昨仓,昨仓不足部分平进仓**返回**Order对象或者None,如果创建订单成功,则返回Order对象,失败则返回None(2)买入下单示例defhandle_data(context,data):#每天买入100股order('601318.XSHG',100)显示效果:
需要注意,开仓股票数量必须是100的整数倍,如果设置为110,会自动调整为100。
order_value按价值下单。
order_value(security,value,style=None,side='long',pindex=0,close_today=False)(1)参数-security:股票名字-value:股票价值,value=最新价*手数*保证金率(股票为1)*乘数(股票为100)-style:参见[OrderStyle](#OrderStyle),None代表MarketOrder-side:'long'/'short',操作多单还是空单。默认为多单。默认为多单,**股票、基金暂不支持开空单**。-pindex:在使用set_subportfolios创建了多个仓位时,指定subportfolio的序号,从0开始,比如0为指定第一个subportfolio,1为指定第二个subportfolio,**默认为0**。-close_today:平今字段,close_today:平今字段,仅对上海国际能源中心,上海期货交易所,中金所生效,其他交易所将会报错(其他交易所没有区分平今与平昨,均按照先开先平的方法处理)。-对上海国际能源中心,上海期货交易所,中金所的标的:-close_today=True,只平今仓-close_today=False,优先平昨仓,昨仓不足部分平进仓**返回**Order对象或者None,如果创建委托成功,则返回Order对象,失败则返回None(2)示例defhandle_data(context,data):#每天花10000买股票order_value('601318.XSHG',10000)显示效果:
order_target(security,amount,style=None,side='long',pindex=0,close_today=False)买卖标的,使最终标的的数量达到指定的amount,注意使用此接口下单时若指定的标的有未完成的订单,则先前未完成的订单将会被取消。
-security:标的代码-amount:期望的最终数量-style:参见[OrderStyle](#OrderStyle),None代表MarketOrder-side:'long'/'short',操作多单还是空单。默认为多单。默认为多单,**股票、基金暂不支持开空单**。-pindex:在使用set_subportfolios创建了多个仓位时,指定subportfolio的序号,从0开始,比如0为指定第一个subportfolio,1为指定第二个subportfolio,**默认为0**。-close_today:平今字段,close_today:平今字段,仅对上海国际能源中心,上海期货交易所,中金所生效,其他交易所将会报错(其他交易所没有区分平今与平昨,均按照先开先平的方法处理)。-对上海国际能源中心,上海期货交易所,中金所的标的:-close_today=True,只平今仓-close_today=False,优先平昨仓,昨仓不足部分平进仓**返回**Order对象或者None,如果创建委托成功,则返回Order对象,失败则返回None(2)示例#卖出平安银行所有股票order_target('000001.XSHE',0)#买入平安银行所有股票到100股order_target('000001.XSHE',100)6、目标价值下单order_target_value(security,value,style=None,side='long',pindex=0,close_today=False)调整标的仓位到value价值,金融期货暂不支持该API。
注意使用此接口下单时若指定的标的有未完成的订单,则先前未完成的订单将会被取消。
-security:标的名字-value:期望的标的最终价值,value=最新价*手数*保证金率(股票为1)*乘数(股票为100)-style:参见[OrderStyle](#OrderStyle),None代表MarketOrder-side:'long'/'short',操作多单还是空单。默认为多单。-pindex:在使用set_subportfolios创建了多个仓位时,指定subportfolio的序号,从0开始,比如0为指定第一个subportfolio,1为指定第二个subportfolio,**默认为0**。(2)示例#卖出平安银行所有股票order_target_value('000001.XSHE',0)#调整平安银行股票仓位到10000元价值order_target_value('000001.XSHE',10000)三、实现一个简单量化策略1、策略内容设置股票池为沪深300的所有成分股
如果当前股价小于10元/股且当前不持仓,则买入;
如果当前股价比买入时上涨了25%,则清仓止盈;
如果当前股价比买入时下跌了10%,则清仓止损。
红线是基准收益,set_benchmark方法可用来设置基准。表示的是从买入第一天开始持仓一直到最后的收益。
蓝线是策略收益,在这里可以很清楚看到策略收益小于基准收益,说明该交易策略不可行。