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

熱線電話:13121318867

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

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

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

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

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

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

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

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

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

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

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

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

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

2.1 數(shù)據(jù)準(zhǔn)備
R語(yǔ)言本身提供了豐富的金融函數(shù)工具包,時(shí)間序列包zoo和xts,指標(biāo)計(jì)算包TTR,數(shù)據(jù)處理包plyr,可視包ggplot2等,我們會(huì)一起使用這些工具包來(lái)完成建模、計(jì)算和可視化的工作。
本文用到的數(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列,開(kāi)盤價(jià),Open,8.14
第4列,最高價(jià),High,8.18
第5列,最低價(jià),Low,8.10
第6列,收盤價(jià),Close,8.17
第7列,交易量,Volume,28604171
通過(guò)R語(yǔ)言加載股票數(shù)據(jù),由于數(shù)據(jù)所有股票都是混合在一起的,而進(jìn)行計(jì)算時(shí)又需要按每支票股計(jì)算,所以在數(shù)據(jù)加載時(shí)我就進(jìn)行了轉(zhuǎn)換,按股票代碼進(jìn)行分組,生成R語(yǔ)言的list對(duì)象,同時(shí)把每支股票的data.frame類型對(duì)象轉(zhuǎn)成XTS時(shí)間序列類型對(duì)象,方便后續(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

# 獲得時(shí)間范圍
dateArea<-function(sDate=Sys.Date()-365,eDate= Sys.Date(),before=0){  #開(kāi)始日期,結(jié)束日期,提單開(kāi)始時(shí)
  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)備好了,我們就可以來(lái)建立模型了。

2.2 追漲殺跌模型
為了能拉近我們對(duì)市場(chǎng)的了解,我們?nèi)?015年1月1日開(kāi)始的數(shù)據(jù),來(lái)創(chuàng)建追漲殺跌的模型。以樂(lè)視網(wǎng)(300104)的為例,畫出樂(lè)視網(wǎng)自2015年以來(lái)的每日收盤價(jià),20日最高價(jià)和10日最低價(jià)。樂(lè)視網(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")                        # 開(kāi)始日期
> eDate<-as.Date("2015-08-24")                        # 結(jié)束日期
> cdata<-stock[dateArea(sDate,eDate,360)]$Close       # 獲得收盤價(jià)
> vdata<-stock[dateArea(sDate,eDate,360)]$Volume      # 獲得交易量

# 收盤價(jià)
> 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(),支持畫出多條曲線,包括收盤價(jià),最高價(jià),最低價(jià)。
# 畫圖函數(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
+ }

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

# 計(jì)算最近20日的最高價(jià)和10日的最低價(jià)
> 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])
+ }
 
# 畫出股價(jià),最高價(jià)和最低價(jià)
> ldata<-cbind(cdata,minmax(cdata))
> drawLine(ldata,title,sDate,eDate,'1 month')    # 畫圖

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

# 計(jì)算買入的點(diǎn)
> 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
畫出買入的信號(hào)圖,讓我們可以直觀的看到效果。
# 畫圖函數(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)色的點(diǎn)為股價(jià)大于等于最近20日最高價(jià)的點(diǎn),作為買入信號(hào)。所有買入信號(hào)點(diǎn),都是出現(xiàn)在單邊上行的牛勢(shì)中,對(duì)于2015年上半年以來(lái)的行情來(lái)說(shuō),追漲的信號(hào)會(huì)被大量觸發(fā)。

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

# 賣出信號(hào)
> 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筆賣出信號(hào),為了讓數(shù)據(jù)更加直觀,我們合并買入信號(hào)和賣出信號(hào),進(jìn)行畫圖可視化。
# 買賣信號(hào),畫圖
> bsdata<-merge(buydata$Value,selldata$Value)
> names(bsdata)<-c("buy","sell")
> drawPoint(ldata,bsdata,title,sDate,eDate,'1 month') #畫圖

上圖中,紫色點(diǎn)為賣出信號(hào)點(diǎn),紅色點(diǎn)為買入信號(hào)點(diǎn)。我們可以很明顯的看出,如果根據(jù)交易信號(hào)在紅色點(diǎn)買入,紫色點(diǎn)賣出,我們是應(yīng)該賺錢的。那么具體賺了多少呢,我需要計(jì)算出來(lái)?
> # 合并交易信號(hào)
> 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)                                       # 交易信號(hào)數(shù)據(jù)
+     sdata[order(as.Date(row.names(sdata))),]
+ }

# 合并交易信號(hào)
> 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
省略····
接下來(lái),我們利用交易信號(hào)數(shù)據(jù),進(jìn)行模擬交易。我們?cè)O(shè)定交易參數(shù)和規(guī)則:
以10萬(wàn)元人民幣為本金。
買入信號(hào)出現(xiàn)時(shí),以收盤價(jià)買入,每次買入價(jià)值1萬(wàn)元的股票。如果連續(xù)出現(xiàn)買入信號(hào),則一直買入。若現(xiàn)金不足1萬(wàn)元時(shí),則跳過(guò)買入信號(hào)。
賣出信號(hào)出現(xiàn)時(shí),以收盤價(jià)賣出,一次性平倉(cāng)信號(hào)對(duì)應(yīng)的股票。
手續(xù)費(fèi)為0元
下面我們進(jìn)行模擬交易。
> # 模擬交易
> trade<-function(sdata,capital=100000,fixMoney=10000){ # 交易信號(hào),總資金,每次定投資金
+     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)  
來(lái)看一下,每筆交易的明細(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)化
我們看到在強(qiáng)勢(shì)格局的大牛市中,通過(guò)追漲能讓我們獲利頗豐。其實(shí)我們可以把模型再進(jìn)一步優(yōu)化的,在構(gòu)建賣出信號(hào)時(shí),是以最近10日最低價(jià)為賣出點(diǎn)來(lái)看,應(yīng)該還有更好的賣出點(diǎn)可以選擇。那么我們就要優(yōu)化一下模型,比如按下面的優(yōu)化條件。當(dāng)股價(jià)低于前一個(gè)買入點(diǎn)價(jià)格的時(shí)進(jìn)行賣出,把小于等于最近10日最低價(jià)設(shè)為止損點(diǎn)。按照這樣的優(yōu)化策略,我們是不是可以有更大的收益呢?

這樣的優(yōu)化思路,會(huì)讓我們策略對(duì)波動(dòng)更敏感,更容易被震蕩出局;當(dāng)然好外在于,可以更快的觸發(fā)止盈和止損條件,牛市中收益更大。
# 優(yōu)化條件,當(dāng)股價(jià)低于前一個(gè)買入點(diǎn)價(jià)格時(shí)進(jìn)行賣出,小于10日最低價(jià)為止損點(diǎn)。
> # 計(jì)算賣出的信號(hào)點(diǎn)
> sellPoint<-function(ldata,buydata){
+     
+     arr<-c()
+     for(i in 1:nrow(buydata)){
+         
+         if(i>1){ # 跳轉(zhuǎn)第一個(gè)點(diǎn)
+             date<-index(buydata[i,])#;print(date)      
+             
+             # 價(jià)格 小于 上一次的買入的價(jià)格就賣出
+             last<-as.vector(buydata[i-1,]$Value) # 上一次買入的價(jià)格
+             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)),]
+     
+     # 過(guò)濾多余的賣出點(diǎn)
+     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))])
+     
+ }

# 賣出信號(hào)
> 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
我們重新生成了,賣出的信號(hào)點(diǎn)有7個(gè),比上次多出3個(gè)點(diǎn),畫出交易信號(hào)的圖形。

合并買賣的交易信號(hào)。
> sdata<-signal(buydata$Value,selldata$Value)                                   # 合并交易信號(hào)
> 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%。
我們把賣號(hào)信號(hào)和止損信號(hào),合并畫到一張圖上。
# 止損信號(hào)
> stopdata<-stopPoint(ldata,buydata)

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

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

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

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

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

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

若不方便掃碼,搜微信號(hào):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(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".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 = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+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); }