综合前文的分析,现将本研究的基本结论概述如下。
第一,自1999年至2009年,我国宏观经济波动经历4次短周期,日期为1996年6月至2001年12月,2001年12月至2005年4月,2005年4月至2009年5月(按照波动的波谷计算),周期长度大致为4年。
第二,利用时差相关系数法选定的先行指标包括:货币供应量M1、固定资产投资本年新开工项目个数增速、股票成交量增速、固定资产投资增速、商品房销售额增速、生铁产量增速及货物周转量增速等7个指标。一致指标包括进口额增速、发电量增速、水泥产量增速、出口额增速、钢材产量增速、汽车产量增速及能源生产增速等指标。
第三,利用主成分分析法构建先行合成指数和一致合成指数。实践证明,先行合成指数的平均先行期约为2个月,先行合成指数对经济运行具有较好的先导功能(领先宏观经济的变化而变化)和预测功能(预测宏观经济的未来变化趋势)。先行合成指数表明,2009年2月我国宏观经济景气达到谷底,随后开始逐步回升,2010年1月和2月,先行合成指数出现回落。
第四,Probit模型分析我国宏观经济转折点,Probit模型预测2010年3月和2010年4月的经济景气概率,2010年3月概率为0.88,2010年4月为0.72,表明在3月和4月,我国的经济将持续向好,整体经济增长不会出现转折。
程序附录
*BBAlternate enforces the requirement that peaks and troughs alternate。 If we
*have two consecutive turning points of the same type, we take the more extreme
*of the two based upon the values in"x"。
procedure BBAlternate peak trough x startl endl
type seriespeak trough x
type integerstartl endl
local seriescounts
local integer count
local realwmin wmax
*If we have consecutive peaks or consecutive troughs, choose the highest peak and
*lowest trough。 ACC applied to the series PEAK will give a step function which is
*constant between peaks。 For each test value of this series(that is, for each
*run between peaks),we analyze all values for which TROUGH is non zero and pick
*the one that achieves the smallest value for X。
acc peak startl endl counts
do count=0,fix(counts(endl))
sstats(min, smpl=(counts==count。 and。trough))startl endl x>>wmin
set trough startl endl=%if(counts==count。 and。trough, x==wmin, trough)
end do count
*Analogous treatment for analyzing peaks between troughs
acc trough startl endl counts
do count=0,fix(counts(endl))
sstats(max, smpl=(counts==count。 and。peak))startl endl x>>wmax
set peak startl endl=%if(counts==count。 and。peak, x==wmax, peak)
end do count
end
*************************************************************************
*BBRefine refines the dates of the peak and trough dummies based upon the series
*X。 The new dates are the highest(for peaks)or lowest(for troughs)which are
*within 5 periods(controlled by"span"option)of the old dates。
*Notes, peaks and troughs must alternate, and this is checked and the dates
*modified if necessary
procedure BBRefine peak trough x startl endl
type series peak trough x
type integerstartl endl
option integer span 5
local series max min time extract
local integer npt tp
local real tpx
mvfractiles(max=max, min=min, centered, span=2*span+1)x startl+span endl span
*Pad out the max and min series at the ends of the data set
set max startl startl+span-1=max(startl+span)
set max endl-span+1 endl=max(endl-span)
set min startl startl+span-1=min(startl+span)
set min endl-span+1 endl=min(endl-span)
set time startl endl=t
sample(smpl=peak)time startl endl extract 1
compute npt=%nobs
do i=1,npt
compute tp=fix(extract(i))
sstats(max, smpl=(x==max(tp)))tp-span tp+span t>>tpx
compute peak(tp)=0. 0,peak(fix(tpx))=1.0
end do i
sample(smpl=trough)time startl endl extract 1
compute npt=%nobs
do i=1,npt
compute tp=fix(extract(i))
sstats(max, smpl=(x==min(tp)))tp-span tp+span t>>tpx
compute trough(tp)=0. 0,trough(fix(tpx))=1.0
end do i
*Make sure dates alternate
@BBAlternate peak trough x startl endl
end
*************************************************************************
*BBEnforceMinCycle enforces the restriction that a cycle be at least 15 months
*(controlled by mincycle option)peak to peak or trough to trough。 If we run
*across such a situation, the more extreme of the two peak/trough values is
*retained and the other eliminated。
procedure BBEnforceMinCycle peak trough x startl endl
type seriespeak trough x
type integerstartl endl
option integer mincycle 15
local seriestime extract
local integeri p0 p1
set time startl endl=t
sample(smpl=peak)time startl endl extract 1
do i=2,%nobs
compute p1=fix(extract(i)),p0=fix(extract(i-1))
if p1-p0<mincycle
if x(p1)<x(p0)
compute peak(p1)=0. 0
else
compute peak(p0)=0. 0
end do i
@BBAlternate peak trough x startl endl
sample(smpl=trough)time startl endl extract 1
do i=2,%nobs
compute p1=fix(extract(i)),p0=fix(extract(i-1))
if p1-p0<mincycle
if x(p1)>x(p0)
compute trough(p1)=0. 0
else
compute trough(p0)=0. 0
end do i
@BBAlternate peak trough x startl endl
end
*************************************************************************
*BBEnforceMinPhase enforces the restriction that a phase(peak to trough or
*trough to peak)be at least 5 months(controlled by the minphase option)。 If we
*run across such a situation, the later of the two is dropped, the alternation
*rule is reapplied and we rescan the data。 This is repeated until all phases
*mean the minimum length。
procedure BBEnforceMinPhase peak trough x startl endl
type seriespeak trough x
type integerstartl endl
option integer minphase 5
local seriestime extract
local integerntp p1
local realminvalue
*Repeat until the minimum phase is 5 or larger
set time startl endl=t
loop
*Extract the list of turning points into"extract"
sample(smpl=peak+trough)time startl endl extract 1
compute ntp=%nobs
sstats(min)2 ntp extract-extract{1}>>minvalue
if minvalue>=minphase
break
*Classify the shortest phase, and knock it out of its dummy
compute p1=fix(extract(%minent))
if peak(p1)
compute peak(p1)=0. 0
else
compute trough(p1)=0. 0
*Enforce alternation and continue
@BBAlternate peak trough x startl endl
end loop
end
*************************************************************************
*BBEnforceEndPoints eliminates peaks and troughs at both ends which are lower(or
*higher)than values closer to end。
procedure BBEnforceEndPoints peak trough x startl endl
type seriespeak trough x
type integer startl endl
local realtp0
*Keep looping over the front end, eliminating turning points until the first
*turning point is higher(peak)or lower(trough)than the initial value。
loop
sstats(min, smpl=peak+trough)startl endl t>>tp0
if peak(fix(tp0))。 and。x(fix(tp0))<x(startl){compute peak(fix(tp0))=0
next}
else
if trough(fix(tp0))。 and。x(fix(tp0))>x(startl){compute trough(fix(tp0))=0
next}
break
end loop
*Keep looping over the back end, eliminating turning points until the first
*turning point is higher(peak)or lower(trough)than the final value
loop
sstats(max, smpl=peak+trough)startl endl t>>tp0
if peak(fix(tp0))。 and。x(fix(tp0))<x(endl){
compute peak(fix(tp0))=0
next}
else
if trough(fix(tp0))。 and。x(fix(tp0))>x(endl){
compute trough(fix(tp0))=0 next}
break
end loop
end
*************************************************************************
*BBMCD calculates the months of statistical dominance for series x
procedure BBMCD x startl endl
type seriesx
type integerstartl endl
option integer max12
option integer*width
local seriesxsp irreg
local realnum den
filter(type=spencer, width=15,extend=repeat)x startl endl xsp
set irreg startl endl=x xsp
do j=1,max
sstats startl+j endl abs(irreg-irreg{j})>>num abs(xsp-xsp{j})>>den
if num<den{
compute width=j
return}
end do j
disp"No acceptable lag for MCD。 Increase max"
compute width=max
end
*************************************************************************
procedure BBOutput peak trough startl endl
type seriespeak trough
type integerstartl endl
option choiceprint 1 none final all
option choicelevel 1 short long
option stringtitle
local seriestime expeak extrough
local integeri
local integerpeakbase troughbase
local integertroughoffset peakoffset npeak ntrough
if print==1. or。level==1.and。print==2
return
set time startl endl=t
sample(smpl=peak)time startl endl expeak1
compute npeak=%nobs
sample(smpl=trough)time startl endl extrough 1
compute ntrough=%nobs
if extrough(1)<expeak(1)
compute peakbase=3,troughbase=2,troughoffset=0,peakoffset=1
else
compute peakbase=2,troughbase=2,troughoffset=1,peakoffset=0
if level==1{report(action=define)
report(atrow=1,atcol=1,span)title
report(atrow=2,atcol=1)"Peaks""Troughs"
do i=1,npeak
report(atrow=i+peakbase, atcol=1)%datelabel(fix(expeak(i)))
end do i
do i=1,ntrough
report(atrow=i+troughbase, atcol=2)%datelabel(fix(extrough(i)))
end do i
report(action=show)}
else{report(action=define)
report(atrow=1,atcol=1,span)title
report(atrow=2,atcol=1)"Peaks""Peak to Peak""Trough to Peak""Troughs""Trough to Trough""Peak to Trough"
do i=1,npeak
report(atrow=i+peakbase, atcol=1)%datelabel(fix(expeak(i)))
if i>1
report(atrow=i+peakbase, atcol=2)fix(expeak(i)-expeak(i-1))
if i>troughoffset
report(atrow=i+peakbase, atcol=3)fix(expeak(i)-extrough(i-troughoffset))
end do i
do i=1,ntrough
report(atrow=i+troughbase, atcol=4)%datelabel(fix(extrough(i)))
if i>1
report(atrow=i+troughbase, atcol=5)fix(extrough(i)-extrough(i-1))
if i>peakoffset
report(atrow=i+troughbase, atcol=6)fix(extrough(i)-expeak(i-peakoffset))
end do i
report(action=show)}
end
procedure BryBoschan x start end
type seriesx
type integerstart end
option integer ma
option choiceprint 1 none final all
option series*peak
option series*trough
option switchquarterly 0
local integerstartl endl fwidth
local reallpeaksum ltroughsum
local integercenterspan initialspan refinespan mincycle minphase
local seriesxsp d xo xspo x12 max min lpeak ltrough mcdx
local integerBBQuarterly
*Set control parameters for quarterly vs monthly
if。 not。%defined(x){
disp"Syntax:@BryBoschan(options)>>x<<start end"
return}
*Override<<quarterly>>option if the data are quarterly
if quarterly。 or。2:1-1:1==4
compute BBQuarterly=1
else
compute BBQuarterly=0
if BBquarterly
compute centerspan=4,initialspan=2,refinespan=2,mincycle=5,minphase=2
else
compute centerspan=12,initialspan=5,refinespan=5,mincycle=15,minphase=5
inquire(series=x)startl<<start endl<<end
*Step I
*For monthly data, compute a 15 term Spencer MA as the initial estimate of the trend cycle。
*EXTEND=REPEAT allows the filter to be computed over the full range by making pre sample
*values equal to the first observation and post-sample values equal to the last
*observation。 Replace outliers with the Spencer MA value。
*For quarterly data, just take the raw data series
if BBquarterly
set xo startl endl=x
else{
filter(type=spencer, width=15,extend=repeat)x startl endl xsp
set d=x xsp
diff(standardize)d startl endl
set xo startl endl=%if(abs(d)>=3.5,xsp, x)}
*Step II
*For monthly data, do symmetric one year moving averages, for quarterly, just take raw data。
*Do preliminary check for peaks and troughs by seeing which data points are the maximum or
*minimum within a centered eleven month(five quarter)period window(leaving out any
*points near the ends)。
if BBquarterly
set x12 startl endl=xo
else
filter(type=centered, span=centerspan, extend=repeat)xo startl endl x12
mvfractiles(max=max, min=min, centered, span=2*initialspan+1)x12 startl+initialspan endl initialspan
*Pad out the ends of the max and min series
set max startl startl+initialspan-1=max(startl+initialspan)
set max endl-initialspan+1 endl=max(endl-initialspan)
set min startl startl+initialspan-1=min(startl+initialspan)
set min endl-initialspan+1 endl=min(endl-initialspan)
set lpeakstartl endl=t>=startl+initialspan。and。t<=endl-initialspan。and。x12==max
set ltrough startl endl=t>=startl+initialspan。and。t<=endl-initialspan。and。x12==min
*Check for at least one peak or trough
sstats startl endl lpeak>>lpeaksum
sstats startl endl ltrough>>ltroughsum
if lpeaksum==0. 0.and。ltroughsum==0.0
{display
display"Turning Points for Series"+%l(x)
display"****************"
display"No Cycles Found"
display"****************"
display
return}
*If have consecutive peaks or consecutive troughs, choose the highest peak and
*lowest trough。
@BBAlternate lpeak ltrough x12 startl endl
@BBOutput(print=print, title="Step II",level=short)lpeak ltrough startl endl
*Skip steps III and IV for quarterly data
if BBquarterly{compute fwidth=refinespan
branch step5}
*Step III
filter(type=spencer, width=15,extend=repeat)xo startl endl xspo
*Refine turning points using the resmoothed data
@BBRefine(span=refinespan)lpeak ltrough xspo startl endl
@BBAlternate lpeak ltrough x startl endl
*Enforce minimum cycle lengths
@BBEnforceMinCycle(mincycle=mincycle)lpeak ltrough xspo startl endl
@BBOutput(print=print, title="Step III",level=short)lpeak ltrough startl endl
*Step IV
:step4
if%defined(ma)
compute fwidth=ma
else{@BBMCD(max=12,width=fwidth)x startl endl
if fwidth<=2
compute fwidth=3
else
if fwidth<=4
compute fwidth=4
else
if fwidth<=6
compute fwidth=5
else
compute fwidth=6}
filter(width=fwidth, type=centered, extend=repeat)x startl endl mcdx
@BBRefine(span=refinespan)lpeak ltrough mcdx startl endl
@BBAlternate lpeak ltrough x startl endl
@BBOutput(print=print, title="Step IV",level=short)lpeak ltrough startl endl
compute fwidth=%imax(fwidth,4)
*Step V
:step5
@BBRefine(span=fwidth)lpeak ltrough x startl endl
@BBAlternate lpeak ltrough x startl endl
@BBEnforceEndPoints lpeak ltrough x startl endl
@BBEnforceMinCycle(mincycle=mincycle)lpeak ltrough x startl endl
@BBEnforceMinPhase(minphase=minphase)lpeak ltrough x startl endl
@BBOutput(print=print, title="Turning Points for Series"+%l(x),level=long)lpeak ltrough startl endl
if%defined(peak)
set peak startl endl=lpeak
if%defined(trough)
set trough startl endl=ltrough
end
参考资料
1.梁琪,滕建州。中国经济周期波动的经验分析[J]。世界经济,2007(2)。
2.李星。我国商品市场景气转折点的分析与预测[J]。财经理论与实践,2008(11)。
3.陈磊,孔宪丽。转折点判别与经济周期波动态势分析[J]。数量经济技术经济研究,2007(6)。
4.姜向荣。景气指标的筛选方法及运用[J]。统计与决策,2007(2)。
5.冯润民。基于竞争神经网络宏观经济预警指标选取研究[J]。现代管理学,2009(1)。
6.丁文斌。北京先行经济指数研究[J]。山西财经大学学报,2004(8)。
7.Sanjib Bordoloi and Raj Rajesh。Forecasting the Turning Points of the Business Cycles With Leading Indicators in India:A Probit Approach。Paper Prepared for the Singapore Economic Review Conference August 2-4,2007 at Singapore。