声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 18465|回复: 25

[共享资源] RS分形算法matlab代码实现

[复制链接]
发表于 2006-11-17 09:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
RS分形算法matlab代码实现,既利用RS方法计算时间序列的分形hurst指数

  1. function [logRS,logERS,V]=RSana(x,n,method,q)
  2. %Syntax: [logRS,logERS,V]=RSana(x,n,method,q)
  3. %____________________________________________
  4. %
  5. % Performs R/S analysis on a time series.
  6. %
  7. % logRS is the log(R/S).
  8. % logERS is the Expectation of log(R/S).
  9. % V is the V statistic.
  10. % x is the time series.
  11. % n is the vector with the sub-periods.
  12. % method can take one of the following values
  13. %  'Hurst' for the Hurst-Mandelbrot variation.
  14. %  'Lo' for the Lo variation.
  15. %  'MW' for the Moody-Wu variation.
  16. %  'Parzen' for the Parzen variation.
  17. % q can be either
  18. %  a (non-negative) integer.
  19. %  'auto' for the Lo's suggested value.
  20. %
  21. %
  22. % References:
  23. %
  24. % Peters E (1991): Chaos and Order in the Capital Markets. Willey
  25. %
  26. % Peters E (1996): Fractal Market Analysis. Wiley
  27. %
  28. % Lo A (1991): Long term memory in stock market prices. Econometrica
  29. % 59: 1279-1313
  30. %
  31. % Moody J, Wu L (1996): Improved estimates for Rescaled Range and Hurst
  32. % exponents. Neural Networks in Financial Engineering, eds. Refenes A-P
  33. % Abu-Mustafa Y, Moody J, Weigend A: 537-553, Word Scientific
  34. %
  35. % Hauser M (1997): Semiparametric and nonparametric testing for long
  36. % memory: A Monte Carlo study. Empirical Economics 22: 247-271
  37. %
  38. %
  39. % Alexandros Leontitsis
  40. % Department of Education
  41. % University of Ioannina
  42. % 45110 - Dourouti
  43. % Ioannina
  44. % Greece
  45. %
  46. % University e-mail: me00743@cc.uoi.gr
  47. % Lifetime e-mail: leoaleq@yahoo.com
  48. % Homepage: http://www.geocities.com/CapeCanaveral/Lab/1421
  49. %
  50. % 1 Jan 2004.

  51. if nargin<1 | isempty(x)==1
  52.    error('You should provide a time series.');
  53. else
  54.    % x must be a vector
  55.    if min(size(x))>1
  56.       error('Invalid time series.');
  57.    end
  58.    x=x(:);
  59.    % N is the time series length
  60.    N=length(x);
  61. end

  62. if nargin<2 | isempty(n)==1
  63.    n=1;
  64. else
  65.    % n must be either a scalar or a vector
  66.    if min(size(n))>1
  67.       error('n must be either a scalar or a vector.');
  68.    end
  69.    % n must be integer
  70.    if n-round(n)~=0
  71.        error('n must be integer.');
  72.    end
  73.    % n must be positive
  74.    if n<=0
  75.       error('n must be positive.');
  76.    end
  77. end

  78. if nargin<4 | isempty(q)==1
  79.    q=0;
  80. else
  81.     if q=='auto'
  82.         t=autocorr(x,1);
  83.         t=t(2);
  84.         q=((3*N/2)^(1/3))*(2*t/(1-t^2))^(2/3);
  85.     else
  86.         % q must be a scalar
  87.         if sum(size(q))>2
  88.             error('q must be scalar.');
  89.         end
  90.         % q must be integer
  91.         if q-round(q)~=0
  92.             error('q must be integer.');
  93.         end
  94.         % q must be positive
  95.         if q<0
  96.             error('q must be positive.');
  97.         end
  98.     end
  99. end


  100. for i=1:length(n)
  101.    
  102.     % Calculate the sub-periods
  103.     a=floor(N/n(i));
  104.    
  105.     % Make the sub-periods matrix
  106.     X=reshape(x(1:a*n(i)),n(i),a);
  107.    
  108.     % Estimate the mean of each sub-period
  109.     ave=mean(X);
  110.    
  111.     % Remove the mean from each sub-period
  112.     cumdev=X-ones(n(i),1)*ave;
  113.    
  114.     % Estimate the cumulative deviation from the mean
  115.     cumdev=cumsum(cumdev);
  116.    
  117.     % Estimate the standard deviation
  118.     switch method
  119.     case 'Hurst'
  120.         % Hurst-Mandelbrot variation
  121.         stdev=std(X);
  122.     case 'Lo'
  123.         % Lo variation
  124.         for j=1:a
  125.             sq=0;
  126.             for k=0:q
  127.                 v(k+1)=sum(X(k+1:n(i),j)'*X(1:n(i)-k,j))/(n(i)-1);
  128.                 if k>0
  129.                     sq=sq+(1-k/(q+1))*v(k+1);
  130.                 end
  131.             end
  132.             stdev(j)=sqrt(v(1)+2*sq);
  133.         end
  134.     case 'MW'
  135.         % Moody-Wu variation
  136.         for j=1:a
  137.             sq1=0;
  138.             sq2=0;
  139.             for k=0:q
  140.                 v(k+1)=sum(X(k+1:n(i),j)'*X(1:n(i)-k,j))/(n(i)-1);
  141.                 if k>0
  142.                     sq1=sq1+(1-k/(q+1))*(n(i)-k)/n(i)/n(i);
  143.                     sq2=sq2+(1-k/(q+1))*v(k+1);
  144.                 end
  145.             end
  146.             stdev(j)=sqrt((1+2*sq1)*v(1)+2*sq2);
  147.         end
  148.     case 'Parzen'
  149.         % Parzen variation
  150.         if mod(q,2)~=0
  151.             error('For the "Parzen" variation q must be dived by 2.');
  152.         end
  153.         for j=1:a
  154.             sq1=0;
  155.             sq2=0;
  156.             for k=0:q
  157.                 v(k+1)=sum(X(k+1:n(i),j)'*X(1:n(i)-k,j))/(n(i)-1);
  158.                 if k>0 & k<=q/2
  159.                     sq1=sq1+(1-6*(k/q)^2+6*(k/q)^3)*v(k+1);
  160.                 elseif k>0 & k>q/2
  161.                     sq2=sq2+(1-(k/q)^3)*v(k+1);
  162.                 end
  163.             end
  164.             stdev(j)=sqrt(v(1)+2*sq1+2*sq2);
  165.         end
  166.     otherwise
  167.         error('You should provide another value for "method".');
  168.     end
  169.    
  170.     % Estiamte the rescaled range
  171.     rs=(max(cumdev)-min(cumdev))./stdev;
  172.    
  173.     clear stdev
  174.    
  175.     % Take the logarithm of the mean R/S
  176.     logRS(i,1)=log10(mean(rs));
  177.    
  178.     if nargout>1
  179.         
  180.         % Initial calculations fro the log(E(R/S))
  181.         j=1:n(i)-1;
  182.         s=sqrt((n(i)-j)./j);
  183.         s=sum(s);
  184.         
  185.         % The estimation of log(E(R/S))
  186.         logERS(i,1)=log10(s/sqrt(n(i)*pi/2));
  187.         
  188.         % Other estimations of log(E(R/S))
  189.         %logERS(i,1)=log10((n(i)-0.5)/n(i)*s/sqrt(n(i)*pi/2));
  190.         %logERS(i,1)=log10(sqrt(n(i)*pi/2));
  191.         
  192.     end
  193.    
  194.     if nargout>2
  195.         % Estimate V
  196.         V(i,1)=mean(rs)/sqrt(n(i));
  197.     end

  198. end
复制代码

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

发表于 2006-11-27 12:52 | 显示全部楼层

请问

你好,请问这个代码输出hurst外,其他几个是甚么呢
发表于 2006-11-29 09:26 | 显示全部楼层
原帖由 linapeng 于 2006-11-27 12:52 发表
你好,请问这个代码输出hurst外,其他几个是甚么呢

% logRS is the log(R/S).
% logERS is the Expectation of log(R/S).
% V is the V statistic.


自己看注释吧
发表于 2006-11-30 16:53 | 显示全部楼层
这么强的程序啊?
发表于 2006-12-4 21:49 | 显示全部楼层
分形hurst指数
是什么意思呢?
就是分形维数吗?
发表于 2006-12-9 09:48 | 显示全部楼层
原帖由 pheigenbau 于 2006-11-30 16:53 发表
这么强的程序啊?


你指什么?
发表于 2006-12-9 09:50 | 显示全部楼层
原帖由 zjamy 于 2006-12-4 21:49 发表
分形hurst指数
是什么意思呢?
就是分形维数吗?


H.E.HURST(赫斯特)是英国水文学家。以他命名的HURST指数,被广泛用于资本市场的混沌分形分析。除了埃德加.E.彼得斯的两本专著外,近几年也发表了一些论文。
一个具有赫斯特统计特性的系统,不需要通常概率统计学的独立随机事件假设。它反映的是一长串相互联系事件的结果。今天发生的事将影响未来,过去的事也会影响现在。这正是我们分析资本市场所需要的理论和方法。传统的概率统计学,对此是难办到的。
HURST指数(H)有三个不同类型:
1、H=0.5,标志着所研究的序列是一个随机序列,即过去的增量与未来的增量不相关。这是通常概率统计学的研究对象;
2、0.5<H<1.0,标志着所研究的序列是一个持久性序列,即过去的增量与未来的增量正相关。序列有长程相关性;
3、0<H<0.5,标志着所研究的序列是一个反持久性序列,即过去的增量与未来的增量负相关,序列有突变跳跃逆转性。
根据赫斯特的研究,自然界的很多自然现象,H大于0.5。埃德加.E.彼得斯的两本专著,对国外资本市场进行了系统分析,证实了许多市场指数的H也大于0.5;近几年国内发表了一些论文,同样验证了沪深市场指数的H也大于0.5。这种市场特征,被称为是有偏随机游动市场,也即市场具有混沌分形特征。
对于反持久性序列,埃德加.E.彼得斯指出,它在经济金融学中虽然很重要,但人们发现的反持久性序列却很少。因此,在两本专著中论述不多。
HURST指数的经典计算方法,是R/S分析法,即重标极差分析法。用此法计算HURST指数,不仅计算量大,且方法繁杂。目前所见论文,一般都是针对少数代表性指数,且多半是用月(周)数据分析的。对于个股的HURST指数计算,尚未见到。在现有的几个股软(飞狐或分析家)上直接实现,虽有可能,也较困难。因此,除了经典计算方法外,寻求一种简单些的计算方法也是有必要的。

为了便于对沪深市场的所有股票进行分析,本人采用了一种简化方法,计算出沪深市场所有股票的HURST指数。对这种方法只进行了一般性的误差分析,未与R/S分析法进行全面比较。因此,计算结果和初步认识仅供参考。
一、指数类的HURST指数
1、上证:0.568,沪A:0.571,沪B:0.583;
2、深成指:0.533,深综指0.515
初步认识:就大盘而论,沪深市场的日线周期数据序列是持久性序列,且沪市比深市有偏性更强,沪B比沪A有偏性更强。
二、A股市场所有股票的HURST指数(1260支)
1、H大于等于0.55的有36支,H大于等于0.52的有96支,H大于0.50的有137支
2、H小于等于0.45的有36支,H小于等于0.48的有1016支
初步认识:A股市场的绝大多数股票,其日线周期数据序列是反持久性序列,序列有极强的突变逆转性。相反,持久性序列仅有1/10左右。这是现有研究中无人提及的。
三、B股市场所有股票的HURST指数(109支)
H大于0.50的有69支,H小于0.50的有31支
初步认识:B股市场的股票比A股市场有偏性强,但仍有3/10的B股,其日线周期数据序列是反持久性序列。
说明:新股的日线周期数据序列太短,按理是不能计算HURST指数的。统计时未剔除新股。

以上引自MACD股市技术分析俱乐部
发表于 2006-12-19 21:37 | 显示全部楼层
这是上文中提到的简化算法吗
发表于 2007-5-30 10:18 | 显示全部楼层

回复 #1 happy 的帖子

这个程序如何输入数据,运行这个.m文件后出现
??? Error using ==> RSana123
You should provide a time series.
还有就是输出的logRS is the log(R/S)应该不是最后的hurst指数吧
发表于 2009-2-17 20:02 | 显示全部楼层
为什么输入数据,出来这个结果?程序有误?
??? Error: File: C:\MATLAB7\work\Rsana.m Line: 1 Column: 21
Unbalanced or misused parentheses or brackets.
发表于 2009-2-18 09:22 | 显示全部楼层
这个程序只能输出一个log(rs),并且好像就是hurst指数吧,因为就一个值,其他hurs期望指数和V统计值输不出来,加入代码输出总是显示错误
发表于 2009-2-18 09:22 | 显示全部楼层
原帖由 furoo 于 2009-2-17 20:02 发表
为什么输入数据,出来这个结果?程序有误?
??? Error: File: C:\MATLAB7\work\Rsana.m Line: 1 Column: 21
Unbalanced or misused parentheses or brackets.

这个问题已经解决了,是我第一行注释没搞好

评分

1

查看全部评分

发表于 2009-5-9 20:34 | 显示全部楼层
好东西,学习!
发表于 2010-3-15 23:45 | 显示全部楼层
不是的 分形维数和hurst指数是完全不同的两个概念 而且此程序出来的结果不是hurst指数 将数据拟合后得到直线的斜率是hurst指数
发表于 2010-5-13 09:46 | 显示全部楼层
楼主人太太太太好了,感谢分享:loveliness:
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-28 14:31 , Processed in 0.097160 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表