以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (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,要把以上代码转成金字塔,但是具体的算法思路得先大致注释一下,而且工程量较大,还是推荐第一种方法。 |