以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  hurst指数【VBA算法转换】  (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=52338)

--  作者:winsentess
--  发布时间:2013/5/23 10:19:22
--  hurst指数【VBA算法转换】
据资料表明,hurst指数构建的交易策略收益率奇高,欲证明其真实性,想自己构建此策略来尝试验证;无奈在金字塔里无法实现其算法,麻烦版主及金字塔高手帮忙转换,万分感谢。excel VBA源码如下:
Option Base 1
\'This program calculates an estimate of the Hurst coefficient.
\'Written by Martin Sewell <martin@martinsewell.com>
Sub Hurst()
Dim Data()
Dim Array1()
Dim Array2()
Dim Mean
Dim Result()

Dim NoOfDataPoints As Integer

Dim NoOfPlottedPoints As Integer
Dim PlottedPointNo As Integer

Dim NoOfPeriods As Integer
Dim PeriodNo As Integer

Dim N As Integer
Dim i As Integer
Dim m As Integer
Dim logten
Dim R
Dim S
Dim RS
Dim SumSquared

logten = Log(10)

\'Delete any previous results
Worksheets("Data").Range("C3").Value = Null
Worksheets("Data").Range("D").Value = Null
Worksheets("Data").Range("E:E").Value = Null

\'Get total number of data points
NoOfDataPoints = Worksheets("Data").Range("C1").Value

ReDim Data(NoOfDataPoints)

\'Get data, ignoring any spaces
i = 1
counter = 1
Do While counter <= NoOfDataPoints
Set curCell = Worksheets("Data").Cells(i, 1)
If Application.WorksheetFunction.IsNumber(curCell.Value) Then
Data(counter) = curCell.Value
counter = counter + 1
End If
i = i + 1
Loop

NoOfPlottedPoints = NoOfDataPoints - 2
ReDim Result(NoOfPlottedPoints, 2)

\'Begin main loop
For N = 3 To NoOfDataPoints

totalR = 0
totalS = 0

NoOfPeriods = NoOfDataPoints - N + 1

For PeriodNo = 1 To NoOfPeriods
ReDim Array1(N)
ReDim Array2(N)

For i = 1 To N
Array1(i) = Data((PeriodNo - 1) + i)
Array2(i) = 0
Next i
Summ = 0
SumSquared = 0
For i = 1 To N
Summ = Summ + Array1(i)
SumSquared = SumSquared + ((Array1(i)) * (Array1(i)))

Next i
Mean = Summ / N
\'STDEV
\'S = Sqr((SumSquared - (Summ * Summ) / N) / (N - 1))

\'STDEVP
S = Sqr((SumSquared - (Summ * Summ) / N) / N)

For i = 1 To N
Array1(i) = Array1(i) - Mean
Next i

For i = 1 To N
For j = 1 To i
Array2(i) = Array2(i) + Array1(j)
Next j
Next i

Maxi = Array2(1)
Mini = Array2(1)
For i = 1 To N
If Array2(i) > Maxi Then Maxi = Array2(i)
If Array2(i) < Mini Then Mini = Array2(i)
Next i

R = Maxi - Mini
totalR = totalR + R
totalS = totalS + S

Next PeriodNo

R = totalR / NoOfPeriods
S = totalS / NoOfPeriods
RS = R / S

PlottedPointNo = N - 2
Result(PlottedPointNo, 1) = (Log(N)) / logten
Result(PlottedPointNo, 2) = (Log(RS)) / logten

Next N

Sumx = 0
Sumy = 0
Sumxy = 0
Sumxx = 0

For i = 1 To NoOfPlottedPoints
Worksheets("Data").Cells(i + 6, 4).Value = Result(i, 1)
Worksheets("Data").Cells(i + 6, 5).Value = Result(i, 2)
Sumx = Sumx + Result(i, 1)
Sumy = Sumy + Result(i, 2)
Sumxy = Sumxy + (Result(i, 1)) * (Result(i, 2))
Sumxx = Sumxx + (Result(i, 1)) * (Result(i, 1))
Next i

\'Calculate Hurst coefficient
H = (Sumxy - ((Sumx * Sumy) / NoOfPlottedPoints)) / (Sumxx - ((Sumx * Sumx) / NoOfPlottedPoints))
Worksheets("Data").Range("C3").Value = H

End Sub

--  作者:lichenghu
--  发布时间:2013/5/23 10:35:26
--  
您好,已在vip论坛回复您
--  作者:rushtaotao
--  发布时间:2013/5/23 10:37:23
--  

有2种方式可以处理

1,比较简单的一种,你已经有了excel vba的算法,可以通过金字塔,取出数据,录入到你的excel里 通过excel宏来进行计算。

2,要把以上代码转成金字塔,但是具体的算法思路得先大致注释一下,而且工程量较大,还是推荐第一种方法。