MindGo量化交易平台股票回测引擎介绍,使用方法全在这里
<配资论坛>MindGo量化交易平台股票回测引擎介绍,使用方法全在这里配资论坛>
股票回测引擎
欢迎使用量化交易平台,本文档详细介绍了平台的股票回测引擎,内容较多,您可通过Ctrl+F进行关键字搜索。
如果您在使用过程中遇到帮助中无法解答的问题,您可以:
编写股票交易策略
#初始化账户
def init(context):
g.index='600519.SH'
def handle_bar(context,bar_dict):
close = history(g.index, ['close'], 20, '1d', False, fq = 'pre', is_panel=0)
MA5 = close['close'].values[-5:].mean()
#计算二十日均线价格
MA20 = close['close'].values.mean()
#如果五日均线大于二十日均线
if MA5 > MA20:
#使用所有现金买入证券
order_target_percent(g.index,1)
#记录本次买入
log.info("全仓买入{0}".format(g.index))
#如果五日均线小于二十日均线
if MA5 < MA20 :
#卖出所有证券
order_target_percent(g.index,0)
#记录本次卖出
log.info("全仓卖出{0}".format(g.index))
编译运行
1.您的策略必须在init()和()函数框架下实现:
2.完成策略编写后,选定回测开始日期和结束日期,选择初始资金、运行频率(每日或每分钟)等参数,点击"编译运行";

3.回测引擎根据您选择的运行频率调用函数,也就是执行该函数下的代码。回测引擎会实时显示策略当前时间的数据,如收益、风险指标、持仓等信息;

4.回测引擎会根据您所使用的下单方式进行下单,并根据后续实际成交情况进行订单处理;
5.您可以在任何时候调用函数来打印需要输出的日志;通过函数输出自定义图形。

#初始化账户
def init(context):
g.index='600519.SH'
def handle_bar(context,bar_dict):
close = history(g.index, ['close'], 20, '1d', False, fq = 'pre', is_panel=0)
MA5 = close['close'].values[-5:].mean()
#计算二十日均线价格
MA20 = close['close'].values.mean()
#设置交易信号
trade_signal=0
#如果五日均线大于二十日均线
if MA5 > MA20:
#使用所有现金买入证券
order_target_percent(g.index,1)
#记录本次买入
log.info("全仓买入{0}".format(g.index))
#记录买入信号
trade_signal=1
#如果五日均线小于二十日均线
if MA5 < MA20 :
#卖出所有证券
order_target_percent(g.index,0)
#记录本次卖出
log.info("全仓卖出{0}".format(g.index))
#记录卖出信号
trade_signal=-1
log.info(trade_signal)
record(trade_signal=trade_signal)
数据
提供海量优质的金融数据,以便您能实现策略逻辑
运行时间
1.开盘前(9:00)运行:
函数
2.盘中运行:
函数
>日回测(9:31:00)运行一次
>分钟回测(9:31:00-11:30,13:01:00-15:00:00),每分钟运行一次
>tick回测(9:30:03-11:30,13:00:03-15:00:00),每3秒钟运行一次
3.收盘后(15:30)运行:
函数
滑点
在实战交易中,往往最终成交价和预期价格有一定偏差,因此我们提供两种滑点模式来帮助您更好地模拟真实市场的表现:
拆分合并与分红
当股票发生拆分,合并或者分红时,股价会出现跳空缺口,为了消除这种价格变化对回测结果的影响,我们会根据个股除权除息信息对账户中的现金或持股数量进行相应的调整修正,并自动更新到您的信息中。
为了使回测结果更加准确,更加贴近实盘场景,我们做了如下处理:
订单处理
对于您在某个单位时间下的单,我们会做如下处理:
1.按天回测
A.交易价格:
>市价单:开盘价+滑点。
>限价单:委托价。
B.最大成交量:
>默认为下单当日总成交量的25%,该比例可通过市场参与度函数进行调整。
>若下单量低于最大成交量,则按下单量成交;若下单量大于最大成交量,则按最大成交量成交。
C.撮合方式:
>市价单:开盘下单,一次性撮合,不成交或未成交部分不再撮合。
>限价单:开盘下单,一次性撮合,不成交或未成交部分不再撮合。
2.分钟回测
A.交易价格:
>市价单:当前分钟起始价+滑点
>限价单:委托价
B.最大成交量:
>默认为下单当前分钟总成交量的25%,该比例可通过市场参与度函数进行调整。
>若下单量低于最大成交量,则按下单量成交;若下单量大于最大成交量,则按最大成交量成交。
C.撮合方式:
>市价单:分钟起始点下单,一次性撮合,不成交或未成交部分即刻取消委托。
>限价单:分钟起始点下单,之后每分钟均按分钟价量撮合一次,未成交部分顺延至下一分钟进行撮合,直到完全成交或者当天收盘为止。
3.注意:
1.一天结束后, 所有未完成的订单会被取消。
2.每次订单完成(完全成交)或者取消后,我们会根据成交量计算交易费(参见set_commission), 减少您的现金。
股票期货混合策略
风险模型
r=α+βf+μ
其中:r为股票收益率向量,β为因子暴露,μ为特质收益,f为因子收益率
当股票特质收益率与公共因子不相关时,组合预期风险可以分解为公共因子解释的风险及特质风险:
wΣw′=wβΩβ′w′+wΔw′
其中:w为组合成份股权重,Ω为因子收益率的协方差矩阵,Δ为股票的特质风险矩阵,我们假设股票的特质风险之间也互不相关,所以Δ是一个对角矩阵
组合优化器
组合优化器函数查询:
优化方式
组合优化器优化方式暂定为三种:最大化夏普比(MVO)、最大化信息比率、效用最大化(剔除成本影响)优化方式后期持续增加,例如L-B模型、风险平价模型等常用的资产配置模型。
约束条件
目前暂定七个约束条件:换手率、跟踪误差、组合风险、个股权重、风格因子主动暴露、行业因子主动暴露、行业中性。
组合归因
组合归因是对资产组合进行分析,将其回报和风险归到提前设定的可能的原因上。目前该功能可实现对股票型策略进行收益及风险拆分,主要分为分析和风格分析。
我们首先会对每一期的持仓表进行单期归因,然后将多期的结果使用进行累计。下面我们会介绍单期归因的算法和累计归因所得到的结果。
策略成功回测后,在回测详情页面点击组合归因功能,如下图:

组合归因详解一、组合归因
是目前最为人知的归因方案。除了需要组合持仓内容之外,还设定一个基准。最初的模型是把收益拆解为行业选择收益、个股选择收益和交叉收益,我们在传统模型基础上做了进一步的扩展,拆分出配置收益和交易收益。

对于各个拆分收益的计算如下:

上述指标的计算只针对单期的拆解,为了分析策略在一个周期里的收益归类,我们使用简化因子调整。
简化因子的计算方式如下:

RtMindGo量化交易平台股票回测引擎介绍,使用方法全在这里,bt为t期策略和基准的收益率;r,b为区间内策略和基准收益率。
使用简化因子对多期收益分解进行加和:

At,St,It为t期收益的分解项。
把收益按行业拆分,查看每个策略在每个行业是否带来了主动收益。图中主动收益展示的也是多期的收益率,通过因子进行调整。主动风险计算的是多期主动风险的方差,衡量多期主动收益的稳定性。主动权重是统计整个回测区间内各行业主动权重的均值。

二、风格分析风格因子代码因子名称含义备注
beta
beta
上市公司与指数之间的协同性
个股的Beta值,指数收益使用HS300
估值
记账价值和市值的比值
市净率=总市值/归属于母公司所有者权益合计
盈利
分析师预测与过去财年收益统计
成长
由销售额及盈利统计。
杠杆
上市公司的使用杠杆的情况。
流动性
由交易量和频率不同而带来的收益
动量
能量性指标,表示相对强度
从过去某一天开始,向过去再推504天,计算其每天的超额收益对数值,再针对这504天进行加权平均
非线性市值
上市公司的规模处于中等的程度
size
市值
上市公司的规模,即该公司是大盘股的程度
对数市值
波动率
对大盘偏离的不确定性
选取策略组合在回测期间的四个界面查看其当期的主动收益、主动风险及主动暴露度。相关的计算公式如下:



收益&风险指标—评定策略的优劣策略收益率—策略年化收益率— 基准收益率— 基准年化收益率— 超额收益率— 非系统性风险—Alpha系统风险—Beta夏普比率—收益波动率—
信息比率— Ratio最大回撤—Max 索提诺比率—跟踪误差— error下行波动率— Risk
调试功能
在策略编辑器左侧,点击"行号",设置断点后,点击"编译运行"启动调试程序。


对比功能
一般而言,量化策略会存在一个或多个参数股票策略回测平台,在验证策略逻辑的过程中,宽客们往往会尝试用不同的参数进行回测,比如在2018年,对平安银行采用双均线策略,采用不同周期的两条均线会使策略收益截然不同哦~
如何启动回测对比?
策略回测列表中,选取相应的回测,点击左上角的对比按钮,即可启动~


如何使用回测对比?
库
平台支持所有的基础库(),并支持目前流行的第三方库,例如NumPy,,Ta-Lib,-learn,等。主要模块介绍如下表所示。
库名版本简介网址
arch
4.1
提供了 模型,和
4.5.3
的爬虫包
1.1.8
提供了凸优化的解的库
0.13.4.1
用于计算文本相似度
0.2.0

的隐马尔可夫模型模块,类似-learn的API
jieba
0.38
的中文分词组件
0.1
深度学习库
2.0.1
2D绘图函数库
2.0.1
3D绘图函数库
numpy
1.12.1
的数值计算扩展
0.20.1
的数据分析包
pymc
2.3.6
机器学习中一个图模型库
pywt
0.5.2
的小波变换库
scipy
0.19.0
为科学和工程设计的工具包
0.7.1
的统计数据可视化库
0.18
的机器学习模块
0.8.0
可以研究数据,构架统计模型和进行统计测试
talib
0.4.10
用来对金融市场的数据进行技术分析
0.8.2
深度学习库
1.1.0
谷歌第二代人工智能学习系统
0.7.5
国内的开源数据库
xlrd
1.0.0
读取Excel的扩展工具
xlwt
1.1.2
写入Excel文件的扩展工具
为了保障平台的安全,以下的包和功能已被禁用,如有不便敬请见谅:
包属性和方法
os
sys
six
exec
eval
ast
【案例】MACD交易策略
#导入talib库
import talib
#初始化函数
def init(context):
#输入股票代码
g.security = '600519.SH'
#设置MACD模型参数
#短周期平滑均线参数
g.Short = 12
#长周期平滑均线参数
g.Long = 26
#DIFF的平滑均线参数
g.M = 9
#每日运行函数
def handle_bar(context, bar_dict):
#调用MACD计算函数,获取MACD值
macd = get_macd(g.security)
#判断金叉,且无持仓
if macd[-1]>0 and macd[-2]<0 and context.portfolio.market_value == 0:
#执行全仓买入
order_value(g.security,context.portfolio.available_cash)
#打印日志
log.info("买入 %s" % (g.security))
#判断死叉,且有持仓
if macd[-2]>0 and macd[-1]<0 and context.portfolio.market_value > 0:
#执行清仓
order_target(g.security,0)
#打印日志
log.info("卖出 %s" % (g.security))
#MACD计算函数
def get_macd(stock):
#获取数据
price = history(stock, ['close'], 500, '1d', True, 'pre', is_panel=1)['close']
#talib库调用MACD计算方法
DIFF, DEA, MACD = talib.MACD(price.values,
fastperiod = g.Short, slowperiod = g.Long, signalperiod = g.M)
#输出MACD值
return MACD
【案例】三因子选股模型
import pandas as pd
import numpy as np
import datetime
def init(context):
# 设置最大持股数
context.max_stocks = 10
#记录天数,隔20个交易日调仓
g.day = 0
def handle_bar(context, bar_dict):
if g.day%20 !=0:
return None
g.day = g.day +1
# 每个调仓日先清仓持有的股票
for security in list(context.portfolio.positions.keys()):
order_target(security, 0)
# 首先获得当前日期
time = get_datetime()
date = time.strftime('%Y%m%d')
# 获得股票池列表
sample = get_index_stocks('000300.SH',date)
# 创建字典用于存储因子值
df = {'security':[], 1:[], 2:[], 3:[], 'score':[]}
# 因子选择
for security in sample:
q=query(
profit.roic,# 投资回报率
valuation.pb,# 市净率
valuation.ps_ttm,# 市销率
).filter(
profit.symbol==security
)
# 缺失值填充为0
fdmt = get_fundamentals(q, date=date).fillna(0)
# 判断是否有数据
if (not (fdmt['profit_roic'].empty or
fdmt['valuation_pb'].empty or
fdmt['valuation_ps_ttm'].empty)):
# 计算并填充因子值
df['security'].append(security)
df[1].append(fdmt['profit_roic'][0])# 因子1:投资回报率
df[2].append(fdmt['valuation_pb'][0])# 因子2:市净率
df[3].append(fdmt['valuation_ps_ttm'][0])#因子3:市销率
for i in range(1, 4):
# 因子极值处理,中位数去极值法
m = np.mean(df[i])
s = np.std(df[i])
for j in range(len(df[i])):
if df[i][j] <= m-3*s:
df[i][j] = m-3*s
if df[i][j] >= m+3*s:
df[i][j] = m+3*s
m = np.mean(df[i])
s = np.std(df[i])
# 因子无量纲处理,标准化法
for j in range(len(df[i])):
df[i][j] = (df[i][j]-m)/s
# 计算综合因子得分
for i in range(len(df['security'])):
# 等权重计算(注意因子方向)
s = (df[1][i]-df[2][i]-df[3][i])
df['score'].append(s)
# 按综合因子得分由大到小排序
df = pd.DataFrame(df).sort_values(by ='score', ascending=False)
# 等权重分配资金
cash = context.portfolio.available_cash/context.max_stocks
# 买入新调仓股票
for security in df[:context.max_stocks]['security']:
order_target_value(security, cash) 本文 配资论坛 原创,转载保留链接!网址:http://gxdysm.com/post/519.html
【原创声明】本文为配资论坛原创作品,著作权归作者所有。未经作者书面授权,禁止任何形式的转载、复制或使用。违者将依法追究法律责任。











