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

熱線電話:13121318867

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

R語言構(gòu)建配對交易量化模型

散戶每天都在經(jīng)歷中國股市的上躥下跳,賺到錢是運氣,賠錢是常態(tài)。那么是否有方法可以讓賺錢變成常態(tài)呢?

我們可以通過“統(tǒng)計套利”的方法,發(fā)現(xiàn)市場的無效性。配對交易,就統(tǒng)計套利策略的一種,通過對沖掉絕大部分的市場風(fēng)險,抓住套利機(jī)會,積累小盈利匯聚大收益。

1. 什么是配對交易?
配對交易(Pairs Trading)的理念最早來源于上世紀(jì)20年代華爾街傳奇交易員Jesse Livermore 的姐妹股票對交易策略。配對交易的基本原理是找到兩個相關(guān)性較高具備均衡關(guān)系的股票或其他金融產(chǎn)品,做空近期相對強勢的金融產(chǎn)品,同時做多相對弱勢金融產(chǎn)品,等待兩者價格重返均衡值時進(jìn)行平倉,賺取兩者的價差變動的收益。

假設(shè)兩個金融產(chǎn)品在未來的時期會保持良好的均衡關(guān)系,一旦兩者之間的價格走勢出現(xiàn)背離,同時這種背離在未來會被進(jìn)行修復(fù),那么就可能產(chǎn)生套利的機(jī)會。對于配對交易來說,就是找到這樣的機(jī)會,進(jìn)行統(tǒng)計套利。
配對交易的特點

配對交易與傳統(tǒng)股票交易最大的不同之處在于,它的投資標(biāo)的是兩只股票的價差,是一種相對價值而非絕對價值。由于它在股票多頭和空頭方同時建倉,對沖掉了絕大部分的市場風(fēng)險,所以它是一種市場的中性策略。無論大盤上漲還是下跌,配對交易策略收益都是相對平穩(wěn)的,與大盤走勢的相關(guān)性很低。

在市場無趨勢性機(jī)會時,可以通過配對交易避免股市系統(tǒng)風(fēng)險,獲取Alpha絕對收益。趨勢性的交易策略,可以參考文章 兩條均線打天下。
配對交易操作方法
組合篩選:在市場上尋找用于配對的金融產(chǎn)品或者組合,檢查歷史價格的走勢,判斷是否可以用來進(jìn)行配對。主要用下面幾個指標(biāo)來篩選配對組合:相關(guān)系數(shù)、模型計算的均值回復(fù)速度、協(xié)整檢驗、基本面因素等。通過這些因素來尋找出具有穩(wěn)定相關(guān)關(guān)系的組合。
風(fēng)險衡量和動態(tài)組合的構(gòu)建:計算配對組合各自的預(yù)期收益、預(yù)期風(fēng)險、交易成本;判斷兩個組合之間的價差服從何種分布;判斷是具有長期均衡特性還是短期均衡特性;價差發(fā)生跳躍的頻率等。
確定交易規(guī)則:根據(jù)價差的特性,確定交易的頻率(高頻交易還是低頻交易),交易的觸發(fā)條件和平倉規(guī)則等。
執(zhí)行交易及風(fēng)險控制:除了按照交易規(guī)則執(zhí)行外,還必須動態(tài)跟蹤價差走勢,如果發(fā)現(xiàn)突變,應(yīng)該及時調(diào)整套利模式和交易頻率。
配對交易缺點
統(tǒng)計套利的規(guī)則都是基于歷史數(shù)據(jù)計算的,但歷史不能代表未來,當(dāng)市場發(fā)生變化模型也會失效
市場對價格進(jìn)行修復(fù)的時間難以準(zhǔn)確判斷,只能根據(jù)歷史大致估計。如果回歸的時間過長,對套利者的資金使用成本是個考驗,也有可能導(dǎo)致套利失敗。
2. 構(gòu)建配對交易的模型
根據(jù)配對交易的原理,我們就可以自己設(shè)計配對交易的模型了。首先,需要把配對交易涉及的指標(biāo)都進(jìn)行量化,比如如何選擇不同的兩個具備均衡關(guān)系金融產(chǎn)品,什么時候做多,什么時候做空,什么時候平倉等。
根據(jù)概念,我們生成兩個虛擬的金融產(chǎn)品X,Y,包括時間和價格字段。讓X和Y的兩個產(chǎn)品都價格符合正態(tài)分布,生成100個日期的數(shù)據(jù)。由于是測試程序,日期字段是包括了自然日,暫時理解為連續(xù)的日期。
R語言實現(xiàn)的代碼如下:

> set.seed(1)                         #設(shè)置隨機(jī)種子
> dates<-as.Date('2010-01-01')+1:100  #100個日期
> x<-round(rnorm(100,50,40),2)        #隨機(jī)生成X產(chǎn)品,100個正態(tài)分析的收盤價
> y<-round(rnorm(100,50,40),2)        #隨機(jī)生成Y產(chǎn)品,100個正態(tài)分析的收盤價
> df<-data.frame(dates,x,y)
> df
         dates      x      y
1   2010-01-02  24.94  25.19
2   2010-01-03  57.35  51.68
3   2010-01-04  16.57  13.56
4   2010-01-05 113.81  56.32
#  省略 ····
把數(shù)據(jù)進(jìn)行可視化,可以更直觀地理解數(shù)據(jù)本身。
# 加載R語言類庫
> library(ggplot2)
> library(scales)
> library(reshape2)

# 數(shù)據(jù)轉(zhuǎn)型
> df2<-melt(df,c('dates'))

# 畫圖
> g<-ggplot(data=df2,aes(x=dates,y=value,colour=variable))
> g<-g+geom_line()
> g<-g+scale_x_date(date_breaks = "1 week",date_labels='%m-%d')
> g<-g+labs(x='date',y='Price')
> g

上圖中,X軸為時間,Y軸是價格,紅色線為X的產(chǎn)品的價格,藍(lán)色線為Y產(chǎn)品的價格。我們可以直觀的看出,X,Y兩個產(chǎn)品無任何關(guān)系。
根據(jù)配對交易的假設(shè)條件,如果兩個金融產(chǎn)品的價差是收斂的。我們用X的產(chǎn)品價格減去Y產(chǎn)品的價格,當(dāng)差值為正的時候,我們認(rèn)為X的價格過高,則做空X,同時Y的價格過低,則做多Y;當(dāng)差值為負(fù)的時候,我們認(rèn)為X的價格過低,則做多X,同時Y的價格過高,則做空Y;當(dāng)差值為0時,則價格被市場所修復(fù),則全部平倉。
為了讓差異更明顯,我們定義的計算公式如下。
價差Z = X價格-Y價格
Z >  10時,做空X,做多Y ;Z<0時,平倉
Z < -10時,做多X,做空Y ;Z>0時,平倉
計算差價,然后計算交易統(tǒng)計。
# 計算差價
> df$diff<-df$x-df$y

# 找到差價大于10時的點
> idx<-which(df$diff>10)
> idx<-idx[-which(diff(idx)==1)-1]

# 打印差價的索引
> idx
 [1]  4 11 15 23 25 30 34 36 38 43 48 53 55 59 61 68 76 81 83 86 88 92 95 98
接下來,我們進(jìn)行模擬交易,取第一個索引值的點,在2010-01-04時做空X,做多Y。當(dāng)差價小于0在2010-01-06時,進(jìn)行平倉。
# 打印前20個數(shù)據(jù)
> head(df,20)
        dates      x      y    diff
1  2010-01-02  24.94  25.19   -0.25
2  2010-01-03  57.35  51.68    5.67
3  2010-01-04  16.57  13.56    3.01
4  2010-01-05 113.81  56.32   57.49
5  2010-01-06  63.18  23.82   39.36
6  2010-01-07  17.18 120.69 -103.51
7  2010-01-08  69.50  78.67   -9.17
8  2010-01-09  79.53  86.41   -6.88
9  2010-01-10  73.03  65.37    7.66
10 2010-01-11  37.78 117.29  -79.51
11 2010-01-12 110.47  24.57   85.90
12 2010-01-13  65.59  31.53   34.06
13 2010-01-14  25.15 107.29  -82.14
14 2010-01-15 -38.59  23.97  -62.56
15 2010-01-16  95.00  41.70   53.30
16 2010-01-17  48.20  34.29   13.91
17 2010-01-18  49.35  37.20   12.15
18 2010-01-19  87.75  38.84   48.91
19 2010-01-20  82.85  69.77   13.08
20 2010-01-21  73.76  42.91   30.85

# 當(dāng)差價大于10時,做空X,當(dāng)差價小于0時,平倉。
# 第4行做空,第6行平倉
> xprofit<- df$x[4]-df$x[6];xprofit
[1] 96.63

# 當(dāng)差價大于10時,做多Y;當(dāng)差價小于0時,平倉。
# 第4行做空,第6行平倉
> yprofit<- df$y[6]-df$y[4];yprofit
[1] 64.37
從交易結(jié)果來看,我們第一筆配對交易就是賺錢的。

這是為什么呢?
根據(jù)配對交易的假設(shè)條件,如果兩個金融產(chǎn)品的價差是收斂的,通過協(xié)整性檢驗的方法,我們可驗證數(shù)據(jù)的收斂性。那么如果數(shù)據(jù)是收斂的,他還會具備均值回歸的特性,請參考文章 均值回歸,逆市中的投資機(jī)會。
畫出X,Y的價差圖,我們可以明顯的看出,價差一直圍繞著0上下波動,這是明顯收斂的,同時符合均值回歸的特性。

> plot(df$diff,type='l')

這就是市場的規(guī)則,通過配對交易的方法,我們找到市場無效性,從而可以賺去套利的收益。

3. 用R語言實現(xiàn)配對交易
看到上面的賺錢方法,也許大家會很興奮!但是大部分市場的數(shù)據(jù),都不會像我們的假設(shè)條件一樣,輕而易舉就能實現(xiàn)賺錢的目標(biāo)。我們可以用計算機(jī)程序進(jìn)行全市場的掃描發(fā)現(xiàn)交易機(jī)會,當(dāng)然你也可以通過肉眼的方式來觀察。
市場上有一些天生就具備均衡關(guān)系的金融產(chǎn)品,可以作為我們套利的入手對象。
股票類,同行業(yè)、市值和基本面相似的個股,比如,中國銀行(601988)和農(nóng)業(yè)銀行(601288)。
基金類,以相同指數(shù)作為標(biāo)的的不同基金,比如,證券B(150172),券商B(150201)。
期貨類,同一期貨品種的不同合約,比如,銅(cu1605, cu1606)。
混合類,跨市場為標(biāo)的的金融產(chǎn)品,比如,滬深300指數(shù),IF的期貨合約
接下來,以相同品種不同合約的期貨為例,我們把配對交易用在cu1605和cu1606的兩個合約上,試試效果如何。由于期貨是支持的T+0日內(nèi)的交易的,而對于套利的操作,通常都不會持倉過夜,所以我們在盡量的短周期上進(jìn)行操作,而且日內(nèi)平倉。下面我將以1分鐘做為交易周期。

3.1 數(shù)據(jù)準(zhǔn)備
R語言本身提供了豐富的金融函數(shù)工具包,時間序列包zoo和xts,指標(biāo)計算包TTR,可視包ggplot2等,我們會一起使用這些工具包來完成建模、計算和可視化的工作。關(guān)于zoo包和xts包的詳細(xì)使用可以參考文章,R語言時間序列基礎(chǔ)庫zoo,可擴(kuò)展的時間序列xts。

本文用到的數(shù)據(jù),是銅的1分鐘線的數(shù)據(jù),從2016年日2月1日到2016年日2月29日,日盤的交易數(shù)據(jù),以CSV格式保存到本地文件cu1605.csv,cu1606.csv。商品期貨的日盤交易時間分為3段:09:00:00-10:14:59,10:30:00-11:29:59,13:30:00-14:59:59。當(dāng)前測試,不考慮夜盤的數(shù)據(jù)。
數(shù)據(jù)格式如下:
2016-02-01 09:00:00,35870,35900,35860,35880
2016-02-01 09:01:00,35890,35890,35860,35870
2016-02-01 09:02:00,35870,35870,35860,35870
2016-02-01 09:03:00,35870,35900,35870,35900
2016-02-01 09:04:00,35900,35900,35870,35870
2016-02-01 09:05:00,35870,35880,35860,35870
2016-02-01 09:06:00,35880,35880,35860,35870
一共5列:
第1列,交易時間,date,2016-02-01 09:00:00
第2列,開盤價,Open,35870
第3列,最高價,High,35900
第4列,最低價,Low,35860
第5列,收盤價,Close,35880
通過R語言加載銅的1分鐘線數(shù)據(jù),因為我們進(jìn)行日內(nèi)交易,所以在加載時我就進(jìn)行了轉(zhuǎn)換,按日期進(jìn)行分組,生成R語言的list對象,同時把每日的data.frame類型對象轉(zhuǎn)成XTS時間序列類型對象,方便后續(xù)的數(shù)據(jù)處理。
#加載工具包
> library(xts)
> library(TTR)

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

# 加載數(shù)據(jù)
> cu1605<-read(file='cu1605.csv')
> cu1606<-read(file='cu1606.csv')

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

# 查看數(shù)據(jù)的日期索引
> names(cu1605)
 [1] "2016-02-01" "2016-02-02" "2016-02-03" "2016-02-04" "2016-02-05"
 [6] "2016-02-15" "2016-02-16" "2016-02-17" "2016-02-18" "2016-02-19"
[11] "2016-02-22" "2016-02-23" "2016-02-24" "2016-02-25" "2016-02-26"
[16] "2016-02-29"

# 查看每日的數(shù)據(jù)量
> nrow(cu1605[[1]])
[1] 223

# 查看cu1605合約的數(shù)據(jù)
> head(cu1605[['2016-02-01']])
                     Open  High   Low Close
2016-02-01 09:00:00 35870 35900 35860 35880
2016-02-01 09:01:00 35890 35890 35860 35870
2016-02-01 09:02:00 35870 35870 35860 35870
2016-02-01 09:03:00 35870 35900 35870 35900
2016-02-01 09:04:00 35900 35900 35870 35870
2016-02-01 09:05:00 35870 35880 35860 35870
把數(shù)據(jù)準(zhǔn)備好了,我們就可以來建立模型了。

3.2 配對交易模型
以2016年02月01日為例進(jìn)行交易,以1分鐘線的close價格來計算cu1605和cu1606的兩個合約的價差。下面我們對數(shù)據(jù)進(jìn)行操作,合并2個合約在2016年02月01日的數(shù)據(jù),并對空值進(jìn)行處理,最后計算出兩個合約的價差。
# 合并數(shù)據(jù)
> xdf<-merge(cu1605[['2016-02-01']]$Close,cu1606[['2016-02-01']]$Close)
> names(xdf)<-c('x1','x2')

# 用前值替換空值
> xdf<-na.locf(xdf)

# 計算價差
> xdf$diff<-xdf$x1-xdf$x2

# 打印前20行數(shù)據(jù)
> head(xdf,20)
                     x1     x2     diff
2016-02-01 09:00:00  35880  35900  -20
2016-02-01 09:01:00  35870  35920  -50
2016-02-01 09:02:00  35870  35910  -40
2016-02-01 09:03:00  35900  35940  -40
2016-02-01 09:04:00  35870  35910  -40
2016-02-01 09:05:00  35870  35920  -50
2016-02-01 09:06:00  35870  35910  -40
2016-02-01 09:07:00  35860  35910  -50
數(shù)據(jù)解釋:
x1列,為第一腿對應(yīng)cu1605合約
x2列,為第二腿對應(yīng)cu1606合約。
diff列,為cu1605-cu1606
從價差的結(jié)果看,每1分鐘cu1605合約都小于cu1606合約,從-110到-20價差不等,并且以-63為均值上下反復(fù)震蕩。
# 計算價差范圍
> range(xdf$diff)
[1] -110  -20

# 計算價差均值
> mean(xdf$diff)
[1] -63.90135

# 畫出價差分布柱狀圖
> hist(xdf$diff,10)
畫出價差分布柱狀圖

我們假設(shè)以-63為均值回歸點,當(dāng)差值為大于-45的時候,認(rèn)為X的價格過高做空X,同時Y的價格過低做多Y;當(dāng)差值小于-75的時候,我們認(rèn)為X的價格過低做多X,同時Y的價格過高做空Y;當(dāng)差值為-63時,價格被市場所修復(fù),則全部平倉。以cu1605和cu1606的兩個合約按照1:1持倉進(jìn)行配比,1手多單對1手空單。
定義模型指標(biāo),計算價值列為diff,均值回歸列為mid,最大閾值列為top,最小閾值列為bottom。
target.pair<-function(xdf){
  xdf$diff<-xdf$x1-xdf$x2   #差值
  xdf$mid<- -63             #均值回歸點
  xdf$top<- -45             #最大閾值
  xdf$bottom<- -75          #最小閾值
  return(xdf)
}
完成指標(biāo)的定義后,我們創(chuàng)建配對交易模型,并對合同數(shù)據(jù)進(jìn)行回測,產(chǎn)生交易信號后,模擬交易輸出清單,并可視化交易結(jié)果。
回測過程代碼省略,產(chǎn)生的交易信號如下所示。
                  date    x1    x2 diff mid top bottom op
21 2016-02-01 09:00:00 35880 35900  -20 -63 -45    -75 ks
1  2016-02-01 09:25:00 35740 35810  -70 -63 -45    -75 pb
22 2016-02-01 09:40:00 35690 35730  -40 -63 -45    -75 ks
2  2016-02-01 09:47:00 35700 35770  -70 -63 -45    -75 pb
13 2016-02-01 10:00:00 35690 35770  -80 -63 -45    -75 kb
5  2016-02-01 10:01:00 35710 35760  -50 -63 -45    -75 ps
23 2016-02-01 10:02:00 35710 35750  -40 -63 -45    -75 ks
3  2016-02-01 10:07:00 35680 35750  -70 -63 -45    -75 pb
數(shù)據(jù)解釋:
date列,為交易時間
x1列,為第一腿對應(yīng)cu1605合約
x2列,為第二腿對應(yīng)cu1606合約。
diff列,為cu1605-cu1606
mid列,為均值回歸點
top列,為最大閾值
bottom列,為最小閾值
op列,為交易信號
交易信號一共有4種。
ks, 開倉, 做空(賣),對應(yīng)反向操作為pb。
kb, 開倉, 做多(買),對應(yīng)反向操作為ps。
ps, 平倉, 做空(賣),對應(yīng)反向操作為kb。
pb,平倉, 做多(買),對應(yīng)反向操作為ks。
一共出現(xiàn)了24個交易信號,由于我們進(jìn)行的是配對交易,所以當(dāng)出現(xiàn)ks(開倉做空)信號時,實際上會進(jìn)行2筆操作,開倉做空第一腿,開倉做多第二腿。
接下來,進(jìn)行模擬交易,計算出交易清單。
$x1
                       code op price pos    fee  value  margin balance     cash
2016-02-01 09:00:00  cu1605 ks 35880   1 8.9700 179400 26910.0      NA 173081.0
2016-02-01 09:25:00  cu1605 pb 35740   0 8.9350      0     0.0     700 173748.1
2016-02-01 09:40:00  cu1605 ks 35690   1 8.9225 178450 26767.5      NA 173437.7
2016-02-01 09:47:00  cu1605 pb 35700   0 8.9250      0     0.0     -50 173339.9
2016-02-01 10:00:00  cu1605 kb 35690   1 8.9225 178450 26767.5      NA 173552.0
2016-02-01 10:01:00  cu1605 ps 35710   0 8.9275      0     0.0     100 173574.2
數(shù)據(jù)解釋:
$x1部分,為第一腿的交易清單。
$x2部分,為第二腿的交易清單。
code,合約代碼
op,交易信號
price,成交價格
pos,成交數(shù)量
fee,手續(xù)費
value,對應(yīng)價值
margin,保證金
balance,平倉盈虧
cash,賬號資金
我通過交易清單,統(tǒng)計交易結(jié)果。
> page  
$day     # 交易日期
[1] "2016-02-01"

$capital   # 初始資金
[1] 2e+05

$cash      # 賬戶余額
[1] 201221.4

$num       # 交易信號數(shù)
[1] 24

$record    # 配對交易平倉盈虧
                      x1   x2 balance
2016-02-01 09:25:00  700 -450     250
2016-02-01 09:47:00  -50  200     150
2016-02-01 10:01:00  100   50     150
2016-02-01 10:07:00  150    0     150
2016-02-01 10:42:00  100   50     150
2016-02-01 11:21:00   50  150     200
2016-02-01 11:23:00  100   50     150
2016-02-01 13:36:00 -150  250     100
2016-02-01 13:46:00   50   50     100
2016-02-01 13:53:00    0  100     100
2016-02-01 14:49:00 -200  300     100
2016-02-01 14:58:00    0   50      50

$balance   # 匯總平倉盈虧,第一腿盈虧,第二腿盈虧
[1] 1650  850  800

$fee       # 匯總手費費,第一腿手續(xù)費,第二腿手續(xù)費
[1] 429 214 215

$profit    # 賬戶凈收益,收益率(占保證金)
[1] 1221.000    0.023

$wins      # 勝率,勝數(shù),敗數(shù)
[1]  1 12  0
最后,通過可視化輸出交易信號。

圖例解釋
棕色線,為價差diff
紫色線,為最大閾值top
紅色線,為最小閾值bottom
藍(lán)色線,為均值線mid,平行于top和bottom
淺藍(lán)線,為ks開倉做空的交易
綠色線,為kb開倉做多的交易
從圖中看就更直觀了,我們進(jìn)行了12次交易,每次4筆,勝率100%。
最后,我們對2月份整個的數(shù)據(jù)進(jìn)行回測?;販y結(jié)果如下。

         date profit    ret balance fee winRate win fail maxProfit maxLoss avgProfit avgLoss
1  2016-02-01   1221  0.023    1650 429    1.00  12    0       250      50       138     NaN
2  2016-02-02   1077  0.020    1650 573    1.00  15    0       150       0       110     NaN
3  2016-02-03     64  0.001     100  36    1.00   1    0       100     100       100     NaN
4  2016-02-04    113  0.002     150  37    1.00   1    0       150     150       150     NaN
5  2016-02-05    926  0.017    1400 474    1.00  13    0       150     100       108     NaN
數(shù)據(jù)解釋:
date,交易日期
profit,凈收益
ret,每日收益率
balance,平倉盈虧
fee,手續(xù)費
winRate,勝率
win,勝數(shù)
fail,敗數(shù)
maxProfit,單筆最大盈利
maxLoss,單筆最大虧損
avgProfit,平均盈利
avgLoss,平均虧損
從結(jié)果來看,多么開心啊,幾乎每天都是賺錢的!!
cu1605和cu1606兩個合同是完美地具備均衡關(guān)系的兩個金融產(chǎn)品,大家常常所說的跨期套利就是基于這個思路實現(xiàn)的。本文介紹的配對交易模型,是統(tǒng)計套利的一個基本模型,原理很簡單,當(dāng)大家都掌握后拼的就是交易速度了。數(shù)據(jù)分析師培訓(xùn)
利用市場的無效性來獲取利潤,是每個套利策略都在尋找的目標(biāo)。通過統(tǒng)計方法,我們可以發(fā)現(xiàn)市場的無效性,再以對沖的操作方式,規(guī)避絕大部分的市場風(fēng)險,等待市場的自我修復(fù)后來賺錢利潤。說起來很簡單,但市場的無效性,可能會在極短時間內(nèi)就被修復(fù)。
“天下武功為快不破”,通過量化的手段,讓計算機(jī)來發(fā)現(xiàn)機(jī)會,進(jìn)行交易,實現(xià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)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗證碼的宕機(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){ //倒計時完成 $(".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); }