TestReport 对象 全新的VBA策略回测对象,该对象提供一整套测试环境, 让VBA的策略开发也可以像PEL语言一样进行策略测试

Discussion in '金字塔决策交易系统' started by Superview, Aug 20, 2014.

  1. TestReport 对象描述



    该对象是金字塔3.3版后将提供一个全新的VBA策略回测对象,该对象提供一整套测试环境, 让VBA的策略开发也可以像PEL语言一样进行策略测试. 使用VBA直接控制测评的最大好处在于用户可以利用VBA语法直接高效控制测试流程,实现众多PEL无法完成的测试事项,并且代码可以经过少量修改就可以实盘操作.

    注意:
    该对象的测试规则与PEL语言一样为单向持仓,不允许双向持仓.
    测试费率使用 交易菜单->合约信息设置 里的资费设置.
    该对象仅提供测评功能实现, 开平仓后的持仓均为虚拟持仓,非正式交易环境. 若想实盘交易,请参考 Order 对象



    使用评测时属性

    InitCash 初始投入资金,单位(元)

    OpenLossPrice 开仓滑点,单位(最小变动价位)

    CloseLossPrice 平仓滑点,单位(最小变动价位)

    ReportType 测试报告类型, 0为专业测试报告;1为普通测试报告(比专业测试报告节省更多内存)

    ReportName 测试报告名称

     

    使用评测时方法

    StartAndInit 开始并初始化一个新的测试报告系统

    AddTestStock 添加测试品种至测试报告系统

    StepIt 步进测试报告,该方法通常用在一个测试循环的最后一部,告知测试系统做一些循环测试的后续工作

    ShowReport 测试完毕后显示策略报告

     

    交易系统

    Buy 交易系统评测开多操作

    Sell 交易系统评测平多操作

    BuyShort 交易系统评测开空操作

    SellShort 交易系统评测平空操作

    Holding 测评模式下的持仓量,多仓返回正数空仓返回负数

    Cash 得到测试模式下当前可用资金余额, 例如Cash(0)表示多头方向的余额,Cash(1)表示空头方向的余额

    ANNUALRETURNRATE 得到测试模式下当前的年化收益率, 算法:净利润/交易时间。交易时间不足一年的部分,以(自然日/365)处理。

    AVGENTERPRICE 当前持有品种的平均持仓成本——最近空仓以来计

    ASSET 得到测试模式下当前的净自有资产, 算法:可用现金+占用保证金-融资(现金+品种市值-融资)

    AvgLoss 得到测试模式下当前平均亏损. 算法:平均亏损=总亏损/亏损交易次数

    AVGLOSSPERIOD 得到测试模式下当前平均亏损周期,算法:平均亏损周期=亏损交易持仓周期/亏损交易次数

    AVGPAYOFF 得到测试模式下当前平均盈亏.算法:平均盈亏=净利润/交易次数.

    AvgWin 得到测试模式下当前平均盈利,算法:平均盈利=总盈利/盈利交易次数

    AVGWINPERIOD 得到测试模式下当前平均盈利周期,算法:平均盈利周期=盈利交易持仓周期/盈利交易次数

    BESTPERCENT 得到测试模式下当前最大利润率,统计策略根据历史数据运行至今出现所有交易中利润率最大一次的利润率,其数值在0—1之间

    BESTTRADE 得到测试模式下当前最大盈利额,统计策略根据历史数据运行至今出现所有交易中盈利最大一次的利润额

    ENTERBARS 得到测试模式下当前开仓历时,返回上次开仓到当前的周期数,若之前没有开仓记录返回-1

    ENTERPRICE 得到测试模式下当前上次开仓价

    ENTERVOL 得到测试模式下当前上次开仓量

    EXITBARS 得到测试模式下当前平仓历时,返回上次平仓到当前的周期数,若之前没有平仓记录返回-1

    EXITPRICE 得到测试模式下当前上次平仓价

    EXITVOL 得到测试模式下当前上次平仓量

    GROSSLOSS 得到测试模式下当前总亏损额,算法:总亏损=策略亏损总额(未扣除手续费)

    GROSSPROFIT 得到测试模式下当前总盈利额,算法:总盈利=策略盈利总额(未扣除手续费)

    MAXDRAWDOWN 得到测试模式下当前最大回撤资金,算法:指资产(权益)曲线出现一个新的最高点后,此高点与其之后的最低点的差值。

    MAXDRAWDOWNPCT 得到测试模式下当前最大回撤幅度,算法:指资产(权益)曲线出现一个新的最高点后,此高点与其之后的最低点的回撤幅度。

    MAXSEQLOSS 得到测试模式下当前最大连亏次数,统计策略根据历史数据运行至今出现连续亏损交易的最大次数

    MAXSEQWIN 得到测试模式下当前最大连盈次数,统计策略根据历史数据运行至今出现连续盈利交易的最大次数

    NETPROFIT 得到测试模式下当前净利润,算法:统计策略所获取盈利或损失的总额.函数返回值为净利润值。

    NUMLOSSTRADE 得到测试模式下当前亏损次数,统计策略根据历史数据运行至今出现过连亏情况的总次数。每出现一次连亏的情况,数值+1。注意每次平仓算一次交易,而开仓不算

    NUMPROFIT 得到测试模式下当前交易盈亏,得到指定交易的盈亏数额,平仓一次算一次交易,开仓不算。用法:NUMPROFIT(N),取第距离现在第N次交易的盈亏数额。例如:NUMPROFIT(1)表示最近一次的盈亏数额。

    NUMSEQLOSS 得到测试模式下当前连亏次数,统计策略根据历史数据运行至今出现过连亏情况的总次数。每出现一次连亏的情况,数值+1。注意每次平仓算一次交易,而开仓不算

    NUMSEQWIN 得到测试模式下当前连盈次数,统计策略根据历史数据运行至今出现过连亏情况的总次数。每出现一次连亏的情况,数值+1。注意每次平仓算一次交易,而开仓不算

    NUMWINTRADE 得到测试模式下当前盈利次数,统计策略根据历史数据运行至今出现过连亏情况的总次数。每出现一次连亏的情况,数值+1。注意每次平仓算一次交易,而开仓不算

    OPENBAR 得到测试模式下当前开仓历时,上一次仓位=0以来的周期数

    OPENPROFIT 得到测试模式下当前浮动盈亏,当前浮动盈亏(当前持仓市值与持仓成本之差)

    PAYOFFRATE 得到测试模式下当前盈亏比,算法:盈亏比=总盈利/总亏损

    PERCENTWIN 得到测试模式下当前交易胜率,统计策略根据历史数据运行至今出现盈利交易占总交易次数的比例,其数值在0—1之间

    PROFITFACTOR 得到测试模式下当前盈利因子,算法:盈利因子=平均盈利/平均亏损

    PROFITRISKRATIO 得到测试模式下当前收益风险比,算法:收益风险比=年化收益率/最大资产回撤幅度:即MAR比率。这是最常用的风险报酬比指标。考察让资产平均每年增值的幅度与需承受的最大资产回撤幅度的关系。

    SEQLOSS 得到测试模式下当前最大连亏金额,当前位置之前最大连续亏损额,注意每次平仓算一次交易,而开仓不算

    SEQWIN 得到测试模式下当前最大连盈金额,当前位置之前最大连续盈利额,注意每次平仓算一次交易,而开仓不算

    SHARPRATE 得到测试模式下当前夏普率,

    TOTALDAYTRADE 得到测试模式下当前日内交易次数,当前位置之前总共有多少次当日的交易,注意每次平仓算一次交易,而开仓不算

    TOTALTRADE 得到测试模式下当前交易次数,统计策略根据历史数据运行至今出现总共有多少次交易,注意每次平仓算一次交易,而开仓不算

    TYPE 得到测试模式下当前上N次信号类型,得到当前位置之前上N次信号类型输出:0、无信号1、开多2、平多3、开空;4、平空. 用法:TYPE(N)

    TYPEBAR 得到测试模式下当前类信号历时,得到当前位置之前上N次信号指定类型距当前周期,用法:TYPEBAR(N,TYPE)N表示上次信号,TYPE表示信号类型 0、无信号1、开多2、平多3、开空;4、平空 例如:TYPEBAR(2,1)表示:倒数第2个开多信号历时

    WORSTPERCENT 得到测试模式下当前最大亏损率,统计策略根据历史数据运行至今出现所有交易中亏损率最大一次的利润率,其数值在0—1之间

    WORSTTRADE 最大亏损额,统计策略根据历史数据运行至今出现所有交易中亏损最大一次的亏损额

     

    公共方法属性(仅对专业测试报告有效)

    DetailCount 交易明细数量,若出错则返回-1

    GetDetailItem 得到交易名细项

    ItemType 得到当前打开的测试报告类别,返回值1-34,例如: 1为总体概要 34为组合收益图 ,若出错则返回-1

    ItemListCount 得到测试报告项数据量,仅当打开的是列表式报告项时有效,出错或失败返回-1

    GetItemText 得到测试报告项内容,仅当打开的是列表式报告项时有效

    SetItemText 设置测试报告项内容,仅当打开的是列表式报告项时有效

    InsertItem 在报表下方添加新的行
     

    事件(仅对专业测试报告有效)

    ItemChanged 当切换报表项时触发该事件
     
  2. 部分使用范例


    范例1
    单品种双向交易,5日均线大于收盘价平空做多,反之平多做空
    Sub Test1()
    Testreport.StartAndInit '开始测评系统的准备工作
    Testreport.InitCash=100*10000 '初始资金100万
    Testreport.ReportType = 0'使用专业测试报告
    marketdata.HistoryDataMode = 0 'GetHistoryData函数使用共享内存模式
    Set HistroyData = marketdata.GetHistoryData("if00","zj",5)'取股指连续的日线数据

    If TestReport.AddTestStock(HistroyData,"IF00","ZJ",0) < 1 Then '向测试报告系统添加一个新测试品种
    MsgBox "请正确添加品种"
    End If

    Dim data '创建一个变量
    '创建Array外部对象,将对象实例置变量data中, 用来暂存收盘价,计算均价
    Set data = CreateObject("Stock.Array")


    '下面的代码控制循环测试
    '策略逻辑, 5日均线上穿收盘价做多, 下破收盘价平多
    For i = 0 to HistroyData.Count-1
    data.AddBack(HistroyData.Close(i)) '添加数组数据
    If data.Count > 5 Then '如果数组数据大于5个就删除第一个,保证数组只有5个大小
    data.Removeat(0)
    End If

    If Data.Count >= 5 Then
    AvgPrice = data.Average

    if HistroyData.Close(i) > AvgPrice Then '均价之上平空开多
    If TestReport.Holding < 0 Then
    TestReport.SellShort 0,HistroyData.Close(i)
    End IF

    If TestReport.Holding = 0 Then
    TestReport.Buy 1, HistroyData.Close(i)
    End If
    End if

    if HistroyData.Close(i) < AvgPrice Then '下破均价平多开空
    If TestReport.Holding > 0 Then
    TestReport.Sell 0, HistroyData.Close(i)
    End If

    If TestReport.Holding = 0 Then
    TestReport.BuyShort 1,HistroyData.Close(i)
    End if
    End if
    End if

    '测试完毕强平持仓
    If i = HistroyData.Count-1 Then
    If TestReport.Holding < 0 Then
    TestReport.SellShort 0,HistroyData.Close(i)
    End IF
    If TestReport.Holding > 0 Then
    TestReport.Sell 0, HistroyData.Close(i)
    End If
    End If

    '显示测试时当前的资产,可以这个语句调试,检测当前测试时的变量状态
    Application.msgout TestReport.ASSET

    '为步进下一个数据做准备
    TestReport.StepIt i
    Next

    '测试完毕显示测试报告
    Testreport.ShowReport

    set data = Nothing'对象使用完毕后释放对象
    '数据处理完毕后,清理缓冲区
    marketdata.DestroyHistoryData

    End Sub

    范例2'测试2个品种单向交易5日均线大于收盘价平空做多,反之平多做空
    Sub Test2()
    Testreport.StartAndInit '开始测评系统的准备工作
    Testreport.InitCash=100*10000 '初始资金100万

    '///////////////////////////////////////////////
    '添加第一个股指连续品种测试
    Set HistroyData = marketdata.GetHistoryData("if00","zj",5)'取股指连续的日线数据

    If TestReport.AddTestStock(HistroyData,"IF00","ZJ",0) < 1 Then '向测试报告系统添加一个新测试品种
    MsgBox "请正确添加品种"
    End If

    Dim data '创建一个变量
    '创建Array外部对象,将对象实例置变量data中, 用来暂存收盘价,计算均价
    Set data = CreateObject("Stock.Array")

    '下面的代码控制循环测试
    '策略逻辑, 5日均线上穿收盘价做多, 下破收盘价平多
    For i = 0 to HistroyData.Count-1
    data.AddBack(HistroyData.Close(i)) '添加数组数据
    If data.Count > 5 Then '如果数组数据大于5个就删除第一个,保证数组只有5个大小
    data.Removeat(0)
    End If

    If Data.Count >= 5 Then
    AvgPrice = data.Average

    if HistroyData.Close(i) > AvgPrice And TestReport.Holding = 0 Then '上穿均价开多
    TestReport.Buy 1, HistroyData.Close(i)
    End if

    if HistroyData.Close(i) < AvgPrice And TestReport.Holding > 0 Then '下破均价平多
    TestReport.Sell TestReport.Holding, HistroyData.Close(i)
    End if
    End if

    '为步进下一个数据做准备
    TestReport.StepIt i
    Next

    '///////////////////////////////////////////////
    '添加第二个螺纹钢连续品种测试
    Set HistroyData = marketdata.GetHistoryData("rb00","sq",5)'取螺纹钢连续的日线数据

    If TestReport.AddTestStock(HistroyData,"RB00","SQ",0) < 1 Then '向测试报告系统添加一个新测试品种
    MsgBox "请正确添加品种"
    End If

    data.Removeall '清空数组

    '下面的代码控制循环测试
    '策略逻辑, 5日均线上穿收盘价做多, 下破收盘价平多
    For i = 0 to HistroyData.Count-1
    data.AddBack(HistroyData.Close(i)) '添加数组数据
    If data.Count > 5 Then '如果数组数据大于5个就删除第一个,保证数组只有5个大小
    data.Removeat(0)
    End If

    If Data.Count >= 5 Then
    AvgPrice = data.Average

    if HistroyData.Close(i) > AvgPrice And TestReport.Holding = 0 Then '上穿均价开多
    TestReport.Buy 1, HistroyData.Close(i)
    End if

    if HistroyData.Close(i) < AvgPrice And TestReport.Holding > 0 Then '下破均价平多
    TestReport.Sell TestReport.Holding, HistroyData.Close(i)
    End if
    End if

    '为步进下一个数据做准备
    TestReport.StepIt i
    Next

    '测试完毕显示报告
    Testreport.ShowReport

    set data = Nothing'对象使用完毕后释放对象
    '数据处理完毕后,清理缓冲区
    marketdata.DestroyHistoryData
    End Sub
     
  3. 范例3
    该范例主要演示使用分段数据分段进行评测,比如我们可以调用一天天的分笔数据进行测试
    Sub Test3()
    Testreport.StartAndInit '开始测评系统的准备工作
    Testreport.InitCash=100*10000 '初始资金100万

    '取历史分笔数据
    Set MinuteData = marketdata.GetHistoryMinuteData("if00","zj","2014-07-11")
    Set HistroyData = marketdata.Changedata(MinuteData)

    If TestReport.AddTestStock(HistroyData,"IF00","ZJ",0) < 1 Then '向测试报告系统添加一个新测试品种
    MsgBox "请正确添加品种"
    End If

    Dim data '创建一个变量
    '创建Array外部对象,将对象实例置变量data中, 用来暂存收盘价,计算均价
    Set data = CreateObject("Stock.Array")

    '下面的代码控制循环测试
    '策略逻辑, 60周期均线上穿收盘价做多, 下破收盘价平多
    For i = 0 to HistroyData.Count-1
    data.AddBack(HistroyData.Close(i)) '添加数组数据
    If data.Count > 60 Then '如果数组数据大于60个就删除第一个,保证数组只有60个大小
    data.Removeat(0)
    End If

    If Data.Count >= 60 Then
    AvgPrice = data.Average

    if HistroyData.Close(i) > AvgPrice Then '均价之上平空开多

    If TestReport.Holding < 0 Then
    TestReport.SellShort 0,HistroyData.Close(i)
    End IF

    If TestReport.Holding = 0 Then
    TestReport.Buy 1, HistroyData.Close(i)
    End If
    End if

    if HistroyData.Close(i) < AvgPrice Then '下破均价平多开空
    If TestReport.Holding > 0 Then
    TestReport.Sell 0, HistroyData.Close(i)
    End If

    If TestReport.Holding = 0 Then
    TestReport.BuyShort 1,HistroyData.Close(i)
    End if
    End if
    End if

    '显示测试时当前的资产
    'Application.msgout TestReport.ASSET

    '为步进下一个数据做准备
    TestReport.StepIt i
    Next

    '////////////////////////////////////////////
    '分段测试第二笔
    Set MinuteData = marketdata.GetHistoryMinuteData("if00","zj","2014-07-14")
    Set HistroyData = marketdata.Changedata(MinuteData)

    If TestReport.AddTestStock(HistroyData,"IF00","ZJ",1) < 1 Then '向测试报告系统追加测试数据
    MsgBox "请正确添加品种"
    End If

    data.Removeall '清空数组

    'Application.MsgOut HistroyData.Count

    '下面的代码控制循环测试
    '策略逻辑, 60周期均线上穿收盘价做多, 下破收盘价平多
    For i = 0 to HistroyData.Count-1
    data.AddBack(HistroyData.Close(i)) '添加数组数据
    If data.Count > 60 Then '如果数组数据大于60个就删除第一个,保证数组只有60个大小
    data.Removeat(0)
    End If

    If Data.Count >= 60 Then
    AvgPrice = data.Average

    if HistroyData.Close(i) > AvgPrice Then '均价之上平空开多

    If TestReport.Holding < 0 Then
    TestReport.SellShort 0,HistroyData.Close(i)
    End IF

    If TestReport.Holding = 0 Then
    TestReport.Buy 1, HistroyData.Close(i)
    End If
    End if

    if HistroyData.Close(i) < AvgPrice Then '下破均价平多开空
    If TestReport.Holding > 0 Then
    TestReport.Sell 0, HistroyData.Close(i)
    End If

    If TestReport.Holding = 0 Then
    TestReport.BuyShort 1,HistroyData.Close(i)
    End if
    End if
    End if

    '显示测试时当前的资产
    'Application.msgout TestReport.ASSET

    '为步进下一个数据做准备
    TestReport.StepIt i
    Next

    '测试完毕显示测试报告
    Testreport.ShowReport

    set data = Nothing'对象使用完毕后释放对象
    '数据处理完毕后,清理缓冲区
    marketdata.DestroyHistoryData
    '销毁历史分笔数据结构,释放缓冲区
    marketdata.DestroyHistoryMinuteData

    End Sub


    范例4
    使用PLE语言做为信号,VBA进行测评
    PEL语言代码:
    公式名:MATEST
    MA1:=MA(CLOSE,5);
    MA2:=MA(CLOSE,15);

    开多:CROSS(MA1,MA2);
    平多:CROSS(MA2,MA1);

    Sub Test4()
    Testreport.StartAndInit '开始测评系统的准备工作
    Testreport.InitCash=100*10000 '初始资金100万

    Set Formula = marketdata.STKINDI("if00","zj","matest()",0,5) '调用中金所IF00合约的日线自定义指标
    Set HistroyData = Formula.ParentGrid.GetHistoryData '直接得到公式区的数据对象,提高运行效率

    If TestReport.AddTestStock(HistroyData,"IF00","ZJ",0) < 1 Then '向测试报告系统添加一个新测试品种
    MsgBox "请正确添加品种"
    End if

    '下面的代码控制循环测试
    '使用PEL策略的信号进行交易
    For i = 0 to HistroyData.Count-1
    if Formula.GetBufData("开多",i) = 1 And TestReport.Holding = 0 Then '开多
    TestReport.Buy 1, HistroyData.Close(i)
    End if

    if Formula.GetBufData("平多",i) = 1 And TestReport.Holding > 0 Then '平多
    TestReport.Sell 0, HistroyData.Close(i)
    End if


    '显示测试时当前的资产
    Application.msgout TestReport.ASSET

    '为步进下一个数据做准备
    TestReport.StepIt i
    Next

    '测试完毕显示测试报告
    Testreport.ShowReport

    set data = Nothing'对象使用完毕后释放对象
    End Sub