以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://www.weistock.com/bbs/index.asp)
--  高级功能研发区  (http://www.weistock.com/bbs/list.asp?boardid=5)
----  vba数学函数  (http://www.weistock.com/bbs/dispbbs.asp?boardid=5&id=149101)

--  作者:zero
--  发布时间:2017/3/15 9:43:33
--  vba数学函数
请问用vba编程计算两个商品相关性要怎么做?在vba编程信息里没有找到相关函数是不是要自己定义还是可以调用金字塔函数?
--  作者:王锋
--  发布时间:2017/3/15 9:46:07
--  
Array 对象

 

 

Alike        计算该数组与其他Array对象之间的相似系数,例如Alike(ar)表示求与ar数组对象之间的相似度

Releate      计算该数组与其他Array对象之间的相关系数


--  作者:zero
--  发布时间:2017/3/16 10:54:01
--  
Sub TLStart1()
  call marketdata.RegReportNotify("P05","DQ")
  call marketdata.RegReportNotify("Y05","DQ")
End Sub

Sub MARKETDATA_ReportNotify(ReportData)
  Set Report1 = marketdata.GetReportData("P05","DQ")
  Set Report2 = marketdata.GetReportData("Y05","DQ")
    Set histroydata1 = MarketData.GetHistoryData("P05","DQ",0)
    Set histroydata2 = MarketData.GetHistoryData("Y05","DQ",0)

    Dim data 
    Set data = CreateObject("Stock.Array")
        For i =0 to 149
        data.AddBack(histroydata1.Close(histroydata1.count-i))
        next
        if data.count>150 then
        ata.removeat(0)
    end if 

    Dim data1 
    Set data1 = CreateObject("Stock.Array")
        For i =0 to 149
        data1.AddBack(histroydata2.Close(histroydata2.count-i))
        next
        if data1.count>150 then
        data1.removeat(0)
    end if 

\'相关性计算
corr = data.releate(data1)  
application.MsgOut  Cdate(time)& ",相关性:" & corr 



Set d1 = nothing \'释放对象
Set d2 = nothing 

End Sub
    
请问为什么输出的相关性数值都是1呢?是不是这么计算是错误的

--  作者:王锋
--  发布时间:2017/3/16 10:59:41
--  

MarketData 对象

 

HistoryDataMode   历史数据处理处理模式 0默认值,GetHistoryData,GetHistoryDataByDate 方法取到的对象为共享模式;1为独立模式,打开不同品种可以分别处理各自的数据,数据处理完毕后要调用DestroyHistoryData方法销毁内存缓冲区.


--  作者:zero
--  发布时间:2017/3/16 11:03:56
--  
明白了,还有一个问题,就是数组元素如何监控?用application.msgout data(0)输出显示对象不支持
--  作者:王锋
--  发布时间:2017/3/16 11:04:54
--  

GetAt        取数组指定位置的数据

SetAt        设置数组指定位置的数据


--  作者:zero
--  发布时间:2017/3/16 13:39:26
--  

Sub TLStart1()
  call marketdata.RegReportNotify("P05","DQ")
  call marketdata.RegReportNotify("Y05","DQ")
End Sub

Sub TLStart1()
  call marketdata.RegReportNotify("P05","DQ")
  call marketdata.RegReportNotify("Y05","DQ")
End Sub

Sub MARKETDATA_ReportNotify(ReportData)
  Set Report1 = marketdata.GetReportData("P05","DQ")
  Set Report2 = marketdata.GetReportData("Y05","DQ")
 
  marketdata.HistoryDataMode=1\'不同品种为独立的缓冲区
 
    Set histroydata1 = MarketData.GetHistoryData("P05","DQ",0)
    Set histroydata2 = MarketData.GetHistoryData("Y05","DQ",0)
    

    Dim data 
    Set data = CreateObject("Stock.Array")
        For i =0 to 149
        data.AddBack(histroydata1.Close(histroydata1.count-i))
        next
        if data.count>150 then
        data.removeat(0)
    end if 

    Dim data1 
    Set data1 = CreateObject("Stock.Array")
        For i =0 to 149
        data1.AddBack(histroydata2.Close(histroydata2.count-i))
        next
        if data1.count>150 then
        data1.removeat(0)
    end if 
    

marketdata.DestroyHistoryData\'清理缓冲区
 
\'相关性计算
corr = data.releate(data1)
cc = data.getat(1)  
application.MsgOut  Cdate(time)& ",相关性:" & corr & ",data(1):" & cc & ",data1(1):" & data1.getat(1)

Set d1 = nothing \'释放对象
Set d2 = nothing 

End Sub
    
为什么根据您的建议改完之后相关性计算还是错误的呢?
图片点击可在新窗口打开查看此主题相关图片如下:cm8viux`4l`z)x5o0l97uw.png
图片点击可在新窗口打开查看

--  作者:王锋
--  发布时间:2017/3/16 14:19:04
--  
建议你调试一下2个数组的数据内容是不是有问题,此外如果你觉得确实是计算错误,那么正确的应该是多少?
--  作者:zero
--  发布时间:2017/3/16 14:58:29
--  

1.输出数组data三个元素发现返回的数值没有错误
相关性:RELATE(C1,C2,CORR_len); 
这是用pel语言写的,然后输出到TXT文档。数据已经补充完整,得到的数值是0.7左右

2.请问VB是否有类似pel语言的ref函数可以回溯前值,不然很多计算的东西需要保存的时候不是要创建多个数组?还有,可否直接调用在金字塔图表计算的公式数值或者Excel的数据

3.cross语句在VB里面有什么比较简单的判断方法?

--  作者:王锋
--  发布时间:2017/3/16 15:03:24
--  

1, 你要看数据是否完全一致的? 估计你遇到的问题是图表上加载的数据量与你碰到的不一致,CORR_len 这个很重要。

2,用for

3,for里自己做