欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → TestReport 对象 全新的VBA策略回测对象,该对象提供一整套测试环境, 让VBA的策略开发也可以像PEL语言一样进行策略测试

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有14561人关注过本帖树形打印复制链接

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

帅哥哟,离线,有人找我吗?
admin
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:7302 积分:32559 威望:1000 精华:45 注册:2003/12/30 16:34:32
TestReport 对象 全新的VBA策略回测对象,该对象提供一整套测试环境, 让VBA的策略开发也可以像PEL语言一样进行策略测试  发帖心情 Post By:2014/8/18 23:58:21 [只看该作者]

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       当切换报表项时触发该事件


 回到顶部
帅哥哟,离线,有人找我吗?
admin
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:7302 积分:32559 威望:1000 精华:45 注册:2003/12/30 16:34:32
  发帖心情 Post By:2014/8/18 23:59:02 [只看该作者]

部分使用范例

范例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

 


 回到顶部
帅哥哟,离线,有人找我吗?
admin
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:7302 积分:32559 威望:1000 精华:45 注册:2003/12/30 16:34:32
  发帖心情 Post By:2014/8/18 23:59:13 [只看该作者]

范例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

End Sub

[此贴子已经被作者于2014/9/28 20:02:01编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
guotx2010
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蜘蛛侠 帖子:1366 积分:5210 威望:0 精华:7 注册:2010/12/11 18:00:33
  发帖心情 Post By:2014/8/19 8:16:19 [只看该作者]

很强大,值得收藏

 回到顶部
帅哥哟,离线,有人找我吗?
dwjgwsm
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:黑侠 帖子:864 积分:607 威望:0 精华:0 注册:2013/3/14 23:16:32
  发帖心情 Post By:2014/8/19 8:44:54 [只看该作者]

先顶再看

 回到顶部
帅哥哟,离线,有人找我吗?
自在二次元
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:3 积分:0 威望:0 精华:0 注册:2014/8/13 23:51:33
  发帖心情 Post By:2014/8/20 17:01:52 [只看该作者]

太感谢了,得好好学习vba了

 回到顶部
帅哥哟,离线,有人找我吗?
fantasynew
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:381 积分:0 威望:0 精华:0 注册:2013/10/2 12:35:58
  发帖心情 Post By:2014/8/22 22:07:41 [只看该作者]

工作人员辛苦了


 回到顶部
帅哥哟,离线,有人找我吗?
solarhe2006
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:252 积分:1001 威望:0 精华:0 注册:2010/2/15 16:47:58
  发帖心情 Post By:2017/8/18 21:28:29 [只看该作者]

VBA测试报告,金字塔的,请问如何设定数据测试的历史开始时间和结束时间?

 回到顶部
帅哥哟,离线,有人找我吗?
王锋
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:罗宾汉 帖子:11808 积分:20695 威望:0 精华:10 注册:2009/8/18 8:15:13
  发帖心情 Post By:2017/8/18 21:54:41 [只看该作者]

使用 GetHistoryDataByDate 代替 GetHistoryData  来指定加载开始和结束时间的数据


金字塔—专业程序化软件提供商

金字塔-技术部

-----------------------------------------------------------------------------------------------------

工作时间:周一至周五 08:30 - 17:30   周末及法定节假日休息

Email:service@weistock.com
 回到顶部