文章目录
下载某种股票(例如苹果公司股票)在特定时间段内行情数据,计算CCI指标,指出买入卖出时机,并评估该指标信号成功率(最好用程序计算而非肉眼观察)
以Apple的股票为例 先获取AAPL股票2011~2012年的交易数据,并CCI指标曲线
1 2 3 4 5
| > myenv<-new.env() > getSymbols("AAPL",env=myenv,src="yahoo",from="2011-01-01",to="2012-12-31") [1] "AAPL" > chartSeries(get("AAPL",myenv),name="AAPL",type="candlesticks") > addCCI()
|
AAPL的蜡烛图和CCI曲线如下,
可以自己计算一下CCI数值,代码如下,
1 2 3 4 5 6 7 8 9 10
| > AAPL<-get("AAPL",myenv) > AAPL.CCI<-CCI(Cl(AAPL)) > head(AAPL.CCI[abs(AAPL.CCI)>100]) cci 2011-02-07 167.4110 2011-02-08 185.3041 2011-02-09 191.5906 2011-02-10 127.2951 2011-02-11 133.7871 2011-02-14 138.8391
|
根据CCI指标的判定标准,在向上穿过100和向上穿过-100的时候买入,在向下穿过100和向下穿过-100的时候卖出。关于判定标准可以参考这里。由这个标准加以简化成:当前一天的CCI<100并且当天的CCI>100时,买入;当前一天的CCI<-100并且当天的CCI>-100的时候,买入;当前一天的CCI>100并且当天的CCI<100时,卖出;当前一天的CCI>-100并且当天的CCI<-100的时候,卖出。根据CCI获得买点和卖点的代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| > AAPL.buy <- AAPL.CCI[(AAPL.CCI>100 & lag(AAPL.CCI)<100) | (AAPL.CCI> -100 & lag(AAPL.CCI)< -100)] > head(AAPL.buy) cci 2011-02-07 167.41103 2011-03-21 -71.17054 2011-04-12 -92.71218 2011-04-18 -90.40401 2011-04-21 105.07637 2011-05-19 -91.89860 > AAPL.sell <- AAPL.CCI[(AAPL.CCI<100 & lag(AAPL.CCI)>100) | (AAPL.CCI< -100 & lag(AAPL.CCI)> -100)] > head(AAPL.sell) cci 2011-02-17 80.81100 2011-03-16 -226.77233 2011-04-11 -121.86844 2011-04-15 -150.78366 2011-04-27 98.61009 2011-05-16 -193.65209
|
为了评估CCI的成功率,我们采用买点之后一周(5个交易日)和一个月(20个交易日)的收益率来判定是否是一次成功的操作。计算周收益率和月收益率的代码如下
1 2
| > AAPL.wRet <- Delt(Cl(AAPL), k=5) > AAPL.mRet <- Delt(Cl(AAPL), k=20)
|
注意,这里没有采用weeklyReturn和monthlyReturn函数,这是因为这2个函数会隔1周(月)来计算,而不是连续交易日计算。 接下来获取买点上的周收益率和月收益率,卖点的分析类似,代码如下
1 2 3 4
| > AAPL.wRetCCI <- merge(AAPL.wRet,AAPL.buy) > AAPL.mRetCCI <- merge(AAPL.mRet,AAPL.buy) > AAPL.wBuy<-AAPL.wRetCCI[is.na(AAPL.wRetCCI[,2])==F ] > AAPL.mBuy<-AAPL.mRetCCI[is.na(AAPL.mRetCCI[,2])==F ]
|
周收益率和月收益率的统计分析,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| > ndays(AAPL.wBuy) [1] 46 > ndays(AAPL.wBuy[AAPL.wBuy[,1]>0]) [1] 27 > ndays(AAPL.wBuy[AAPL.wBuy[,1]<0]) [1] 19 > summary(coredata(AAPL.wBuy[,1])) Delt.5.arithmetic Min. :-0.047253 1st Qu.:-0.017919 Median : 0.003219 Mean : 0.008318 3rd Qu.: 0.025278 Max. : 0.141157 > var(coredata(AAPL.wBuy[,1])) Delt.5.arithmetic Delt.5.arithmetic 0.001327706 > ndays(AAPL.mBuy[AAPL.mBuy[,1]>0]) [1] 22 > ndays(AAPL.mBuy[AAPL.mBuy[,1]<0]) [1] 24 > summary(coredata(AAPL.mBuy[,1])) Delt.20.arithmetic Min. :-0.105763 1st Qu.:-0.036321 Median :-0.001552 Mean : 0.012902 3rd Qu.: 0.051984 Max. : 0.204581 > var(coredata(AAPL.mBuy[,1])) Delt.20.arithmetic Delt.20.arithmetic 0.005551901
|
大致总结一下,买点总共有46个,按周收益率判定,买点后1周内,收益率>0的有27个,占比58.7%,均值0.8318%,方差0.1327706%;按月收益率判定,买点后1个月内,收益率>0的有22个,占比47.8%,均值1.2902%,方差0.5551901%。由于CCI是短线操作的超买超卖判定指标,所以短期的收益率应该比较能判定这个指标的性能,因此周收益率应该作为主要的参考。
同样的分析可以用于卖点的分析,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| > AAPL.wRetCCIs <- merge(AAPL.wRet,AAPL.sell) > AAPL.mRetCCIs <- merge(AAPL.mRet,AAPL.sell) > AAPL.wSell<-AAPL.wRetCCIs[is.na(AAPL.wRetCCIs[,2])==F ] > AAPL.mSell<-AAPL.mRetCCIs[is.na(AAPL.mRetCCIs[,2])==F ] > ndays(AAPL.wSell) [1] 46 > ndays(AAPL.wSell[AAPL.wSell[,1]>0]) [1] 18 > ndays(AAPL.wSell[AAPL.wSell[,1]<0]) [1] 28 > summary(coredata(AAPL.wSell[,1])) Delt.5.arithmetic Min. :-0.10974 1st Qu.:-0.04421 Median :-0.01815 Mean :-0.01892 3rd Qu.: 0.01183 Max. : 0.03638 > var(coredata(AAPL.wSell[,1])) Delt.5.arithmetic Delt.5.arithmetic 0.001108976 > ndays(AAPL.mSell[AAPL.mSell[,1]>0]) [1] 20 > ndays(AAPL.mSell[AAPL.mSell[,1]<0]) [1] 26 > summary(coredata(AAPL.mSell[,1])) Delt.20.arithmetic Min. :-0.128912 1st Qu.:-0.040139 Median :-0.009042 Mean : 0.010768 3rd Qu.: 0.063386 Max. : 0.194670 > var(coredata(AAPL.mSell[,1])) Delt.20.arithmetic Delt.20.arithmetic 0.006016731
|
总结一下卖点的分析数据,卖点总共有46个,按周收益率判定,卖点后1周内,收益率<0的有28个,占比60.9%,均值-1.892%,方差0.1108976%;按月收益率判定,卖点后1个月内,收益率<0的有26个,占比56.5%,均值1.0768%,方差0.6016731%。
总体而言,CCI的判定效果对于AAPL股票并没有很高的成功率,对于算法交易而言,成功率>70%以上的操作才有实用价值。这也说明了,当一个技术指标已经被大众所熟知的时候,就已经难以发挥其原先的效果了。