
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
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動決策的時代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計的實用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動決策的時代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點,而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報考到取證的全攻略? 在數(shù)字經(jīng)濟蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗:捕捉數(shù)據(jù)背后的時間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗:數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨特的門控機制,在 ...
2025-07-07統(tǒng)計學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動態(tài)、了解消費者需求的重要途徑,而統(tǒng)計學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03