数据:
本帖隐藏的内容
1,先读取数据- # 先读取xls数据
- library(RODBC)
- excel_conn<-odbcConnectExcel('SVM_HS300Data.xls')
- HS300.Data<-sqlFetch(excel_conn,'Sheet1')
- # 关闭DB连接
- close(excel_conn)
- # 查看数据
- head(HS300.Data,30)
2,再获取训练和回测的数据集
- Close<-HS300.Data[,5]
- # Macd的函数
- macd<-function(Stock,short_period,
- long_period,dea_period) {
- # Stock是股票的价格
- # short_period是短期
- # long_period是长期
- # 还有dea_period
- length_stock<-length(Stock)
- EMA_short<-rep(0,length_stock)
- EMA_long<-rep(0,length_stock)
- stock_diff<-rep(0,length_stock)
- stock_dea<-rep(0,length_stock)
- stock_macd<-rep(0,length_stock)
- # 计算各类指标初始值
- EMA_short[1]<-Stock[1]
- EMA_long[1]<-Stock[1]
- stock_diff[1]<-0
- stock_dea[1]<-0
- stock_macd[1]<-0
- # 计算各类指标
- for (t in 2:length_stock) {
- EMA_short[t]<-Stock[t]*2/(short_period+1)+
- EMA_short[t-1]*(short_period-1)/(short_period+1)
- EMA_long[t]<-Stock[t]*2/(long_period+1)+
- EMA_long[t-1]*(long_period-1)/(long_period+1)
- stock_diff[t]<-EMA_short[t]-EMA_long[t]
- stock_dea[t]<-stock_diff[t]*2/(dea_period+1)+
- stock_dea[t-1]*(dea_period-1)/(dea_period+1)
- stock_macd[t]<-2*(stock_diff[t]-stock_dea[t])
- }
- return(stock_macd)
- }
- # 自变量选择过去一天和两天的Macd指标、过去一天的涨跌情况
- # 过去两天的涨跌情况(测试)代表历史T-1时刻的信息集
- # 因变量是今天的涨跌情况(代表T时刻的信息集)(1代表涨0代表跌)
- short_period<-5
- long_period<-25
- dea_period<-9
- Macd<-macd(Close,short_period,long_period,dea_period)
- Diff<-diff(Close)
- Diff<-ifelse(Diff>0,1,0)
- # T时刻的涨跌情况(因变量)
- Diff.T<-Diff
- Diff.T<-c(NA,Diff.T)
- # T-1时刻的涨跌情况(自变量)
- Diff.T1<-Diff[-length(Diff)]
- Diff.T1<-c(NA,NA,Diff.T1)
- # T-2时刻的涨跌情况(自变量)
- Diff.T2<-Diff[-c((length(Diff)-1),length(Diff))]
- Diff.T2<-c(NA,NA,NA,Diff.T2)
- # T-1时刻的Macd情况(自变量)
- Macd.T1<-Macd[-length(Macd)]
- Macd.T1<-c(NA,Macd.T1)
- # T-2时刻的Macd情况(自变量)
- Macd.T2<-Macd[-c((length(Macd)-1),length(Macd))]
- Macd.T2<-c(NA,NA,Macd.T2)
- # 数据集
- N<-length(Close)
- Data.train<-data.frame(
- y=as.factor(Diff.T[c((N-199):(N-50))]),
- x1=Diff.T1[c((N-199):(N-50))],
- x2=Diff.T2[c((N-199):(N-50))],
- x3=Macd.T1[c((N-199):(N-50))],
- x4=Macd.T2[c((N-199):(N-50))])
- Data.test<-data.frame(
- x1=Diff.T1[c((N-49):(N))],
- x2=Diff.T2[c((N-49):(N))],
- x3=Macd.T1[c((N-49):(N))],
- x4=Macd.T2[c((N-49):(N))])
- # 建立支持向量机模型
- library(e1071)
- Hs300SvmModel<-svm(y~x1+x2+x3+x4,
- data=Data.train,probability=TRUE)
- # 预测
- Predict<-predict(Hs300SvmModel,Data.test,
- probability=TRUE)
- # 最终得到了预测的涨跌情况
- Predict<-as.numeric(as.vector(Predict))
- # 看下预测的准确率
- sum(Diff.T[c((N-49):(N))]==Predict)/50
- # 建立交易和回测
- cost<-0.001
- Length<-length(Predict)
- Trading.Return<-rep(0,Length)
- Close.test<-Close[c((N-50):N)]
- for (i in 1:Length) {
- if (Predict[i]==1) {
- # 涨的情况
- Trading.Return[i]<-
- Close.test[i+1]*(1-cost)-Close.test[i]*(1+cost)
- } else {
- # 跌的情况
- Trading.Return[i]<-
- Close.test[i]*(1-cost)-Close.test[i+1]*(1+cost)
- }
-
- }
- # 累积回报
- Trading.Return<-cumsum(Trading.Return)
- # 试验结果惨败
- # 最大回撤比率的函数
- Retreat_Ratio<-function(stock_return1) {
- N<-length(stock_return1)
- RetraceRatio<-rep(0,N)
- for (i in 2:N) {
- C<-max(stock_return1[1:i])
- if (C==stock_return1[i]) {
- RetraceRatio[i]<-0
- } else {
- RetraceRatio[i]<-(stock_return1[i]-C)/C
- }
- }
- return(RetraceRatio)
- }
- retreat_ratio<-Retreat_Ratio(Trading.Return)
- # 回测比率和买卖仓位作图
- par(family='serif',mfrow=c(2,1))
- c1<-c(c(0:Length),c(Length:0))
- c2<-c(c(0,retreat_ratio),rep(0,Length+1))
- plot(c1,c2,type='n',xlab='Time',
- ylab='Retreat Ratio')
- polygon(c1,c2,col='green',border='yellow')
- title('follow your Retreat Ratio')
- plot(Predict,type='b',pch=21,
- lwd=0.8,col='blue',bg='green',main='交易头寸回顾')
- # #######################################################
- # #######################################################