📖 ZKIZ Archives


2013-11-22 工作記錄(補充) Damon 濟南實習

http://blog.sina.com.cn/s/blog_9ad4e2650101opyd.html
昨天做的交易策略今天中午和Jackie溝通了下,出現了一些錯誤,更正了昨天的交易策略,由重複了一下,但是這次的結果表明這個策略的結果好的難以置信,所以將中間結果和以前EXcel中的做了對比,但是沒有發現問題,現在唯一找到的可能性是這期間內交易費用未剔除並用於投資的影響。下做一介紹,該策略與不做任何操作引起的總資產變化如下圖:
 初始資產為15405.45(從第101開始看),最後的總資產為36801.5,在實施策略的840天內資產變化如下圖:
2013-11-22 <wbr>工作记录(补充) <wbr>Damon

該策略使得資產翻了兩倍半,下面是資產比率(策略實施/不加策略),我也覺著這也太多了些,還沒找到是不是程序的問題。
2013-11-22 <wbr>工作记录(补充) <wbr>Damon

具體代碼如下:

#讀取數據
Data<-function(){
setwd("D:/SimData")
library(RODBC)
channel<-odbcConnectExcel("600028.SH.xls")
Data<-sqlFetch(channel,"sheet1")
Data<-na.omit(Data)
return(Data)
odbcClose(channel)
setwd("D:/My Documents")
}

#交易策略制定以及 資產變化觀測
Rult<-function(a,Onumber){
Num<-matrix(nrow=(nrow(a)-99),ncol=ncol(a))#變量初始化,存儲各個股票的股數,100為平滑時間
AVG<-matrix(nrow=(nrow(a)),ncol=ncol(a))   #價格均值
Sg<-matrix(nrow=(nrow(a)),ncol=ncol(a))    #偏離
Avg<-matrix(nrow=(nrow(a)-99),ncol=ncol(a)) #偏離均值
SD<-matrix(nrow=(nrow(a)-99),ncol=ncol(a)) #偏離方差
Sig<-matrix(nrow=(nrow(a)-99),ncol=ncol(a)) #偏離度
Pvo<-matrix(nrow=(nrow(a)-99),ncol=ncol(a))#用於交易時的各股資產,今天交易前的資產(今天的價格 乘以昨天的 數量) 
Pv<-matrix(nrow=(nrow(a)-99),ncol=ncol(a)) #各股資產
Num[1,1:8]<-Onumber                     #初始分配股數 
Pv[1,1:8]<-Onumber*a[100,1:8] 
for(i in 1:100){
for(j in 1:8){
AVG[i,j]<-mean(a[1:i,j])
Sg[i,j]<-((a[i,j]/AVG[i,j])-1)
}
}

for(i in 101:length(a[ ,1])){   #運算的日期數
for(j in 1:8){                #八隻股票
AVG[i-1,j]<-mean(a[1:i-1,j])
Sg[i-1,j]<-((a[i-1,j]/AVG[i-1,j])-1) #計算偏離
Avg[i-100,j]<-mean(Sg[1:(i-1),j])
SD[i-100,j]<-2*sd(Sg[1:(i-1),j])
Sig[i-100,j]<-(Sg[i-1,j]-Avg[i-100,j])/SD[i-100,j]#計算偏離度
}
Pvo[i-100,1:8]<-(a[i,1:8]*Num[i-100,1:8])         #今天交易前的資產(今天的價格 乘以昨天的數量) 
Num[i-99,1:8]<-Quan(Sig[i-100,1:8],Num[i-100,1:8],Pv[i-100,1:8],a[i-1,1:8])
Pv[i-99,1:8]<-(a[i,1:8]*Num[i-99,1:8])
}  
return(Pv)
}


#執行 股票 賣出 、 買入 策略
Quan<-function(Sig,Num,Pv,a){
for(i in 1:2){

if((max(Sig)>1)&&(length(subset(Num,Num<0.1))<2)){  #價格過高賣出主導的交易  
MA<-which.max(Sig);
MI<-which.min(Sig);
if((Pv[MI]+Pv[MA])/sum(Pv)<=0.2){
Num[MI]<-(Num[MI]+Pv[MA]/a[MI]);
Sig[MA]<-mean(Sig);
}else{
T=sum(Pv)*0.2-Pv[MI];
Num[MA]<-( Num[MA]- T/a[MA] );
Num[MI]<-sum(Pv)*0.2/a[MI];
Pv[MA]<-(Pv[MA]-T);
Sig[MI]<-mean(Sig);}
}

if((min(Sig)<(-1))&(length(subset(Num,Num<0.1))<2)){ #價格過低買入主導的交易
MA<-which.max(Sig);
MI<-which.min(Sig);
if( (Pv[MA]+Pv[MI])/sum(Pv)<=0.2){
Num[MI]<-(Num[MI]+Pv[MA]/a[MA]);
Sig[MA]<-mean(Sig);
}else{
T=sum(Pv)*0.2-Pv[MI];
Num[MA]<-( Num[MA]- T/a[MA] );
Num[MI]<-sum(Pv)*0.2/a[MI];
Pv[MA]<-(Pv[MA]-T);
Sig[MI]<-mean(Sig);}
}
}
return(Num)
}


#總交易分析函數
Dpv<-function(){
Onumber<-1000/8                     #初始分配一隻股票的股數
DATA<-Data()
c<-DATA[ ,2:9]                      #數據轉換
a<-as.matrix(c)
Output<-Rult(a,Onumber)              #返回每期各個股票的市值
Befor<-matrix(nrow=(nrow(a)-99),ncol=1)
After<-matrix(nrow=(nrow(a)-99),ncol=1)
Dpv<-matrix(nrow=(nrow(a)-99),ncol=1)
for(i in 1:nrow(Pv)){
Befor[i]<-(sum(a[i+99, ])*Onumber)
After[i]<-sum(Pv[i, ])
}
Dpv<-(After-Befor)
return(Dpv)
}
PermaLink: https://articles.zkiz.com/?id=82612

Next Page

ZKIZ Archives @ 2019