加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

时间序列在股票分析中的应用

(2009-03-09 14:39:00)
标签:

杂谈

一 理论基础

 

时间序列数据挖掘是数据挖掘算法中应用最广的几种算法之一,被广泛应用于宏观经济的分析与预测,股票价格变动的分析与预测,时间序列分析把各种分析的变量X建立与时间T的函数关系Xt=aXt-1(T),通过掌握历史数据变动的规律,分析变量未来的运动趋势。在宏观经济的分析中,其主要的理论依据有经济周期理论以及宏观经济学中所讲的IS-ML 模型(Investment Saving & Liquidity Money 投资与储蓄市场均衡,流动性即货币需求与货币供给均衡模型,又称产品市场与货币市场均衡模型)。本论文重点讨论时间序列分析算法在股票分析中的应用。

股票价格因为远高于其每股净资产价格而处于一种大幅度的变动之中,给二级市场投资者带来了很多投资机会和风险,关于股票价格的决定因素是多方面的,最主要的决定因素是宏观经济环境和公司基本面以及市场参与者对这两种因素的预期,当然股票价格高低也跟股票供给和市场资金充裕情况也有密切的关系,也符合一般商品所遵守的一价定律。市场参与者对未来股市走势的预期直接影响投资者行为,投资者的行为的直接反映就是股票价格和成交量随时间T的变动,所以“市场行为蕴涵一切”是技术分析的理论基础,而时间序列分析做为技术分析中一种重要的分析方法被普遍采用,个人认为把该分析方法进行标准化的程序实现有助于提高证券分析师和投资者的工作效率,具有一定的商业价值。当然一种数据挖掘技术的运用必须同要分析的事物的自身规律结合才能得到正确的结论,股市跌多了会涨,涨过分了会跌,具体跌到什么程度才会止跌回稳,具体涨到什么程度才会回落,要给出一个定量判断标准,这个标准可以从历史数据中总结,也可以从资金面和各种市场行为来判断,只要掌握了股票市场运行的时间序列特征,那么我们就可以用时间序列挖掘算法来辅助证券投资分析。

 

   几种时间序列数据挖掘算法与数据结构设计

 (一)移动平均线模型(MA

移动平均线PMA是变量随时间的一种表现形式.比如变量X的三日移动平均线,首先取得连续三日的三个变量X,计算其平均值A,然后后移.去掉最先一个变量X,增加新一日一个变量X,再计算三个变量X的平均值B.如此移动计算,得到一条三日移动平均线。同理,可得五日,六日,十日,十三日,三十日,七十日,二百日等移动平均线。移动平均线由样本数的多少决定了移动变化的急缓。样本数少,变化较急,称为快速线,因此多作为短线指标。样本数多,变化较缓,称为慢速线,在样本数适当多的时候,多作为中线或长线指标,重要的是, 因为移动平均线是由一定样本的集合的连续移动计算产生,所以它的移动方向和速度代表了该集合的整体态势。这一点,正是人们所要利用的。

1)算法描述:

MA(P1,P2)
中文名: 普通移动平均
英文名: MA
描述:求P1P2日普通移动平均值
参数:P1,P2
用法:MA(P1,P2)
算法:MA(X,N)=(X1+X2+...+Xn)/N
举例:MA(CLOSE,5)--5日平均值

(2) 算法实现的C++程序源代码:

 

#include<iostream.h>

class MA

{

public :

    MA(int*  a, int b,int c);

    void ma(void);

private:

    int n,y;

    int  v;

    int*  m;

   

};

MA::MA (int* a, int b,int c)

{

     m=a;

     n=b;

     v=c;

     cout<<"总天数:"<< n<<"()"<<endl;

     cout<<"均线参数:"<<v<<"日平均线。"<<endl;

}

void MA::ma(void)

{

   float * tmp=new float [n];

  

   int t=0,i=0,j=0,k=0;

    cout<<"MA模型平滑处理后的数据("<<v<<"日平均线):"<<endl;    

int cc=0;

for(j=0;j+v<n; j++)

{

   for(i=0;(i<v)&&(j==0);i++)

   {   cc++;

       t=t+m[i];

      // cout<<"m[]"<<m[i+j]<<" ;";

    //   cout<<t<<" , ";

     // cout<<"cc="<<cc<<"|";

   }

   //cout<<"t="<<t<<"|";

    tmp[k]= t/float(v);

    cout<<tmp[k]<<"  ";

     t=t-m[j]+m[j+v];

    k++;

} 

  

 

}

void main()

{

  

    int a[15]={4,4,5,6,5,17,18,19,14,15,16,12,13,18,19};

   int b[30]={2,3,4,6,5,7,5,6,9,8,10,11,14,10,13,15,16,13,14,18,20,17,18,17,15,16,13,14,12,14};

    cout<< "测试一:"<<endl;

    cout<<"原始数据(日平均值):"<<endl;

    for(int i=0;i<15;i++)

    {

        cout<<a[i]<<",";

    }

    cout<<endl;

    MA box(a,15,5);

    box.ma();

   cout<<endl;

   cout<<endl;

   cout<<endl;

 

    cout<< "测试二:"<<endl;

    cout<<"原始数据(日平均值):"<<endl;

    for( i=0;i<30;i++)

    {

      

      cout<<b[i]<<",";

    }

    MA bo(b,30,6);

    bo.ma();

    cout<<endl;

 

}

 

 

(3)测试结果及分析:

测试一:

原始数据(日平均值):

4,4,5,6,5,17,18,19,14,15,16,12,13,18,19,

总天数:15()

均线参数:5日平均线。

MA模型平滑处理后的数据(5日平均线):

4.8  7.4  10.2  13  14.6  16.6  16.4  15.2  14  14.8

 

 

 

 

测试二:

原始数据(日平均值):

2,3,4,6,5,7,5,6,9,8,10,11,14,10,13,15,16,13,14,18,20,17,18,17,15,16,13,14,12,14,

总天数:30()

均线参数:6日平均线。

MA模型平滑处理后的数据(6日平均线):

4.5  5  5.5  6.33333  6.66667  7.5  8.16667  9.66667  10.3333  11  12.1667  13.1667  13.5  13.5  14.8333  16  16.3333  16.6667  17.3333  17.5  17.1667  16  15.5  14.5

 

总天数:30()

均线参数:10日平均线。

MA模型平滑处理后的数据(10日平均线):

5.5  6.3  7.1  8.1  8.5  9.3  10.1  11.2  11.9  12.4  13.4  14.4  15  15.4  16.1  16.3  16.4  16.1  16.2  16

Press any key to continue

通过人工验证,程序运行的结果完全正确,从实验结果分析可以看出, 时间序列数据挖掘算法具有平滑数据的作用,从而能够从离散的数据中看出变量随时间变化的趋势,随着平均值参数的选择,可以得出变量的短期趋势和 中期趋势以及长期趋势,利用不同的平均值参数,可以验证短期趋势变化比长期趋势敏感。在实际的证券交易中,经常是把不同参数的平均线组合使用。均线是研判股票价格运动趋势的重要技术指标,通常配合成交量来判断行情拐点。各种均线形态包含有各种市场语言,证券分析中要综合考虑价格,成交量等来解读。

 

(二)波动率模型(FLU

    尽管金融经济学家很早就知道经济时间序列的波动率有簇聚效应,并且边际分布具有尖峰形态,但却一直没有建立能够反映这种特点的时间序列模型.恩格尔在20世纪 80年代早期开始了波动率模型的研究,成功地突破了传统的时间序列统计分析方法,开创性地建立了随时间变化的波动率模型-自相关条件异方差( ARCH)模型,从而有力地推动了金融经济学的发展.

arch

file:///C:/DOCUME%7E1/TangPing/LOCALS%7E1/Temp/msohtml1/01/clip_image001.jpgARCH(Autoregressive conditional heteroskedasticity model)中文文献一般称作自回归条件异方差模型
计量经济学家恩格尔(Robert F.Engle),80年代开创性地提出了自回归条件异方差(AutoRegressive Conditional Heteroscedasticity)模型, 并成功地应用于英国通货膨胀指数的波动性研究. (1982)
ARCH
模型能模拟时间序列变量的波动性的变化,它在计量金融领域中应用较为广泛。
很多学者从不同角度推广了ARCH模型,进一步拓展了ARCH模型的应用领域,一般将这些模型统称为ARCH族模型,胪举如下:GARCH(Bollerslev,1986),LOGARCH(Geweke,1986),NARCH(higgins and bera.1982) , QGARCH (Engle and NG,1993) , GARCH-M (EngleLilien and Robins,1985),EGARCH(Nelson,1991), TARCH (Zakoizn,1990) and Component ARCH
2003
Robert F.Engle以在ARCH模型领域的贡献荣膺当年诺贝尔经济学奖.

 

    从上面的资料介绍可以看出,关于时间序列的波动率研究是金融经济领域非常重要的课题,波动率在金融分析中广泛应用,由于这里涉及到金融领域相关知识,请参看后面给出的参考文献资料,本文重点只针对波动率在证券投资分析领域的应用,结合我的股票市场交易经验,阐述一下波动率在股票分析中的应用。

在股票交易市场,影响股票价格波动的因素很多,主要有商品市场竞争导致产品及原材料价格变动造成上市公司经营环境变化的因素,还有宏观政策面的,信贷资金供给面的因素, 如果遇上天灾人祸更是造成股票价格的剧烈波动,时间序列数据挖掘的波动率模型,旨在考察变量(这里指股票价格与成交量)的波动幅度(震荡剧烈程度),峰值,范围,联系所研究变量所处的具体客观环境,找出波动的本质原因和最终结果,从而帮助人们做出正确的投资决策。

关于波动率的测度,可以求出变量所有取值的平均值(期望),然后算出方差和标准差来度量,这是简单的数理统计,也可以求出最大值与最小值的差的绝对值(振幅)与平均值的比值,这是我最初设计的绝对波动率计算模型,这个模型有一个缺点,就是当出现极端值偏离总体平均值太大时,计算结果不精确,结果受极端值影响太大,需要进一步优化。

经过思考,想到可以考虑用标准差来代替极端值差值的绝对值(即振幅),这样可以避免极端值异常偏离平均值的缺点。还有一种优化模型,就是用每个数据减去总体平均值,把得到的数据按正负符号分两个集合,分别对两个集合中的数据求平均值,然后对负数集合平均值取绝对值后与正数集合平均值相加得到振幅,然后用振幅比上总体平均值,便得到绝对波动率。(我的FLUCTUATE模型)

1)简单波动率模型算法设计描述:

 

FLU (X,M)
中文名: 简单绝对波动率计算模型
英文名:FLUCTUATE

描述:求XM日的绝对波动率。
参数:X,M
用法:FLU (X,M)
算法:FLU (X,N)=A/MM=|X1+X2+ ........+Xn|/N, A=|A1|+|A2|,

A1=|X1+X2+ ........+Xn-M|/N ,A2= |X1+X2+ ........+Xn-M|/N;

A1 ,A2分别为负数,正数集合。
举例:FLU (CLOSE,5)—5日波动率。

 

(2) 算法实现的C++程序源代码:

 

 #include<iostream.h>

class FLU

{

public :

    FLU(int*  a, int b,int c);

    void flu(void);

private:

    int n,y;

    int  v;

    int*  mx;

   

};

FLU::FLU (int* a, int b,int c)

{

     mx=a;

     n=b;

     v=c;

      cout<<"总天数:"<< n<<"()"<<endl;

     // cout<<"均线参数:"<<v<<"日平均线。"<<endl;

}

void FLU::flu(void)

{

   float * z=new float [n];

   float * f= new  float [n];

 

   int t=0,i=0,j=0,k=0;

    cout<<"FLU模型计算:("<<n<<"日绝对波动率):"<<endl;    

int cc=0,ccc=0,a=0,aa=0;

cc=mx[0];

a=mx[0];

 

for(i=0;i<n;i++)

{

    t=t+mx[i];

   

    if(cc<mx[i])

    {

       cc=mx[i];

       ccc=i;

    }

    if(a>mx[i])

    {

       a=mx[i];

       aa=i;

    }

 

}

float m=0;

m=t/n;

if (m<0) m=0-m;

for(i=0;i<n;i++)

{

    if ((mx[i]-m)<0)

    {

       f[j]=m-mx[i];

       j++;

    }

    else

    {

       z[k]=mx[i]-m;

       k++;

    }

 

}

 

float a1=0,a2=0;

 

for(i=0;i<j;i++)

{

    a1=a1+f[i];

 

}

for(i=0;i<k;i++)

{

    a2=a2+z[i];

 

}

a1=a1/n;

a2=a2/n;

float flut=0;

flut=(a1+a2)/m;

cout<<"波动率为 :FLU="<<flut<<"."<<endl;

cout<<"FLU模型计算:("<<n<<"日峰值):"<<ccc+1<<",最大值:"<<cc<<","<<aa+1<<",最小值:"<<a<<"."<<endl;

 

  cout<<endl;

  cout<<endl;

}

void main()

{

  

    int a[15]={4,4,5,6,5,17,18,19,14,15,16,12,13,18,19};

   int b[30]={2,3,4,6,5,7,5,6,9,8,10,11,14,10,13,15,16,13,14,18,20,17,18,17,15,16,13,14,12,14};

    cout<< "测试一:"<<endl;

    cout<<"原始数据(日平均值):"<<endl;

    for(int i=0;i<15;i++)

    {

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有

/**/ 一 理论基础 时间序列数据挖掘是数据挖掘算法中应用最广的几种算法之一,被广泛应用于宏观经济的... (来自 @头条博客)"}); -->