99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀R語言構(gòu)建追漲殺跌量化交易模型
R語言構(gòu)建追漲殺跌量化交易模型
2017-04-07
收藏

R語言構(gòu)建追漲殺跌量化交易模型

久經(jīng)股市的老股民,通常都會使用一種常見的交易策略,追漲殺跌交易法。追漲殺跌法,是股市操作的一個重要技巧,就是在股市上漲時買入股票,股市下跌時賣出股票。如果操作得當(dāng)是很好的贏利手段,在中國股市2015年上半年的牛市中,追漲殺跌交易法就是交易神器法門。

1. 什么是追漲殺跌?
追漲殺跌是金融市場的專業(yè)術(shù)語,是金融技術(shù)派操盤的一種方式,與抄底摸頂?shù)牟僮鞣绞絼偤孟喾?。追漲殺跌的操作方法是,金融市場中在金融產(chǎn)品(股票,期貨,外匯等)價格上漲的時候買入,以期待漲得更多,并以更高的價格賣出獲利;在價格下跌的時候賣出進行止損,不管之前金融產(chǎn)品買入的價格是多少,都立刻賣出,以避免更大的損失。
下面以平安銀行(000001)股票日K線圖為例,截取2005年到2015年7月的股票數(shù)據(jù),股價為向前復(fù)權(quán)的價格。

上圖中有3條曲線,黑色線是平安銀行向前復(fù)權(quán)后的每日股價,紅色線為20日均線,藍(lán)色線為60日均線。關(guān)于均線的介紹,請參考文章 兩條均線打天下。圖中還有一條紅色的水平線虛線,是這10年的股價平均值等于7.14元。這10年間,平安銀行股價起起落落,每次上漲都會持續(xù)一段時間,那么在我們可以上漲中段追入買進,在大幅下跌之前賣出,就是追漲殺跌法。

追漲
追漲通常有2種情況,短線追漲和中線追漲。以股票交易為例。
短線追漲:當(dāng)天股價已經(jīng)漲了5個點或更多,這時追進去買入,期待當(dāng)天收盤漲停,等下一個交易日高價賣出,這就是短線追漲。
中線追漲:某只股票的股價已經(jīng)上漲了一段時間,走勢很強,底部上漲已經(jīng)有30%或更多,這個時追進去買入,期待后勢持續(xù)上漲,是中線追漲。
不論短線追漲還是中線追漲,我們追漲的理由和判斷的標(biāo)準(zhǔn)都是一樣的,“漲得好的股票說明走勢很強,那么追強勢股期待股票持續(xù)上漲”。但從另一個角度看,追漲的風(fēng)險也是很大的,關(guān)鍵在于我們不知道它能漲到什么時候,到什么位置可能會回調(diào),什么時候是莊家出貨。所以說追漲技巧性很強,什么情況下能追,什么情況下不能追,都是很有講究的。

殺跌
殺跌也是一門較深的操作技巧,殺得好的話既可以回避風(fēng)險。如果不能進行殺跌的準(zhǔn)確判斷,則很可能會發(fā)生硬性止損,導(dǎo)致嚴(yán)重的虧損。
采取殺跌戰(zhàn)術(shù),必須掌握以下操作要點:
殺跌的重要前提是知變,就是對消息、對量能、對周邊各種因素的影響有一個準(zhǔn)確的、快速的知變過程。
殺跌要善于觀察盤面、形態(tài)、消息、輿論等方面的細(xì)微變化,在對大盤作出準(zhǔn)確估量的基礎(chǔ)上,迅速作出反應(yīng)就是確定賣出哪支股票,賣出多少等。
殺跌要善于思考大盤與目標(biāo)股之問的正向、反向的相關(guān)性,及目標(biāo)股的能量能等方向的關(guān)系,從中找出變動的規(guī)律。
當(dāng)市場利好消息接踵而至?xí)r,應(yīng)隨時準(zhǔn)備賣出股票。當(dāng)利好出盡就會轉(zhuǎn)向利空,往往消息明朗時,股價早已下跌大半,導(dǎo)致措手不及。
殺跌的后續(xù)操作就比較簡單了,只需保持良好的心態(tài),耐心等待見底信號后再抄底。一般只有在底部成功接回股票或換股才算成功的殺跌,否則殺跌會失去意義。應(yīng)保持耐心,千萬不要在股價反彈時貿(mào)然介入,否則屢買屢跌、會加大損失,應(yīng)待股價反轉(zhuǎn)時再介入。

追漲殺跌的技巧
要觀大勢,看清整個市場多空對決的優(yōu)勢一方是誰。
追漲殺跌的假設(shè)條件:
市場處于強勢交易格局。強勢格局賦予個股良好的運作基礎(chǔ);相反,如果市場處于平衡狀態(tài),就不適合進行追漲殺跌,更適合高拋低吸。
市場形成了鮮明并有持續(xù)性上漲能力的熱點或板塊效應(yīng)。
追漲操作的對象:
市場形成鮮明的可持續(xù)性的熱點時,可追漲這個熱點。從理論上講,只要把握熱點板塊就能獲利,追漲時應(yīng)重點關(guān)注龍頭企業(yè)。比如:滬深300指數(shù)的成分股,就是不錯的選擇。
形成明顯的上漲趨勢的個股可以考慮追漲。個股突破重要的壓力線,如頭肩底形態(tài)的頸線位、整理箱體的箱頂位、三角形的上邊眼、長期下降趨勢線等,待回抽確認(rèn)其突破的有效性后,可考慮追漲。
追漲殺跌的注意事項:
追漲時應(yīng)設(shè)好止盈位和止損位,確定自己的大致盈利目標(biāo)。
追漲殺跌應(yīng)該注意頻率的減少,過于頻繁的操作,一旦失誤增多會嚴(yán)重影響情緒。
追漲殺跌中要多一分平和的心態(tài),少一些僥幸;多一分理性,少一分感性。
追漲殺跌的市場操作
在弱市中,短線追漲往往容易被套,因為弱市里大部分股票的行情只有一天,當(dāng)天追得高了,第二天多半沒有獲利逃出的機會。相反,弱市中,中線追漲比較可取,能夠在弱市中保持強勢的股票不多,但這種強勢反而可以持續(xù)。但很多時候,弱市中這樣的股票反倒不敢追了。

有些人專門追漲停板,追新股開板,追次新股開板等,對于2015年上半年IPO的新股來說收獲頗豐,如暴風(fēng)科技,中超電纜等,其他的時候可能用這套追漲停策略就行不通了。

我自己操作并不會盲目追漲,安全第一,雖然還沒有吃過追漲的虧,但由于本人目前還不具備基本面的分析能力,也沒有消息的渠道,僅僅從技術(shù)指標(biāo)入手,投機性太重,很容易被莊家玩死的。道理很簡單,因為如果追漲了,下跌的空間自然就大了,尤其中線追漲,莊家獲利后隨時可能出貨。這時候就必須要做好殺跌的策略。莊股出貨跌個50%太普遍了,而且跌下去就很難再起來,這種時候不殺跌就等于自殺。所以,追漲之前一定要想清楚,務(wù)必先設(shè)好止損位,不能只憧憬獲利的美妙。

殺跌也有講究,不是一跌就殺,震蕩、洗盤是很常見的,問題在于正確地區(qū)別震倉與出貨是很難的,所以很多人是硬性止損,即預(yù)先設(shè)定價位或百分比,到這個位置就堅決出局,不管它是震倉還是莊家出貨。這個時候如果沒有基本面的判斷或第一手消息的來源,就容易被震蕩出局。當(dāng)然,和不確定的風(fēng)險相比,我其實更愿意早點出來。

2. 追漲殺跌的建型和實現(xiàn)
既然我們要進行追漲殺跌的操作,就要定義什么是追漲,什么又是殺跌,需要把追漲殺跌的概念量化出來,從而進行建模和實現(xiàn)。對于短線追漲策略可以簡單粗暴地選擇當(dāng)日漲幅超過5%的股票進行買入,第二日開盤賣出或到止損位賣出,并沒有太多的技術(shù)細(xì)節(jié),再計算一下勝率概率,就能知道我們要不要短線追漲。

下文我們將以中線追漲為例,進行建模和程序?qū)崿F(xiàn)。
那么對于中線追漲的情況,我們核心的策略思路就可以轉(zhuǎn)化為,當(dāng)股價(成交量)向上突破最近20日最高價格(量)時買入,當(dāng)股價向下突破最近10日最低價格賣出,并以滬深300成分股做為股票交易的標(biāo)的。其中,為什么是20日最高和10日最低都是經(jīng)驗值,可以做為模型參數(shù)進行訓(xùn)練和優(yōu)化。選擇滬深300成分股為標(biāo)的,是考慮到這些股票都是各個板塊的強勢股或龍頭股,要符合追漲殺跌的假設(shè)條件。
計算公式:
20日最高價 = max(T日股價,T-1日股價 ... , T-19日股價)
20日最高量 = max(T日成交量,T-1日成交量 ... , T-19日成交量)
10日最低價 = min(T日股價,T-1日股價 ... , T-9日股價)
當(dāng)股價大于等于20日最高價時作為買入信號點,當(dāng)股價小于等于10日最低價時作為賣出信號點。這樣我們就把追漲殺跌的投資理論,變成了一個數(shù)學(xué)模型。
接下來,我們利用R語言對股票數(shù)據(jù)的進行操作,來實現(xiàn)一個追漲殺跌模型的實例,從而驗證我的們投資理論,是否能發(fā)現(xiàn)賺錢的機會。

2.1 數(shù)據(jù)準(zhǔn)備
R語言本身提供了豐富的金融函數(shù)工具包,時間序列包zoo和xts,指標(biāo)計算包TTR,數(shù)據(jù)處理包plyr,可視包ggplot2等,我們會一起使用這些工具包來完成建模、計算和可視化的工作。
本文用到的數(shù)據(jù),包括A股日K線(向前復(fù)權(quán))數(shù)據(jù),從2014年7月到2015年日8月,以CSV格式保存到本地文件stock.csv。
數(shù)據(jù)格式如下:
000001.SZ,2014-07-02,8.14,8.18,8.10,8.17,28604171
000002.SZ,2014-07-02,8.09,8.13,8.05,8.12,40633122
000004.SZ,2014-07-02,13.9,13.99,13.82,13.95,1081139
000005.SZ,2014-07-02,2.27,2.29,2.26,2.28,4157537
000006.SZ,2014-07-02,4.57,4.57,4.50,4.55,5137384
000010.SZ,2014-07-02,6.6,6.82,6.5,6.73,9909143
一共7列:
第1列,股票代碼,code,000001.SZ
第2列,交易日期,date,2014-07-02
第3列,開盤價,Open,8.14
第4列,最高價,High,8.18
第5列,最低價,Low,8.10
第6列,收盤價,Close,8.17
第7列,交易量,Volume,28604171
通過R語言加載股票數(shù)據(jù),由于數(shù)據(jù)所有股票都是混合在一起的,而進行計算時又需要按每支票股計算,所以在數(shù)據(jù)加載時我就進行了轉(zhuǎn)換,按股票代碼進行分組,生成R語言的list對象,同時把每支股票的data.frame類型對象轉(zhuǎn)成XTS時間序列類型對象,方便后續(xù)的數(shù)據(jù)處理。
#加載工具包
> library(plyr)
> library(xts)
> library(TTR)
> library(ggplot2)
> library(scales)

# 讀取CSV數(shù)據(jù)文件
> read<-function(file){
+   df<-read.table(file=file,header=FALSE,sep = ",", na.strings = "NULL") # 讀文件
+   names(df)<-c("code","date","Open","High","Low","Close","Volume")      # 設(shè)置列名
+   dl<-split(df[-1],df$code)                                             # 按ccode分組
+   
+   lapply(dl,function(row){                                              # 換成xts類型數(shù)據(jù)
+     xts(row[-1],order.by = as.Date(row$date))
+   })
+ }

# 加載數(shù)據(jù)
> data<-read("stock.csv")

# 查看數(shù)據(jù)類型
> class(data)
[1] "list"

# 查看數(shù)據(jù)的索引
> head(names(data))
[1] "000001.SZ" "000002.SZ" "000004.SZ" "000005.SZ" "000006.SZ" "000007.SZ"

# 查看包括的股票數(shù)量
> length(data)
[1] 2782

# 獲得時間范圍
dateArea<-function(sDate=Sys.Date()-365,eDate= Sys.Date(),before=0){  #開始日期,結(jié)束日期,提單開始時
  if(class(sDate)=='character') sDate=as.Date(sDate)
  if(class(eDate)=='character') eDate=as.Date(eDate)  
  return(paste(sDate-before,eDate,sep="/"))
}

# 查看股票000001.SZ
> head(data[['000001.SZ']])
               Open     High      Low    Close   Volume
2014-07-02 8.146949 8.180000 8.105636 8.171737 28604171
2014-07-03 8.171737 8.254364 8.122162 8.229576 44690486
2014-07-04 8.237838 8.270889 8.146949 8.188263 34231126
2014-07-07 8.188263 8.204788 8.097374 8.146949 34306164
2014-07-08 8.130424 8.204788 8.072586 8.204788 34608702
2014-07-09 8.196525 8.196525 7.915596 7.973434 58789114
把數(shù)據(jù)準(zhǔn)備好了,我們就可以來建立模型了。

2.2 追漲殺跌模型
為了能拉近我們對市場的了解,我們?nèi)?015年1月1日開始的數(shù)據(jù),來創(chuàng)建追漲殺跌的模型。以樂視網(wǎng)(300104)的為例,畫出樂視網(wǎng)自2015年以來的每日收盤價,20日最高價和10日最低價。樂視網(wǎng)作為創(chuàng)業(yè)板標(biāo)桿的上市公司,在2015年7月首次被納入滬深300指數(shù)。
# 日K線數(shù)據(jù)
> title<-'300104.SZ'
> stock<-data[[title]]                                # 獲得股票數(shù)據(jù)
> sDate<-as.Date("2015-01-01")                        # 開始日期
> eDate<-as.Date("2015-08-24")                        # 結(jié)束日期
> cdata<-stock[dateArea(sDate,eDate,360)]$Close       # 獲得收盤價
> vdata<-stock[dateArea(sDate,eDate,360)]$Volume      # 獲得交易量

# 收盤價
> names(cdata)<-"Value"   # 重置列名
> tail(cdata)
           Value
2015-08-14 49.81
2015-08-17 48.30
2015-08-18 45.57
2015-08-19 46.98
2015-08-20 45.79
2015-08-21 42.14
 
# 交易量
> tail(vdata)
             Volume
2015-08-14 42108324
2015-08-17 35939096
2015-08-18 52745702
2015-08-19 43447844
2015-08-20 32916746
2015-08-21 34802494
定義畫圖函數(shù)drawLine(),支持畫出多條曲線,包括收盤價,最高價,最低價。
# 畫圖函數(shù)
> drawLine<-function(cdata,titie="Stock",sDate=min(index(cdata)),eDate=max(index(cdata)),breaks="1 year"){
+     if(sDate<min(index(cdata))) sDate=min(index(cdata))
+     if(eDate>max(index(cdata))) eDate=max(index(cdata))  
+     cdata<-na.omit(cdata)
+     
+     g<-ggplot(aes(x=Index, y=Value),data=fortify(cdata[,1],melt=TRUE))
+     g<-g+geom_line()
+     
+     if(ncol(cdata)>1){ # 多條線
+         g<-g+geom_line(aes(colour=Series),data=fortify(cdata[,-1],melt=TRUE))  
+     }
+     
+     g<-g+scale_x_date(labels=date_format("%Y-%m"),breaks=date_breaks(breaks),limits = c(sDate,eDate))
+     g<-g+ylim(min(cdata$Value), max(cdata$Value))
+     g<-g+xlab("") + ylab("Price")+ggtitle(title)
+     g
+ }

# 畫出收盤價
# drawLine(cdata,title,sDate,eDate,'1 month')    # 畫圖

# 計算最近20日的最高價和10日的最低價
> minmax<-function(data,max=20,min=10){
+   d1<-na.locf(data,fromLast=TRUE)
+   d2<-merge(d1,min=runMin(d1,min),max=runMax(d1,max))
+   return(d2[,-1])
+ }
 
# 畫出股價,最高價和最低價
> ldata<-cbind(cdata,minmax(cdata))
> drawLine(ldata,title,sDate,eDate,'1 month')    # 畫圖

上圖中有3條線,黑色線為樂視網(wǎng)的每日收盤價,藍(lán)色線為最近20日最高價,紅色線為最近10日最低價。
根據(jù)模型的計算公式,我們計算買入信號,當(dāng)股價向上突破最近20日最高價格時買入。
# 買入信號函數(shù)
> buyPoint<-function(ldata){   
+  idx<-which(ldata$Value == ldata$max)
+  return(ldata[idx,])                                  
+ }

# 計算買入的點
> buydata<-buyPoint(ldata)
> buydata
              Value      min      max
2015-01-08 17.43721 13.70164 17.43721
2015-01-09 17.98709 13.74254 17.98709
2015-01-12 19.53222 13.74254 19.53222
2015-01-15 20.21389 14.74232 20.21389
2015-01-16 22.23619 16.08749 22.23619
2015-01-19 23.04056 16.36016 23.04056
2015-01-20 23.89947 16.36016 23.89947
2015-01-26 24.77656 19.22774 24.77656
2015-01-27 25.16284 19.40043 25.16284
2015-02-05 26.91247 21.99533 26.91247
2015-02-10 28.68482 21.99533 28.68482
2015-02-11 31.55239 21.99533 31.55239
2015-02-12 31.87960 21.99533 31.87960
2015-02-13 35.06983 22.72245 35.06983
2015-02-16 38.57817 24.22213 38.57817
2015-02-17 40.99130 24.46753 40.99130
2015-03-16 41.07764 34.32453 41.07764
2015-03-18 41.94564 34.32453 41.94564
2015-03-24 45.34946 37.17393 45.34946
2015-04-23 46.27199 37.06031 46.27199
2015-04-24 50.89829 37.06031 50.89829
2015-04-27 50.90283 37.06031 50.90283
2015-04-28 55.44277 37.06031 55.44277
2015-04-29 60.98705 37.06031 60.98705
2015-05-06 62.25497 45.19495 62.25497
2015-05-07 66.20413 46.27199 66.20413
2015-05-08 67.23573 50.89829 67.23573
2015-05-11 73.96157 50.90283 73.96157
2015-05-12 81.36000 55.44277 81.36000
2015-05-13 82.49000 57.16514 82.49000
畫出買入的信號圖,讓我們可以直觀的看到效果。
# 畫圖函數(shù)
> drawPoint<-function(ldata,pdata,titie,sDate,eDate,breaks="1 year"){
+     ldata<-na.omit(ldata)
+     g<-ggplot(aes(x=Index, y=Value),data=fortify(ldata[,1],melt=TRUE))
+     g<-g+geom_line()
+     g<-g+geom_line(aes(colour=Series),data=fortify(ldata[,-1],melt=TRUE))
+     
+     if(is.data.frame(pdata)){
+         g<-g+geom_point(aes(x=Index,y=Value,colour=op),data=pdata,size=4)
+     }else{
+         g<-g+geom_point(aes(x=Index,y=Value,colour=Series),data=na.omit(fortify(pdata,melt=TRUE)),size=4)  
+     }
+     g<-g+scale_x_date(labels=date_format("%Y-%m"),breaks=date_breaks(breaks),limits = c(sDate,eDate))
+     g<-g+xlab("") + ylab("Price")+ggtitle(title)
+     g
+ }

> drawPoint(ldata,buydata$Value,title,sDate,eDate,'1 month')  # 畫圖

如上圖所示,藍(lán)色的點為股價大于等于最近20日最高價的點,作為買入信號。所有買入信號點,都是出現(xiàn)在單邊上行的牛勢中,對于2015年上半年以來的行情來說,追漲的信號會被大量觸發(fā)。

接下來,我們繼續(xù)計算賣出信號點,當(dāng)股價小于等于最近10日最低價時作為賣出信號點。
> # 計算賣出的信號點
> stopPoint<-function(ldata,buydata){  
+     idx<-which(ldata$Value == ldata$min)
+     idx<-idx[which(c(0,diff(idx))!=1)]   # 第一點用0表示
+     
+     selldata<-ldata[idx,]               # 所有低于最小值的點  
+     idx2<-sapply(index(buydata),function(e){  # 買后的賣點
+         head(which(index(selldata)>e),1)
+     })
+     
+     return(selldata[unique(idx2),])
+ }

# 賣出信號
> selldata<-stopPoint(ldata,buydata)
> selldata
              Value      min      max
2015-01-30 21.99533 21.99533 25.16284
2015-03-06 34.32453 34.32453 40.99130
2015-04-08 38.01011 38.01011 45.34946
2015-05-28 64.68000 64.68000 82.49000
一共有4筆賣出信號,為了讓數(shù)據(jù)更加直觀,我們合并買入信號和賣出信號,進行畫圖可視化。
# 買賣信號,畫圖
> bsdata<-merge(buydata$Value,selldata$Value)
> names(bsdata)<-c("buy","sell")
> drawPoint(ldata,bsdata,title,sDate,eDate,'1 month') #畫圖

上圖中,紫色點為賣出信號點,紅色點為買入信號點。我們可以很明顯的看出,如果根據(jù)交易信號在紅色點買入,紫色點賣出,我們是應(yīng)該賺錢的。那么具體賺了多少呢,我需要計算出來?
> # 合并交易信號
> signal<-function(buy, sell){
+     selldf<-data.frame(sell,op=as.character(rep("S",nrow(sell))))
+     buydf<-data.frame(buy,op=as.character(rep("B",nrow(buy))))
+     sdata<-rbind(buydf,selldf)                                       # 交易信號數(shù)據(jù)
+     sdata[order(as.Date(row.names(sdata))),]
+ }

# 合并交易信號
> sdata<-signal(buydata,selldata)                                   
> sdata
              Value      min      max op
2015-01-08 17.43721 13.70164 17.43721  B
2015-01-09 17.98709 13.74254 17.98709  B
2015-01-12 19.53222 13.74254 19.53222  B
2015-01-15 20.21389 14.74232 20.21389  B
省略····
接下來,我們利用交易信號數(shù)據(jù),進行模擬交易。我們設(shè)定交易參數(shù)和規(guī)則:
以10萬元人民幣為本金。
買入信號出現(xiàn)時,以收盤價買入,每次買入價值1萬元的股票。如果連續(xù)出現(xiàn)買入信號,則一直買入。若現(xiàn)金不足1萬元時,則跳過買入信號。
賣出信號出現(xiàn)時,以收盤價賣出,一次性平倉信號對應(yīng)的股票。
手續(xù)費為0元
下面我們進行模擬交易。
> # 模擬交易
> trade<-function(sdata,capital=100000,fixMoney=10000){ # 交易信號,總資金,每次定投資金
+     amount<-0
+     cash<-capital
+     
+     ticks<-data.frame()
+     for(i in 1:nrow(sdata)){
+         row<-sdata[i,]
+         if(row$op=='B'){
+             if(cash<fixMoney){
+                 print(paste(row.names(row),"No enough cash"))
+                 next
+             }
+             amount0<-floor(fixMoney/row$Value) # 本次交易量
+             amount<-amount+amount0
+             cash<-cash-amount0*row$Value
+         }
+         
+         if(row$op=='S'){
+             cash<-cash+amount*row$Value
+             amount<-0
+         }
+         
+         row$cash<-round(cash,2)
+         row$amount<-amount
+         row$asset<-round(cash+amount*row$Value,2)
+         ticks<-rbind(ticks,row)
+     }
+     
+     
+     ticks$diff<-c(0,round(diff(ticks$asset),2))
+     
+     rise<-ticks[intersect(which(ticks$diff>0),which(ticks$op=='S')),]   # 賺錢的交易
+     fall<-ticks[intersect(which(ticks$diff<0),which(ticks$op=='S')),]   # 賠錢的交易
+     
+     return(list(
+         ticks=ticks,
+         rise=rise,
+         fall=fall
+     ))
+ }

# 交易結(jié)果
> result<-trade(sdata,100000,10000)  
來看一下,每筆交易的明細(xì)。
> result$ticks
              Value      min      max op      cash amount    asset      diff
2015-01-08 17.43721 13.70164 17.43721  B  90008.48    573 100000.0      0.00
省略 ······
一共發(fā)生了34筆交易,其中30筆買入,4筆賣出。最后,資金剩余111495.9元,賺了11495元,收益率11.5%。

3. 模型優(yōu)化
我們看到在強勢格局的大牛市中,通過追漲能讓我們獲利頗豐。其實我們可以把模型再進一步優(yōu)化的,在構(gòu)建賣出信號時,是以最近10日最低價為賣出點來看,應(yīng)該還有更好的賣出點可以選擇。那么我們就要優(yōu)化一下模型,比如按下面的優(yōu)化條件。當(dāng)股價低于前一個買入點價格的時進行賣出,把小于等于最近10日最低價設(shè)為止損點。按照這樣的優(yōu)化策略,我們是不是可以有更大的收益呢?

這樣的優(yōu)化思路,會讓我們策略對波動更敏感,更容易被震蕩出局;當(dāng)然好外在于,可以更快的觸發(fā)止盈和止損條件,牛市中收益更大。
# 優(yōu)化條件,當(dāng)股價低于前一個買入點價格時進行賣出,小于10日最低價為止損點。
> # 計算賣出的信號點
> sellPoint<-function(ldata,buydata){
+     
+     arr<-c()
+     for(i in 1:nrow(buydata)){
+         
+         if(i>1){ # 跳轉(zhuǎn)第一個點
+             date<-index(buydata[i,])#;print(date)      
+             
+             # 價格 小于 上一次的買入的價格就賣出
+             last<-as.vector(buydata[i-1,]$Value) # 上一次買入的價格
+             lst<-ldata[paste(date,"/",sep="")]$Value      
+             idx<-head(which(lst < last),1)
+             
+             if(length(idx)>0){        
+                 arr<-rbind(arr,index(lst[idx]))
+             }
+         }
+     }
+     selldata<-ldata[as.Date(unique(arr)),]
+     
+     # 過濾多余的賣出點
+     bsdata<-merge(buydata$Value,selldata$Value)
+     names(bsdata)<-c("buy","Value")
+     idx1<-which(!is.na(bsdata$Value))
+     idx2<-idx1[which(c(0,diff(idx1))==1)]
+     bsdata$Value[idx2]<-NA
+     return(bsdata$Value[which(!is.na(bsdata$Value))])
+     
+ }

# 賣出信號
> selldata<-sellPoint(ldata,buydata)
> selldata
              Value
2015-01-21 22.81788
2015-01-28 23.60408
2015-02-25 36.89217
2015-03-17 39.97333
2015-03-19 40.96858
2015-03-26 39.25985
2015-05-14 74.24000
我們重新生成了,賣出的信號點有7個,比上次多出3個點,畫出交易信號的圖形。

合并買賣的交易信號。
> sdata<-signal(buydata$Value,selldata$Value)                                   # 合并交易信號
> sdata
              Value op
2015-01-08 17.43721  B
2015-01-09 17.98709  B
2015-01-12 19.53222  B
2015-01-15 20.21389  B
2015-01-16 22.23619  B
2015-01-19 23.04056  B
2015-01-20 23.89947  B
2015-01-21 22.81788  S

省略 ·····
一共發(fā)生了37筆交易,其中30筆買入,7筆賣出。最后,資金剩余137483.8元,賺了37483元,收益率37.5%。
我們把賣號信號和止損信號,合并畫到一張圖上。
# 止損信號
> stopdata<-stopPoint(ldata,buydata)

# 合并買賣信號,止損信號
> bsdata<-merge(buydata$Value,selldata$Value,stopdata$Value)
> names(bsdata)<-c("buy","sell","stop")
> drawPoint(ldata,bsdata,title,sDate,eDate,'1 month') #畫圖

圖中紅色點為買點,藍(lán)色點為優(yōu)化的賣點,紫色點為止損點。從圖中可以非常清楚的看到,藍(lán)色賣出點要優(yōu)于紫色的止損點。這樣就達(dá)到了,模型優(yōu)化的目的了。雖然只是一個很小的優(yōu)化,就可以給我們帶來不錯的收益。

接下來,通過況客平臺,我來夠建一個每日更新的交易列表,實現(xiàn)把靜態(tài)圖變成了動態(tài)圖。

追漲殺跌策略在牛市中會讓我們賺取非常大的利潤,那么對于2015年下半年行情,牛市已經(jīng)不復(fù)存在,震蕩市會一直持續(xù),那么我們可以使用均值回歸策略,發(fā)現(xiàn)逆市中的投資機會。

最后總結(jié),本文從 追漲殺跌 的思路開始,到市場特征檢驗,再到數(shù)學(xué)公式,R語言建模,再到歷史數(shù)據(jù)回測。通過R語言,很簡單地就實現(xiàn)了一個我們腦子中的投資想法。類似的投資想法其實誰都有,利用IT人的技術(shù)優(yōu)勢,可以真正地與實際操作結(jié)合起來。

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }