模拟交易
当我们完成策略回测筛选,并且已经有tick回测结果后,在真正实盘之前,进行一段时间模拟交易测试是谨慎而且必要的。
宽易平台提供的模拟交易功能有如下特色:
可以完全不改动回测策略代码直接使用.
提供多个虚拟账户,可以自行设置初始资金。重启程序后可以自动重新加载账户数据,包括委托,成交,权益和持仓信息。
可以多策略组合交易,方便检验策略组合效果。
使用网页方便地跟踪查看委托成交持仓各种图表,随时监控策略运行
使用交易所实时tick和bar行情,无限贴近实战。
Notebook中直接进行模拟,复用平台资源,方便使用logger日志,写数据库,读历史行情各种操作。
管理模拟账户
在进行模拟交易之前,需要注册一个虚拟的模拟账户。
首先获取系统用户名,然后使用如下函数即可生成虚拟账户,初始资金设置为1000万。
from qedata import *
from qereal import *
user = %pwd ##魔术指令获取目录字符串
user = getuserid(user) ##转换为系统登录用户名
createSimuAccount(user, 10000000) ##创建模拟账户
该函数会返回一个唯一的通证token:
'a3981120cd4011ec969a950810b0ba6b'
通过这个token就可以访问该模拟账户。
读取模拟账户下的虚拟账户,一个模拟账户可以生成多个虚拟账户,我们可以通过下面这个函数来查看所有的虚拟账户
listSimuAccounts(user)
该函数会返回一个包含所有虚拟账户的list
['df92ff24d4b511ecbf7c2f0e4331f158',
'ecb35eecd4b511ecbf7c2f0e4331f158',
'f8a1c248d4b511ecaeeef3b3e61d7329',
'2e03c670d4b611eca6e8c9a61bf0ba9e',
'f64df00ed4b811eca2c8f788366c93b9',
'0ff36508d4c211ec9594b5417ec8a776',
'6e6958bad51f11eca31eafc606157cbf',
'06232a48d57d11eca206714d15baaabe',
'34a28954d57d11ecb8e7c71f48f78196',
'cef27ab2d57f11ec92c0fd72a31310af',
'17cab940d58311ec98a71970ec061d1c']
若生成的账户过多,还可以通过删除账户命令清除指定账户以外的所有废弃模拟账户。
removeSimuAccountData(user, excepts=['a3981120cd4011ec969a950810b0ba6b'])
管理模拟账户的两个函数详情,请参照模拟测试接口详细说明
模拟交易启动流程
还是拿一个最简单策略作为范例
from qereal import *
from qedata import *
#编写模拟交易策略
class mystrat(qeStratBase):
# 策略名mystrat, 带上qeStratBase
def __init__(self):
self.holding_flag = False # 是否有仓位的标识
self.instid = ['AG2206.SFE'] ## 合约列表必须提供
self.datamode = 'minute'
self.freq = 1
def onBar(self,context):
try:
print(context.bartime, get_bar(context, 1, 5))
if not self.holding_flag: #如果现在账户中没有仓位,就买入
make_order(context, instid=context.instid[0], direction=1, price=10000, \
volume=1,ordertype='market',action='open')
self.holding_flag = True #现在账户下有仓位
else: #如果现在账户中有仓位,就卖出
make_order(context, instid=context.instid[0],direction=-1, price=10000, volume=1, \
ordertype='market',action='close',closetype='closetoday')
self.holding_flag = False #现在账户下仓位被清完
except Exception as e:
print('handleData error', e.__traceback__.tb_lineno, e)
def crossDay(sellf, context):
cancel_order(context,0)
下面开始进行模拟交易测试
#最后调用执行runStrat函数
runStrat(user, 'simu', mystrat(), simu_token='a3981120cd4011ec969a950810b0ba6b')
注:若为Docker本地部署的宽易服务,那么还需要获得授权码,获得过程参见 获得授权码
runStrat 为宽易平台统一策略运行函数, 详细说明参加模拟测试接口详细说明
策略运行结果:
策略启动后,会自动生成一个监控网页供客户监控和查询策略运行情况。在网页地址中我们也可以直观的查看用户名,运行模式,虚拟账号的token和无风险利率。
将该网页地址复制到浏览器地址栏,就可以进入实时监控界面。
注:若中途停止了模拟交易,需要选择Notebook环境的菜单“服务”-“重启“, 然后点击 Restart以后才可以再次运行。
模拟交易的实时监控
Notebook中的程序运行过程中可能会出现连接超时或者页面被关闭但交易仍然在后台继续运行的情况.为了可以在无法操作交易界面情况下继续监控交易的运行情况并进行控制,我们需要一个网页版本的监控界面.在模拟交易开始后, 复制交易函数提示的网页链接在浏览器打开,就可以进入实时监控页面.
实时监控页面主要分为三部分:
1.基本信息与总控按钮(蓝色框,查看总资金仓位运行状态和统计信息, 控制进程停止) 2.列表(绿色框,查看成交,委托,持仓,权益和日志详情信息) 3.行情图(红色框,查看行情图和开平仓点)
基本信息与总控
主监控页面,可以进行以下功能: 1.查看当前账户名称,账户总资产价值,策略运行模式(模拟或实盘),进程运行状态 (所有数据动态更新)和回报率,夏普比例等统计信息。(统计信息只有当此虚拟账户运行超过2天时才会显示)2.对进程暂停运行操作。 使用部分界面如下
可用操作
点击上图红框中的蓝色按钮,我们可以终止进程。
行情图部分
这里主要用于监控各策略下各合约开平仓情况,以及价格走势图,实时刷新。该图只显示当前交易日信息,并在每日的20点切换交易日,即在每日的20点以后显示的是下一交易日的实时开平仓监控图。
tick级开平仓图
可用操作
不同策略和不同合约之间的切换
我们可以通过左上角红框中的下拉框,选择想要查看的策略与合约,在选择合约后,将自动切换成相应合约的开平仓图。
查看特定时刻的成交信息
如果我们想查看特定时刻的交易信息,我们可以把鼠标放在特定时刻的交易点上,此时我们可以看到上图红框中的此刻的具体交易信息,比如具体的时间和行情价格等。
使用游标查看特定时间段的开平仓信息
如果我们想查看特定时间段内的开平仓信息,我们可以左右滑动上图红框中的两个游标,选择我们想要查看的时间段。在选择完成后只会显示相应时间段的开平仓图。
bar图开平仓图
显示蜡烛图,来表示open开盘,close收盘,high最高,low最低四种给定时间间隔的关键价格,以及对应的交易量信息,红绿分别表示涨跌。
可用操作
与tick级开平仓图相同。
列表部分
列表页面可以进行以下功能: 该功能主要用于实时监控策略运行时委托/持仓/成交/账户/日志统计情况,该表格只显示当前交易日信息,并在每日的20点切换交易日,即在每日的20点以后显示的是新交易日的实时委托成交表. 委托和成交数据倒序排列,最顶部是最新的数据。在日志表中,可以通过日志表查看系统日志或者客户在策略代码中使用logger产生的日志.日志倒序排列.
成交表
在成交表中我们可以查询所有成交单的具体信息,包含他的合约名,订单号,时间等,索引是成交编号。
成交,委托,持仓,权益和日志五张表,可以通过红框内的tab切换,实时刷新。
委托表
在委托表中我们可以查询所有委托单的具体信息,包含合约名,订单号,平仓类型,价格等,索引是订单编号。
常见错误编号
▼ 常见错误说明
编号 | 说明 |
---|---|
1 | 保证金不足无法开仓 |
2 | 持仓不足无法平仓 |
持仓表
在持仓表中我们可以查询当前虚拟账户的持仓信息,包含成本仓位,多头持仓,多头昨仓等,索引是合约名。
权益表
在权益表中我们可以查询当前虚拟账户的账户信息,包含资金,当日手续费,保证金等,索引是账户token缩略。
日志
在日志表中,可以通过日志表查看系统日志或者客户在策略代码中使用logger产生的日志。日志倒序排列,索引是日志编号。
页面切换
在成交表,委托表和日志表中,可能会有大量记录,此时表格会对数据自动分页,每页保留100条记录。通过下图红框中的按钮选择想要查看的页数。
用户自定义日志
用户在策略中如果也期望使用日志功能, 把一些关键数据及时打印出来并且可以通过网页监控的话,可以使用如下方法:
代码示例:
vol=100
logger.info(f'The last value of "vol" is {vol}')
说明:
- logger已经在qereal中定义可以直接引用。
- logger平台支持error, warning, info三种level, 若为info将只记录在网页监控日志里。如果为error, warning在Notebook里面和网页监控里面都会输出。
- 参数必须是一个字符串,不可以像print一样多个字符串或变量。
- logger日志显示在网页监控日志中, 并输出时间,文件名和所在行数,以便于debug。
- logger日志可以保留五天,五天后循环删除。
模拟测试接口详细说明
获取合法用户名
getuserid(user)
参数:user, str类型。 用魔法函数 %pwd 获取的用户路径
返回值:str类型。 系统合法用户名
示例
user = %pwd
user = getuserid(user)
print(user)
返回值
'scott'
统一策略运行函数
runStrat(user, runmode, strat, simu_token=None, mode_724=False, csv_orders=False, simu_simnow724_account=None,\ real_account=None, printlog=True, rfrate=0.02, test_dynamic_instid=True, \ test_startdate=None,test_enddate=None, test_initcap=10000000,test_showchart=False)
详细使用说明如下
函数说明
参数表参数 | 类型 | 回测 | 模拟 | 实盘 | 说明 | 备注 |
---|---|---|---|---|---|---|
user | str | 是 | 是 | 是 | 系统登录用户名,可以通过getuserid函数获取. | |
runmode | str | 是 | 是 | 是 | 'test'回测,'simu'模拟,'real'实盘,一个参数切换运行模式. | |
strat | qeStratBase / list | 是 | 是 | 是 | qeStratBase派生策略或派生策略的列表,回测只支持单策略,输入列表仅第一项有效,模拟/实盘支持多策略并发 | |
simu_token | str | 否 | 是 | 否 | 模拟用令牌token。使用createSimuAccount创建的模拟账户时生成。 | |
mode_724 | bool | 否 | 是 | 是 | 是否使用SIMNOW 7x24小时模拟测试服务.默认False不使用,不使用时非市场开盘时间不可以运行模拟或实盘交易。若为True使用,但需要客户给出SIMNOW账户信息。 | |
csv_orders | bool | 否 | 是 | 是 | 是否使用csv下单工具.默认False不使用,True为使用,不可用于回测,详见 辅助工具相关说明。 | |
simu_simnow724_account | dict | 否 | 是 | 否 | 模拟用SIMNOW7*24小时账户信息,当模拟测试时 mode_724为True时,系统将检查该项账户配置,比如{'investorid':'133231','password':’888888'} | |
real_account | dict | 否 | 否 | 是 | 实盘交易使用的账户信息。若mode_724为True,该实盘账户应设置为SIMNOW7*24小时账户。详见实盘交易 | |
printlog | bool | 是 | 是 | 是 | 是否打印开平仓信息和warning信息。默认为True | |
rfrate | float | 是 | 是 | 是 | 无风险利率,用于计算sharp比率等,默认2% | |
test_dynamic_instid | bool | 是 | 否 | 否 | 是否使用动态合约回测模式,默认为True | |
test_startdate | str | 是 | 否 | 否 | 回测数据开始时间,比如'2021-01-01'.test_date不为None,此参数无效 | |
test_enddate | str | 是 | 否 | 否 | 回测数据结束时间,比如'2021-01-01'.test_date不为None,此参数无效 | |
test_initcap | float | 是 | 否 | 否 | 回测用初始资金,默认为10000000 | |
test_showchart | bool | 是 | 否 | 否 | 回测执行结果是否输出三张分析图,默认关闭 | |
real_skip_settle_check | bool | 否 | 否 | 是 | 是否skip实盘确认昨日结算单过程,默认为False.若用户自行打开设置为True,宽易不对任何结算单相关问题负责。 |
返回值
若为模拟/实盘模式,无返回值。若为回测模式,运行结束后返回Dict类型的回测报告。有‘Report’,'Orders','Trades','Cancels'四个Key
注意事项
- 若非7x24小时SIMNOW模式, 在非市场交易时间启动模拟,会返回“市场此时没有开盘”
- 模拟交易中途关闭程序,然后重启内核,重新运行程序后,会自动加载所有账户记录,包括委托、成交、持仓和权益信息,程序终止期间未成交订单均按照自动撤单处理。
创建模拟账户
createSimuAccount(user, initCap=10000000)
详细说明如下
▼ 函数说明
参数参数 | 类型 | 说明 |
---|---|---|
user | str | 系统登录用户名 |
initCap | float | 初始账户资金,默认为1000万人民币 |
返回值
该模拟账户的通证token
删除模拟账户
removeSimuAccountData(user, tokens=None, excepts=None)
该函数机制如下:
- 默认不设置后两个参数,该函数将删除该user名下所有模拟账户。
- 若设置了tokens,仅删除tokens中涉及到的模拟账户
- 若没有设置tokens,但设置了excepts, 那么删除除excepts列表以外所有其他模拟账户。
▼ 函数说明
参数参数 | 类型 | 说明 |
---|---|---|
user | str | 系统登录用户名 |
tokens | list of str | 需要删除的token列表。若该值不为None,那么只删除该列表中的token代表的模拟账户 |
excepts | list of str | 需要删除除此token列表之外的所有其他token。若tokens不为None,该参数无效。 |
返回值
该模拟账户的通证token
加载模拟账户
listSimuAccounts(user)
该函数机制如下:
- 加载当前user的所有已经存在的虚拟账户
- 若之前未创建虚拟账户,则会返回一个空的list
▼ 函数说明
参数参数 | 类型 | 说明 |
---|---|---|
user | str | 系统登录用户名 |
返回值
list类型,该模拟账户的所有token
修改模拟账户资金
setSimuAccountCapital(user, token, capital)
该函数机制如下:
- 加载当前user的以token标识的模拟账户数据
- 修改相应资金,然后再写入账户数据
▼ 函数说明
参数参数 | 类型 | 说明 |
---|---|---|
user | str | 系统登录用户名 |
token | str | 账户token标识 |
capital | float | 设置的资金数 |
返回值
无