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

熱線電話:13121318867

登錄
首頁精彩閱讀用R檢驗(yàn)配對股票的協(xié)整性
用R檢驗(yàn)配對股票的協(xié)整性
2018-03-11
收藏

用R檢驗(yàn)配對股票的協(xié)整性

基于統(tǒng)計(jì)套利的配對交易策略是一種市場中性策略。具體地說,是指從市場上找出歷史股價(jià)走勢相近的股票進(jìn)行配對,當(dāng)配對股票價(jià)格差(Spread)偏離歷史均值時(shí),則做空股價(jià)偏高的股票,同時(shí)做多股價(jià)偏低的股票,等待它們回歸到長期均衡關(guān)系,由此賺取兩股票價(jià)格收斂的報(bào)酬。

 


進(jìn)行配對交易,第一步也是最關(guān)鍵的一步是尋找符合配對條件的股票,即兩支歷史價(jià)格走勢相近,具有長期穩(wěn)定關(guān)系的股票。本文解釋如何用R來實(shí)現(xiàn)協(xié)整檢驗(yàn)。

假設(shè)你有兩支股票,如TKR_Y和TKR_X,各自5分鐘行情的歷史數(shù)據(jù),你想要知道它們是否存在協(xié)整關(guān)系;再假設(shè)這些數(shù)據(jù)是從PostgreSQL數(shù)據(jù)庫(pairs_trading_test)中提取,數(shù)據(jù)表(tbl_quote)的結(jié)構(gòu)為:

 

id #id

market #市場,如SH,SZ

symbol #代碼,如600036

qdatetime #時(shí)間戳,YYYY-MM-DD HH:MM:SS

open #開盤價(jià)

high #最高價(jià)

low #最低價(jià)

close #收盤價(jià)

adj_close #調(diào)整后收盤價(jià),指除權(quán)息后經(jīng)調(diào)整的收盤價(jià)

 

數(shù)據(jù)表示

在R中,當(dāng)然可以用向量(vector)或數(shù)據(jù)框(data frame)來表示你的時(shí)間序列數(shù)據(jù),但其過程肯定乏味低效。強(qiáng)烈建議使用zoo包或xts包來進(jìn)行時(shí)間序列分析,xts是zoo包的一個(gè)超集,包含極高的運(yùn)算效率和其它一些方便實(shí)用的特點(diǎn)。此處,我們用zoo對象來表達(dá)時(shí)間序列數(shù)據(jù)。

一旦把數(shù)據(jù)加載到zoo對象,比如t,那么它的行為與數(shù)據(jù)框類似。一個(gè)zoo對象可以包含若干列,每一列是一個(gè)時(shí)間序列,每一行則是這些時(shí)間序列在同一時(shí)刻的觀測值。對象也提供了另外一些附加屬性,如:index(t)是一個(gè)日期向量,每次觀察一個(gè)日期;第一個(gè)和最后一個(gè)日期可以分別用start(t)和end(t)獲得。

加載數(shù)據(jù)

從數(shù)據(jù)庫中讀取并加載數(shù)據(jù)只需完成以下簡單步驟:


library(zoo)

library(RpgSQL)

r_conn<-dbConnect(pgSQL(), user="postgres", password="postgres",

dbname="pairs_trading_test", host="localhost")


q<-paste("select qdatetime, log(close) from tbl_quote where market like '", X_market, "' and symbol like '", X_symbol, "'", sep="")

quote_x <- dbGetQuery(r_conn, q)


q<-paste("select qdatetime, log(close) from tbl_quote where market like '", Y_market, "' and symbol like '", Y_symbol, "'", sep="")

quote_y <- dbGetQuery(r_conn, q)


#用zoo函數(shù)來構(gòu)造zoo對象,該函數(shù)有兩個(gè)參數(shù),一個(gè)數(shù)據(jù)向量,一個(gè)日期向量

quote_x <- zoo(quote_x$close, quote_x$qdatetime)

quote_y <- zoo(quote_y$close, quote_y$qdatetime)


# merge函數(shù)合并兩個(gè)zoo對象,同時(shí)計(jì)算它們的交集(all=FALSE)或并集(all=TRUE)

t.zoo <- merge(quote_x, quote_y, all=FALSE)


#此時(shí),t.zoo是一個(gè)包含兩列:quote_x和quote_y的zoo對象。由于R中許多統(tǒng)計(jì)函數(shù)需要數(shù)據(jù)框作為輸入項(xiàng)。在此,我們創(chuàng)建一個(gè)數(shù)據(jù)框?qū)ο?

t <- as.data.frame(t.zoo)


#打印輸出日期范圍

cat("日期范圍是:", format(start(t.zoo)), "至", format(end(t.zoo)), "\n")

#----------------------------------------------------------------------------------------------------------------

# X_market, X_symbol, Y_market, Y_symbol分別為股票TKR_X、TKR_Y的市場和代碼

# log(close)表示取收盤價(jià)自然對數(shù)。取價(jià)格的對數(shù)序列是協(xié)整檢驗(yàn)的常用做法,目的是消除數(shù)據(jù)中可能存在的異方差。


#----------------------------------------------------------------------------------------------------------------


構(gòu)造價(jià)差序列

在Matlab、Eviews等軟件中,一般是先檢驗(yàn)協(xié)整關(guān)系,然后再構(gòu)造價(jià)差序列。在R中,我們可以以另外一種方式完成同樣的任務(wù):先構(gòu)造價(jià)差序列,然后對該序列進(jìn)行單位根檢驗(yàn)。如果價(jià)差序列有一個(gè)根位于單位圓內(nèi),則相應(yīng)的股票就是協(xié)整的。

價(jià)差序列定義如下:

S = y - (β × x)

此處,β是對沖系數(shù),用最小二乘法計(jì)算而得。移項(xiàng),我們要知道的不過就是最適合以下方程的β:

y =(-β)× x

這是一個(gè)簡單且沒有y截距的線性方程。在R中,lm函數(shù)可以用來擬合這樣的線性模型。


# lm函數(shù)用OLS構(gòu)造線性回歸模型。我們先構(gòu)造一個(gè)截距為零的線性模型,然后提取模型的第2個(gè)回歸系數(shù)。

m <- lm(quote_y ~ quote_x + 0, data = t)

beta <- coef(m)[1]


#現(xiàn)在,計(jì)算價(jià)差序列

sprd <- t$quote_y - beta * t$quote_x


傳遞給lm的第一個(gè)參數(shù)是一個(gè)指定線性模型的公式,公式quote_y ~ quote_x + 0表示模型如下:

quote_yi= β × quote_xi+ εi

(如果公式中省略掉"+ 0", 則R也會擬合一個(gè)y截距)

檢驗(yàn)協(xié)整關(guān)系

ADF是單位根檢驗(yàn)的一種基本方法,許多R包都提供該方法。這里,我們用tseries包中的adf.test函數(shù)。該函數(shù)返回一個(gè)包含測試結(jié)果,尤其是我們所需的P值,的對象。

library(tseries)

ht <- adf.test(sprd, alternative="stationary", k=0)


設(shè)置alternative="stationary"非常重要:

對統(tǒng)計(jì)學(xué)者而言,它指定了一個(gè)價(jià)差序列非平穩(wěn)或發(fā)散的零假設(shè)

對其他人而言,它意味著如果P值很小,則價(jià)差是均值回復(fù)的。至于何為“小”,取決與你有多嚴(yán)格,一般是小于0.1或0.05(越小越好)

至此,協(xié)整檢驗(yàn)就Ok了。我們可以將ADF檢驗(yàn)結(jié)果解釋如下:

#ht對象中包含ADF檢驗(yàn)中得到的P值。p值是價(jià)差序列非均值回復(fù)的概率,因此,越小的P值意味序列非均值回復(fù)的概率越小。

if (ht$p.value < 0.05) {
   cat("價(jià)差可能均值回復(fù).\n")
} else {
   cat("價(jià)差不滿足均值回復(fù).\n")
}

數(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(), // 加隨機(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)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗(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ù)說明請參見: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 = '請輸入'+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); }