国产无遮挡裸体免费直播视频,久久精品国产蜜臀av,动漫在线视频一区二区,欧亚日韩一区二区三区,久艹在线 免费视频,国产精品美女网站免费,正在播放 97超级视频在线观看,斗破苍穹年番在线观看免费,51最新乱码中文字幕

如何利用python進(jìn)行時間序列分析

 更新時間:2020年08月04日 10:43:54   作者:大熊貓?zhí)陨? 
這篇文章主要介紹了如何利用python進(jìn)行時間序列分析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

題記:畢業(yè)一年多天天coding,好久沒寫paper了。在這動蕩的日子里,也希望寫點(diǎn)東西讓自己靜一靜。恰好前段時間用python做了一點(diǎn)時間序列方面的東西,有一丁點(diǎn)心得體會想和大家分享下。在此也要特別感謝顧志耐和散沙,讓我喜歡上了python。

什么是時間序列

時間序列簡單的說就是各時間點(diǎn)上形成的數(shù)值序列,時間序列分析就是通過觀察歷史數(shù)據(jù)預(yù)測未來的值。在這里需要強(qiáng)調(diào)一點(diǎn)的是,時間序列分析并不是關(guān)于時間的回歸,它主要是研究自身的變化規(guī)律的(這里不考慮含外生變量的時間序列)。

為什么用python

  用兩個字總結(jié)“情懷”,愛屋及烏,個人比較喜歡python,就用python擼了。能做時間序列的軟件很多,SAS、R、SPSS、Eviews甚至matlab等等,實際工作中應(yīng)用得比較多的應(yīng)該還是SAS和R,前者推薦王燕寫的《應(yīng)用時間序列分析》,后者推薦“基于R語言的時間序列建模完整教程”這篇博文(翻譯版)。python作為科學(xué)計算的利器,當(dāng)然也有相關(guān)分析的包:statsmodels中tsa模塊,當(dāng)然這個包和SAS、R是比不了,但是python有另一個神器:pandas!pandas在時間序列上的應(yīng)用,能簡化我們很多的工作。

環(huán)境配置

  python推薦直接裝Anaconda,它集成了許多科學(xué)計算包,有一些包自己手動去裝還是挺費(fèi)勁的。statsmodels需要自己去安裝,這里我推薦使用0.6的穩(wěn)定版,0.7及其以上的版本能在github上找到,該版本在安裝時會用C編譯好,所以修改底層的一些代碼將不會起作用。

時間序列分析

1.基本模型

  自回歸移動平均模型(ARMA(p,q))是時間序列中最為重要的模型之一,它主要由兩部分組成: AR代表p階自回歸過程,MA代表q階移動平均過程,其公式如下:

   依據(jù)模型的形式、特性及自相關(guān)和偏自相關(guān)函數(shù)的特征,總結(jié)如下:

在時間序列中,ARIMA模型是在ARMA模型的基礎(chǔ)上多了差分的操作。

2.pandas時間序列操作

大熊貓真的很可愛,這里簡單介紹一下它在時間序列上的可愛之處。和許多時間序列分析一樣,本文同樣使用航空乘客數(shù)據(jù)(AirPassengers.csv)作為樣例。

數(shù)據(jù)讀?。?/p>

# -*- coding:utf-8 -*-
import numpy as np
import pandas as pdfrom datetime import datetimeimport matplotlib.pylab as plt
# 讀取數(shù)據(jù),pd.read_csv默認(rèn)生成DataFrame對象,需將其轉(zhuǎn)換成Series對象df = pd.read_csv('AirPassengers.csv', encoding='utf-8', index_col='date')df.index = pd.to_datetime(df.index) # 將字符串索引轉(zhuǎn)換成時間索引ts = df['x'] # 生成pd.Series對象# 查看數(shù)據(jù)格式ts.head()ts.head().index

查看某日的值既可以使用字符串作為索引,又可以直接使用時間對象作為索引

復(fù)制代碼 代碼如下:
ts['1949-01-01']ts[datetime(1949,1,1)]

兩者的返回值都是第一個序列值:112

如果要查看某一年的數(shù)據(jù),pandas也能非常方便的實現(xiàn)

ts['1949']

切片操作:

ts['1949-1' : '1949-6']

注意時間索引的切片操作起點(diǎn)和尾部都是包含的,這點(diǎn)與數(shù)值索引有所不同

pandas還有很多方便的時間序列函數(shù),在后面的實際應(yīng)用中在進(jìn)行說明。

3. 平穩(wěn)性檢驗

我們知道序列平穩(wěn)性是進(jìn)行時間序列分析的前提條件,很多人都會有疑問,為什么要滿足平穩(wěn)性的要求呢?在大數(shù)定理和中心定理中要求樣本同分布(這里同分布等價于時間序列中的平穩(wěn)性),而我們的建模過程中有很多都是建立在大數(shù)定理和中心極限定理的前提條件下的,如果它不滿足,得到的許多結(jié)論都是不可靠的。以虛假回歸為例,當(dāng)響應(yīng)變量和輸入變量都平穩(wěn)時,我們用t統(tǒng)計量檢驗標(biāo)準(zhǔn)化系數(shù)的顯著性。而當(dāng)響應(yīng)變量和輸入變量不平穩(wěn)時,其標(biāo)準(zhǔn)化系數(shù)不在滿足t分布,這時再用t檢驗來進(jìn)行顯著性分析,導(dǎo)致拒絕原假設(shè)的概率增加,即容易犯第一類錯誤,從而得出錯誤的結(jié)論。

平穩(wěn)時間序列有兩種定義:嚴(yán)平穩(wěn)和寬平穩(wěn)

嚴(yán)平穩(wěn)顧名思義,是一種條件非??量痰钠椒€(wěn)性,它要求序列隨著時間的推移,其統(tǒng)計性質(zhì)保持不變。對于任意的τ,其聯(lián)合概率密度函數(shù)滿足:

嚴(yán)平穩(wěn)的條件只是理論上的存在,現(xiàn)實中用得比較多的是寬平穩(wěn)的條件。

寬平穩(wěn)也叫弱平穩(wěn)或者二階平穩(wěn)(均值和方差平穩(wěn)),它應(yīng)滿足:

  • 常數(shù)均值
  • 常數(shù)方差
  • 常數(shù)自協(xié)方差

平穩(wěn)性檢驗:觀察法和單位根檢驗法

基于此,我寫了一個名為test_stationarity的統(tǒng)計性檢驗?zāi)K,以便將某些統(tǒng)計檢驗結(jié)果更加直觀的展現(xiàn)出來。

# -*- coding:utf-8 -*-
from statsmodels.tsa.stattools import adfuller
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# 移動平均圖
def draw_trend(timeSeries, size):
 f = plt.figure(facecolor='white')
 # 對size個數(shù)據(jù)進(jìn)行移動平均
 rol_mean = timeSeries.rolling(window=size).mean()
 # 對size個數(shù)據(jù)進(jìn)行加權(quán)移動平均
 rol_weighted_mean = pd.ewma(timeSeries, span=size)

 timeSeries.plot(color='blue', label='Original')
 rolmean.plot(color='red', label='Rolling Mean')
 rol_weighted_mean.plot(color='black', label='Weighted Rolling Mean')
 plt.legend(loc='best')
 plt.title('Rolling Mean')
 plt.show()

def draw_ts(timeSeries): f = plt.figure(facecolor='white')
 timeSeries.plot(color='blue')
 plt.show()

'''  Unit Root Test
 The null hypothesis of the Augmented Dickey-Fuller is that there is a unit
 root, with the alternative that there is no unit root. That is to say the
 bigger the p-value the more reason we assert that there is a unit root
'''
def testStationarity(ts):
 dftest = adfuller(ts)
 # 對上述函數(shù)求得的值進(jìn)行語義描述
 dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
 for key,value in dftest[4].items():
  dfoutput['Critical Value (%s)'%key] = value
 return dfoutput

# 自相關(guān)和偏相關(guān)圖,默認(rèn)階數(shù)為31階
def draw_acf_pacf(ts, lags=31):
 f = plt.figure(facecolor='white')
 ax1 = f.add_subplot(211)
 plot_acf(ts, lags=31, ax=ax1)
 ax2 = f.add_subplot(212)
 plot_pacf(ts, lags=31, ax=ax2)
 plt.show()

觀察法,通俗的說就是通過觀察序列的趨勢圖與相關(guān)圖是否隨著時間的變化呈現(xiàn)出某種規(guī)律。所謂的規(guī)律就是時間序列經(jīng)常提到的周期性因素,現(xiàn)實中遇到得比較多的是線性周期成分,這類周期成分可以采用差分或者移動平均來解決,而對于非線性周期成分的處理相對比較復(fù)雜,需要采用某些分解的方法。下圖為航空數(shù)據(jù)的線性圖,可以明顯的看出它具有年周期成分和長期趨勢成分。平穩(wěn)序列的自相關(guān)系數(shù)會快速衰減,下面的自相關(guān)圖并不能體現(xiàn)出該特征,所以我們有理由相信該序列是不平穩(wěn)的。

單位根檢驗:ADF是一種常用的單位根檢驗方法,他的原假設(shè)為序列具有單位根,即非平穩(wěn),對于一個平穩(wěn)的時序數(shù)據(jù),就需要在給定的置信水平上顯著,拒絕原假設(shè)。ADF只是單位根檢驗的方法之一,如果想采用其他檢驗方法,可以安裝第三方包arch,里面提供了更加全面的單位根檢驗方法,個人還是比較鐘情ADF檢驗。以下為檢驗結(jié)果,其p值大于0.99,說明并不能拒絕原假設(shè)。

3. 平穩(wěn)性處理

由前面的分析可知,該序列是不平穩(wěn)的,然而平穩(wěn)性是時間序列分析的前提條件,故我們需要對不平穩(wěn)的序列進(jìn)行處理將其轉(zhuǎn)換成平穩(wěn)的序列。

a. 對數(shù)變換

對數(shù)變換主要是為了減小數(shù)據(jù)的振動幅度,使其線性規(guī)律更加明顯(我是這么理解的時間序列模型大部分都是線性的,為了盡量降低非線性的因素,需要對其進(jìn)行預(yù)處理,也許我理解的不對)。對數(shù)變換相當(dāng)于增加了一個懲罰機(jī)制,數(shù)據(jù)越大其懲罰越大,數(shù)據(jù)越小懲罰越小。這里強(qiáng)調(diào)一下,變換的序列需要滿足大于0,小于0的數(shù)據(jù)不存在對數(shù)變換。

ts_log = np.log(ts)
test_stationarity.draw_ts(ts_log)

b. 平滑法

根據(jù)平滑技術(shù)的不同,平滑法具體分為移動平均法和指數(shù)平均法。

移動平均即利用一定時間間隔內(nèi)的平均值作為某一期的估計值,而指數(shù)平均則是用變權(quán)的方法來計算均值

test_stationarity.draw_trend(ts_log, 12)

從上圖可以發(fā)現(xiàn)窗口為12的移動平均能較好的剔除年周期性因素,而指數(shù)平均法是對周期內(nèi)的數(shù)據(jù)進(jìn)行了加權(quán),能在一定程度上減小年周期因素,但并不能完全剔除,如要完全剔除可以進(jìn)一步進(jìn)行差分操作。

c. 差分

時間序列最常用來剔除周期性因素的方法當(dāng)屬差分了,它主要是對等周期間隔的數(shù)據(jù)進(jìn)行線性求減。前面我們說過,ARIMA模型相對ARMA模型,僅多了差分操作,ARIMA模型幾乎是所有時間序列軟件都支持的,差分的實現(xiàn)與還原都非常方便。而statsmodel中,對差分的支持不是很好,它不支持高階和多階差分,為什么不支持,這里引用作者的說法:

作者大概的意思是說預(yù)測方法中并沒有解決高于2階的差分,有沒有感覺很牽強(qiáng),不過沒關(guān)系,我們有pandas。我們可以先用pandas將序列差分好,然后在對差分好的序列進(jìn)行ARIMA擬合,只不過這樣后面會多了一步人工還原的工作。

diff_12 = ts_log.diff(12)
diff_12.dropna(inplace=True)
diff_12_1 = diff_12.diff(1)
diff_12_1.dropna(inplace=True)
test_stationarity.testStationarity(diff_12_1)

從上面的統(tǒng)計檢驗結(jié)果可以看出,經(jīng)過12階差分和1階差分后,該序列滿足平穩(wěn)性的要求了。

d. 分解

所謂分解就是將時序數(shù)據(jù)分離成不同的成分。statsmodels使用的X-11分解過程,它主要將時序數(shù)據(jù)分離成長期趨勢、季節(jié)趨勢和隨機(jī)成分。與其它統(tǒng)計軟件一樣,statsmodels也支持兩類分解模型,加法模型和乘法模型,這里我只實現(xiàn)加法,乘法只需將model的參數(shù)設(shè)置為"multiplicative"即可。

from statsmodels.tsa.seasonal import seasonal_decompose
decomposition = seasonal_decompose(ts_log, model="additive")

trend = decomposition.trend
seasonal = decomposition.seasonal
residual = decomposition.resid

得到不同的分解成分后,就可以使用時間序列模型對各個成分進(jìn)行擬合,當(dāng)然也可以選擇其他預(yù)測方法。我曾經(jīng)用過小波對時序數(shù)據(jù)進(jìn)行過分解,然后分別采用時間序列擬合,效果還不錯。由于我對小波的理解不是很好,只能簡單的調(diào)用接口,如果有誰對小波、傅里葉、卡爾曼理解得比較透,可以將時序數(shù)據(jù)進(jìn)行更加準(zhǔn)確的分解,由于分解后的時序數(shù)據(jù)避免了他們在建模時的交叉影響,所以我相信它將有助于預(yù)測準(zhǔn)確性的提高。

4. 模型識別

在前面的分析可知,該序列具有明顯的年周期與長期成分。對于年周期成分我們使用窗口為12的移動平進(jìn)行處理,對于長期趨勢成分我們采用1階差分來進(jìn)行處理。

rol_mean = ts_log.rolling(window=12).mean()
rol_mean.dropna(inplace=True)
ts_diff_1 = rol_mean.diff(1)
ts_diff_1.dropna(inplace=True)
test_stationarity.testStationarity(ts_diff_1)

觀察其統(tǒng)計量發(fā)現(xiàn)該序列在置信水平為95%的區(qū)間下并不顯著,我們對其進(jìn)行再次一階差分。再次差分后的序列其自相關(guān)具有快速衰減的特點(diǎn),t統(tǒng)計量在99%的置信水平下是顯著的,這里我不再做詳細(xì)說明。

ts_diff_2 = ts_diff_1.diff(1)
ts_diff_2.dropna(inplace=True)

數(shù)據(jù)平穩(wěn)后,需要對模型定階,即確定p、q的階數(shù)。觀察上圖,發(fā)現(xiàn)自相關(guān)和偏相系數(shù)都存在拖尾的特點(diǎn),并且他們都具有明顯的一階相關(guān)性,所以我們設(shè)定p=1, q=1。下面就可以使用ARMA模型進(jìn)行數(shù)據(jù)擬合了。這里我不使用ARIMA(ts_diff_1, order=(1, 1, 1))進(jìn)行擬合,是因為含有差分操作時,預(yù)測結(jié)果還原老出問題,至今還沒弄明白。

from statsmodels.tsa.arima_model import ARMA
model = ARMA(ts_diff_2, order=(1, 1)) 
result_arma = model.fit( disp=-1, method='css')

5. 樣本擬合

模型擬合完后,我們就可以對其進(jìn)行預(yù)測了。由于ARMA擬合的是經(jīng)過相關(guān)預(yù)處理后的數(shù)據(jù),故其預(yù)測值需要通過相關(guān)逆變換進(jìn)行還原。

predict_ts = result_arma.predict()
# 一階差分還原diff_shift_ts = ts_diff_1.shift(1)diff_recover_1 = predict_ts.add(diff_shift_ts)# 再次一階差分還原
rol_shift_ts = rol_mean.shift(1)
diff_recover = diff_recover_1.add(rol_shift_ts)
# 移動平均還原
rol_sum = ts_log.rolling(window=11).sum()
rol_recover = diff_recover*12 - rol_sum.shift(1)
# 對數(shù)還原
log_recover = np.exp(rol_recover)
log_recover.dropna(inplace=True)

我們使用均方根誤差(RMSE)來評估模型樣本內(nèi)擬合的好壞。利用該準(zhǔn)則進(jìn)行判別時,需要剔除“非預(yù)測”數(shù)據(jù)的影響。

ts = ts[log_recover.index] # 過濾沒有預(yù)測的記錄plt.figure(facecolor='white')
log_recover.plot(color='blue', label='Predict')
ts.plot(color='red', label='Original')
plt.legend(loc='best')
plt.title('RMSE: %.4f'% np.sqrt(sum((log_recover-ts)**2)/ts.size))
plt.show()

觀察上圖的擬合效果,均方根誤差為11.8828,感覺還過得去。

6.完善ARIMA模型

前面提到statsmodels里面的ARIMA模塊不支持高階差分,我們的做法是將差分分離出來,但是這樣會多了一步人工還原的操作?;谏鲜鰡栴},我將差分過程進(jìn)行了封裝,使序列能按照指定的差分列表依次進(jìn)行差分,并相應(yīng)的構(gòu)造了一個還原的方法,實現(xiàn)差分序列的自動還原。

# 差分操作
def diff_ts(ts, d):
 global shift_ts_list
 # 動態(tài)預(yù)測第二日的值時所需要的差分序列
 global last_data_shift_list
 shift_ts_list = []
 last_data_shift_list = []
 tmp_ts = ts
 for i in d:
  last_data_shift_list.append(tmp_ts[-i])
  print last_data_shift_list
  shift_ts = tmp_ts.shift(i)
  shift_ts_list.append(shift_ts)
  tmp_ts = tmp_ts - shift_ts
 tmp_ts.dropna(inplace=True)
 return tmp_ts

# 還原操作
def predict_diff_recover(predict_value, d):
 if isinstance(predict_value, float):
  tmp_data = predict_value
  for i in range(len(d)):
   tmp_data = tmp_data + last_data_shift_list[-i-1]
 elif isinstance(predict_value, np.ndarray):
  tmp_data = predict_value[0]
  for i in range(len(d)):
   tmp_data = tmp_data + last_data_shift_list[-i-1]
 else:
  tmp_data = predict_value
  for i in range(len(d)):
   try:
    tmp_data = tmp_data.add(shift_ts_list[-i-1])
   except:
    raise ValueError('What you input is not pd.Series type!')
  tmp_data.dropna(inplace=True)
 return tmp_data

現(xiàn)在我們直接使用差分的方法進(jìn)行數(shù)據(jù)處理,并以同樣的過程進(jìn)行數(shù)據(jù)預(yù)測與還原。

diffed_ts = diff_ts(ts_log, d=[12, 1])
model = arima_model(diffed_ts)
model.certain_model(1, 1)
predict_ts = model.properModel.predict()
diff_recover_ts = predict_diff_recover(predict_ts, d=[12, 1])
log_recover = np.exp(diff_recover_ts)

是不是發(fā)現(xiàn)這里的預(yù)測結(jié)果和上一篇的使用12階移動平均的預(yù)測結(jié)果一模一樣。這是因為12階移動平均加上一階差分與直接12階差分是等價的關(guān)系,后者是前者數(shù)值的12倍,這個應(yīng)該不難推導(dǎo)。

對于個數(shù)不多的時序數(shù)據(jù),我們可以通過觀察自相關(guān)圖和偏相關(guān)圖來進(jìn)行模型識別,倘若我們要分析的時序數(shù)據(jù)量較多,例如要預(yù)測每只股票的走勢,我們就不可能逐個去調(diào)參了。這時我們可以依據(jù)BIC準(zhǔn)則識別模型的p, q值,通常認(rèn)為BIC值越小的模型相對更優(yōu)。這里我簡單介紹一下BIC準(zhǔn)則,它綜合考慮了殘差大小和自變量的個數(shù),殘差越小BIC值越小,自變量個數(shù)越多BIC值越大。個人覺得BIC準(zhǔn)則就是對模型過擬合設(shè)定了一個標(biāo)準(zhǔn)(過擬合這東西應(yīng)該以辯證的眼光看待)。

def proper_model(data_ts, maxLag):
 init_bic = sys.maxint
 init_p = 0
 init_q = 0
 init_properModel = None
 for p in np.arange(maxLag):
  for q in np.arange(maxLag):
   model = ARMA(data_ts, order=(p, q))
   try:
    results_ARMA = model.fit(disp=-1, method='css')
   except:
    continue
   bic = results_ARMA.bic
   if bic < init_bic:
    init_p = p
    init_q = q
    init_properModel = results_ARMA
    init_bic = bic
 return init_bic, init_p, init_q, init_properModel

相對最優(yōu)參數(shù)識別結(jié)果:BIC: -1090.44209358 p: 0 q: 1 ,RMSE:11.8817198331。我們發(fā)現(xiàn)模型自動識別的參數(shù)要比我手動選取的參數(shù)更優(yōu)。

7.滾動預(yù)測

所謂滾動預(yù)測是指通過添加最新的數(shù)據(jù)預(yù)測第二天的值。對于一個穩(wěn)定的預(yù)測模型,不需要每天都去擬合,我們可以給他設(shè)定一個閥值,例如每周擬合一次,該期間只需通過添加最新的數(shù)據(jù)實現(xiàn)滾動預(yù)測即可?;诖宋揖帉懥艘粋€名為arima_model的類,主要包含模型自動識別方法,滾動預(yù)測的功能,詳細(xì)代碼可以查看附錄。數(shù)據(jù)的動態(tài)添加:

from dateutil.relativedelta import relativedeltadef _add_new_data(ts, dat, type='day'):
if type == 'day':
  new_index = ts.index[-1] + relativedelta(days=1)
 elif type == 'month':
  new_index = ts.index[-1] + relativedelta(months=1)
 ts[new_index] = dat

def add_today_data(model, ts, data, d, type='day'):
 _add_new_data(ts, data, type) # 為原始序列添加數(shù)據(jù)
 # 為滯后序列添加新值
 d_ts = diff_ts(ts, d)
 model.add_today_data(d_ts[-1], type)

def forecast_next_day_data(model, type='day'):
 if model == None:
  raise ValueError('No model fit before')
 fc = model.forecast_next_day_value(type)
 return predict_diff_recover(fc, [12, 1])

現(xiàn)在我們就可以使用滾動預(yù)測的方法向外預(yù)測了,取1957年之前的數(shù)據(jù)作為訓(xùn)練數(shù)據(jù),其后的數(shù)據(jù)作為測試,并設(shè)定模型每第七天就會重新擬合一次。這里的diffed_ts對象會隨著add_today_data方法自動添加數(shù)據(jù),這是由于它與add_today_data方法中的d_ts指向的同一對象,該對象會動態(tài)的添加數(shù)據(jù)。

ts_train = ts_log[:'1956-12']
ts_test = ts_log['1957-1':]

diffed_ts = diff_ts(ts_train, [12, 1])
forecast_list = []
for i, dta in enumerate(ts_test):
 if i%7 == 0:
  model = arima_model(diffed_ts)
  model.certain_model(1, 1)
 forecast_data = forecast_next_day_data(model, type='month')
 forecast_list.append(forecast_data)
 add_today_data(model, ts_train, dta, [12, 1], type='month')

predict_ts = pd.Series(data=forecast_list, index=ts['1957-1':].index)log_recover = np.exp(predict_ts)original_ts = ts['1957-1':]

動態(tài)預(yù)測的均方根誤差為:14.6479,與前面樣本內(nèi)擬合的均方根誤差相差不大,說明模型并沒有過擬合,并且整體預(yù)測效果都較好。

8. 模型序列化

在進(jìn)行動態(tài)預(yù)測時,我們不希望將整個模型一直在內(nèi)存中運(yùn)行,而是希望有新的數(shù)據(jù)到來時才啟動該模型。這時我們就應(yīng)該把整個模型從內(nèi)存導(dǎo)出到硬盤中,而序列化正好能滿足該要求。序列化最常用的就是使用json模塊了,但是它是時間對象支持得不是很好,有人對json模塊進(jìn)行了拓展以使得支持時間對象,這里我們不采用該方法,我們使用pickle模塊,它和json的接口基本相同,有興趣的可以去查看一下。我在實際應(yīng)用中是采用的面向?qū)ο蟮木幊?,它的序列化主要是將類的屬性序列化即可,而在面向過程的編程中,模型序列化需要將需要序列化的對象公有化,這樣會使得對前面函數(shù)的參數(shù)改動較大,我不在詳細(xì)闡述該過程。

總結(jié)

與其它統(tǒng)計語言相比,python在統(tǒng)計分析這塊還顯得不那么“專業(yè)”。隨著numpy、pandas、scipy、sklearn、gensim、statsmodels等包的推動,我相信也祝愿python在數(shù)據(jù)分析這塊越來越好。與SAS和R相比,python的時間序列模塊還不是很成熟,我這里僅起到拋磚引玉的作用,希望各位能人志士能貢獻(xiàn)自己的力量,使其更加完善。實際應(yīng)用中我全是面向過程來編寫的,為了闡述方便,我用面向過程重新羅列了一遍,實在感覺很不方便。原本打算分三篇來寫的,還有一部分實際應(yīng)用的部分,不打算再寫了,還請大家原諒。實際應(yīng)用主要是具體問題具體分析,這當(dāng)中第一步就是要查詢問題,這步花的時間往往會比較多,然后再是解決問題。以我前面項目遇到的問題為例,當(dāng)時遇到了以下幾個典型的問題:1.周期長度不恒定的周期成分,例如每月的1號具有周期性,但每月1號與1號之間的時間間隔是不相等的;2.含有缺失值以及含有記錄為0的情況無法進(jìn)行對數(shù)變換;3.節(jié)假日的影響等等。

附錄

# -*-coding:utf-8-*-
import pandas as pd
import numpy as np
from statsmodels.tsa.arima_model import ARMA
import sys
from dateutil.relativedelta import relativedelta
from copy import deepcopy
import matplotlib.pyplot as plt

class arima_model:

 def __init__(self, ts, maxLag=9):
  self.data_ts = ts
  self.resid_ts = None
  self.predict_ts = None
  self.maxLag = maxLag
  self.p = maxLag
  self.q = maxLag
  self.properModel = None
  self.bic = sys.maxint

 # 計算最優(yōu)ARIMA模型,將相關(guān)結(jié)果賦給相應(yīng)屬性
 def get_proper_model(self):
  self._proper_model()
  self.predict_ts = deepcopy(self.properModel.predict())
  self.resid_ts = deepcopy(self.properModel.resid)

 # 對于給定范圍內(nèi)的p,q計算擬合得最好的arima模型,這里是對差分好的數(shù)據(jù)進(jìn)行擬合,故差分恒為0
 def _proper_model(self):
  for p in np.arange(self.maxLag):
   for q in np.arange(self.maxLag):
    # print p,q,self.bic
    model = ARMA(self.data_ts, order=(p, q))
    try:
     results_ARMA = model.fit(disp=-1, method='css')
    except:
     continue
    bic = results_ARMA.bic
    # print 'bic:',bic,'self.bic:',self.bic
    if bic < self.bic:
     self.p = p
     self.q = q
     self.properModel = results_ARMA
     self.bic = bic
     self.resid_ts = deepcopy(self.properModel.resid)
     self.predict_ts = self.properModel.predict()

 # 參數(shù)確定模型
 def certain_model(self, p, q):
   model = ARMA(self.data_ts, order=(p, q))
   try:
    self.properModel = model.fit( disp=-1, method='css')
    self.p = p
    self.q = q
    self.bic = self.properModel.bic
    self.predict_ts = self.properModel.predict()
    self.resid_ts = deepcopy(self.properModel.resid)
   except:
    print 'You can not fit the model with this parameter p,q, ' \
      'please use the get_proper_model method to get the best model'

 # 預(yù)測第二日的值
 def forecast_next_day_value(self, type='day'):
  # 我修改了statsmodels包中arima_model的源代碼,添加了constant屬性,需要先運(yùn)行forecast方法,為constant賦值
  self.properModel.forecast()
  if self.data_ts.index[-1] != self.resid_ts.index[-1]:
   raise ValueError('''The index is different in data_ts and resid_ts, please add new data to data_ts.
   If you just want to forecast the next day data without add the real next day data to data_ts,
   please run the predict method which arima_model included itself''')
  if not self.properModel:
   raise ValueError('The arima model have not computed, please run the proper_model method before')
  para = self.properModel.params

  # print self.properModel.params
  if self.p == 0: # It will get all the value series with setting self.data_ts[-self.p:] when p is zero
   ma_value = self.resid_ts[-self.q:]
   values = ma_value.reindex(index=ma_value.index[::-1])
  elif self.q == 0:
   ar_value = self.data_ts[-self.p:]
   values = ar_value.reindex(index=ar_value.index[::-1])
  else:
   ar_value = self.data_ts[-self.p:]
   ar_value = ar_value.reindex(index=ar_value.index[::-1])
   ma_value = self.resid_ts[-self.q:]
   ma_value = ma_value.reindex(index=ma_value.index[::-1])
   values = ar_value.append(ma_value)

  predict_value = np.dot(para[1:], values) + self.properModel.constant[0]
  self._add_new_data(self.predict_ts, predict_value, type)
  return predict_value

 # 動態(tài)添加數(shù)據(jù)函數(shù),針對索引是月份和日分別進(jìn)行處理
 def _add_new_data(self, ts, dat, type='day'):
  if type == 'day':
   new_index = ts.index[-1] + relativedelta(days=1)
  elif type == 'month':
   new_index = ts.index[-1] + relativedelta(months=1)
  ts[new_index] = dat

 def add_today_data(self, dat, type='day'):
  self._add_new_data(self.data_ts, dat, type)
  if self.data_ts.index[-1] != self.predict_ts.index[-1]:
   raise ValueError('You must use the forecast_next_day_value method forecast the value of today before')
  self._add_new_data(self.resid_ts, self.data_ts[-1] - self.predict_ts[-1], type)

if __name__ == '__main__':
 df = pd.read_csv('AirPassengers.csv', encoding='utf-8', index_col='date')
 df.index = pd.to_datetime(df.index)
 ts = df['x']

 # 數(shù)據(jù)預(yù)處理
 ts_log = np.log(ts)
 rol_mean = ts_log.rolling(window=12).mean()
 rol_mean.dropna(inplace=True)
 ts_diff_1 = rol_mean.diff(1)
 ts_diff_1.dropna(inplace=True)
 ts_diff_2 = ts_diff_1.diff(1)
 ts_diff_2.dropna(inplace=True)

 # 模型擬合
 model = arima_model(ts_diff_2)
 # 這里使用模型參數(shù)自動識別
 model.get_proper_model()
 print 'bic:', model.bic, 'p:', model.p, 'q:', model.q
 print model.properModel.forecast()[0]
 print model.forecast_next_day_value(type='month')

 # 預(yù)測結(jié)果還原
 predict_ts = model.properModel.predict()
 diff_shift_ts = ts_diff_1.shift(1)
 diff_recover_1 = predict_ts.add(diff_shift_ts)
 rol_shift_ts = rol_mean.shift(1)
 diff_recover = diff_recover_1.add(rol_shift_ts)
 rol_sum = ts_log.rolling(window=11).sum()
 rol_recover = diff_recover*12 - rol_sum.shift(1)
 log_recover = np.exp(rol_recover)
 log_recover.dropna(inplace=True)

 # 預(yù)測結(jié)果作圖
 ts = ts[log_recover.index]
 plt.figure(facecolor='white')
 log_recover.plot(color='blue', label='Predict')
 ts.plot(color='red', label='Original')
 plt.legend(loc='best')
 plt.title('RMSE: %.4f'% np.sqrt(sum((log_recover-ts)**2)/ts.size))
 plt.show()

修改的arima_model代碼

# Note: The information criteria add 1 to the number of parameters
#  whenever the model has an AR or MA term since, in principle,
#  the variance could be treated as a free parameter and restricted
#  This code does not allow this, but it adds consistency with other
#  packages such as gretl and X12-ARIMA
 
from __future__ import absolute_import
from statsmodels.compat.python import string_types, range
# for 2to3 with extensions
 
from datetime import datetime
 
import numpy as np
from scipy import optimize
from scipy.stats import t, norm
from scipy.signal import lfilter
from numpy import dot, log, zeros, pi
from numpy.linalg import inv
 
from statsmodels.tools.decorators import (cache_readonly,
           resettable_cache)
import statsmodels.tsa.base.tsa_model as tsbase
import statsmodels.base.wrapper as wrap
from statsmodels.regression.linear_model import yule_walker, GLS
from statsmodels.tsa.tsatools import (lagmat, add_trend,
          _ar_transparams, _ar_invtransparams,
          _ma_transparams, _ma_invtransparams,
          unintegrate, unintegrate_levels)
from statsmodels.tsa.vector_ar import util
from statsmodels.tsa.ar_model import AR
from statsmodels.tsa.arima_process import arma2ma
from statsmodels.tools.numdiff import approx_hess_cs, approx_fprime_cs
from statsmodels.tsa.base.datetools import _index_date
from statsmodels.tsa.kalmanf import KalmanFilter
 
_armax_notes = """
 
  Notes
  -----
  If exogenous variables are given, then the model that is fit is
 
  .. math::
 
   \\phi(L)(y_t - X_t\\beta) = \\theta(L)\epsilon_t
 
  where :math:`\\phi` and :math:`\\theta` are polynomials in the lag
  operator, :math:`L`. This is the regression model with ARMA errors,
  or ARMAX model. This specification is used, whether or not the model
  is fit using conditional sum of square or maximum-likelihood, using
  the `method` argument in
  :meth:`statsmodels.tsa.arima_model.%(Model)s.fit`. Therefore, for
  now, `css` and `mle` refer to estimation methods only. This may
  change for the case of the `css` model in future versions.
"""
 
_arma_params = """\
 endog : array-like
  The endogenous variable.
 order : iterable
  The (p,q) order of the model for the number of AR parameters,
  differences, and MA parameters to use.
 exog : array-like, optional
  An optional arry of exogenous variables. This should *not* include a
  constant or trend. You can specify this in the `fit` method."""
 
_arma_model = "Autoregressive Moving Average ARMA(p,q) Model"
 
_arima_model = "Autoregressive Integrated Moving Average ARIMA(p,d,q) Model"
 
_arima_params = """\
 endog : array-like
  The endogenous variable.
 order : iterable
  The (p,d,q) order of the model for the number of AR parameters,
  differences, and MA parameters to use.
 exog : array-like, optional
  An optional arry of exogenous variables. This should *not* include a
  constant or trend. You can specify this in the `fit` method."""
 
_predict_notes = """
  Notes
  -----
  Use the results predict method instead.
"""
 
_results_notes = """
  Notes
  -----
  It is recommended to use dates with the time-series models, as the
  below will probably make clear. However, if ARIMA is used without
  dates and/or `start` and `end` are given as indices, then these
  indices are in terms of the *original*, undifferenced series. Ie.,
  given some undifferenced observations::
 
   1970Q1, 1
   1970Q2, 1.5
   1970Q3, 1.25
   1970Q4, 2.25
   1971Q1, 1.2
   1971Q2, 4.1
 
  1970Q1 is observation 0 in the original series. However, if we fit an
  ARIMA(p,1,q) model then we lose this first observation through
  differencing. Therefore, the first observation we can forecast (if
  using exact MLE) is index 1. In the differenced series this is index
  0, but we refer to it as 1 from the original series.
"""
 
_predict = """
  %(Model)s model in-sample and out-of-sample prediction
 
  Parameters
  ----------
  %(params)s
  start : int, str, or datetime
   Zero-indexed observation number at which to start forecasting, ie.,
   the first forecast is start. Can also be a date string to
   parse or a datetime type.
  end : int, str, or datetime
   Zero-indexed observation number at which to end forecasting, ie.,
   the first forecast is start. Can also be a date string to
   parse or a datetime type. However, if the dates index does not
   have a fixed frequency, end must be an integer index if you
   want out of sample prediction.
  exog : array-like, optional
   If the model is an ARMAX and out-of-sample forecasting is
   requested, exog must be given. Note that you'll need to pass
   `k_ar` additional lags for any exogenous variables. E.g., if you
   fit an ARMAX(2, q) model and want to predict 5 steps, you need 7
   observations to do this.
  dynamic : bool, optional
   The `dynamic` keyword affects in-sample prediction. If dynamic
   is False, then the in-sample lagged values are used for
   prediction. If `dynamic` is True, then in-sample forecasts are
   used in place of lagged dependent variables. The first forecasted
   value is `start`.
  %(extra_params)s
 
  Returns
  -------
  %(returns)s
  %(extra_section)s
"""
 
_predict_returns = """predict : array
   The predicted values.
 
"""
 
_arma_predict = _predict % {"Model" : "ARMA",
       "params" : """
   params : array-like
   The fitted parameters of the model.""",
       "extra_params" : "",
       "returns" : _predict_returns,
       "extra_section" : _predict_notes}
 
_arma_results_predict = _predict % {"Model" : "ARMA", "params" : "",
         "extra_params" : "",
         "returns" : _predict_returns,
         "extra_section" : _results_notes}
 
_arima_predict = _predict % {"Model" : "ARIMA",
        "params" : """params : array-like
   The fitted parameters of the model.""",
        "extra_params" : """typ : str {'linear', 'levels'}
 
   - 'linear' : Linear prediction in terms of the differenced
    endogenous variables.
   - 'levels' : Predict the levels of the original endogenous
    variables.\n""", "returns" : _predict_returns,
        "extra_section" : _predict_notes}
 
_arima_results_predict = _predict % {"Model" : "ARIMA",
          "params" : "",
          "extra_params" :
          """typ : str {'linear', 'levels'}
 
   - 'linear' : Linear prediction in terms of the differenced
    endogenous variables.
   - 'levels' : Predict the levels of the original endogenous
    variables.\n""",
          "returns" : _predict_returns,
          "extra_section" : _results_notes}
 
_arima_plot_predict_example = """  Examples
  --------
  >>> import statsmodels.api as sm
  >>> import matplotlib.pyplot as plt
  >>> import pandas as pd
  >>>
  >>> dta = sm.datasets.sunspots.load_pandas().data[['SUNACTIVITY']]
  >>> dta.index = pd.DatetimeIndex(start='1700', end='2009', freq='A')
  >>> res = sm.tsa.ARMA(dta, (3, 0)).fit()
  >>> fig, ax = plt.subplots()
  >>> ax = dta.ix['1950':].plot(ax=ax)
  >>> fig = res.plot_predict('1990', '2012', dynamic=True, ax=ax,
  ...      plot_insample=False)
  >>> plt.show()
 
  .. plot:: plots/arma_predict_plot.py
"""
 
_plot_predict = ("""
  Plot forecasts
      """ + '\n'.join(_predict.split('\n')[2:])) % {
      "params" : "",
       "extra_params" : """alpha : float, optional
   The confidence intervals for the forecasts are (1 - alpha)%
  plot_insample : bool, optional
   Whether to plot the in-sample series. Default is True.
  ax : matplotlib.Axes, optional
   Existing axes to plot with.""",
      "returns" : """fig : matplotlib.Figure
   The plotted Figure instance""",
      "extra_section" : ('\n' + _arima_plot_predict_example +
           '\n' + _results_notes)
      }
 
_arima_plot_predict = ("""
  Plot forecasts
      """ + '\n'.join(_predict.split('\n')[2:])) % {
      "params" : "",
       "extra_params" : """alpha : float, optional
   The confidence intervals for the forecasts are (1 - alpha)%
  plot_insample : bool, optional
   Whether to plot the in-sample series. Default is True.
  ax : matplotlib.Axes, optional
   Existing axes to plot with.""",
      "returns" : """fig : matplotlib.Figure
   The plotted Figure instance""",
    "extra_section" : ('\n' + _arima_plot_predict_example +
         '\n' +
         '\n'.join(_results_notes.split('\n')[:3]) +
        ("""
  This is hard-coded to only allow plotting of the forecasts in levels.
""") +
        '\n'.join(_results_notes.split('\n')[3:]))
      }
 
 
def cumsum_n(x, n):
 if n:
  n -= 1
  x = np.cumsum(x)
  return cumsum_n(x, n)
 else:
  return x
 
 
def _check_arima_start(start, k_ar, k_diff, method, dynamic):
 if start < 0:
  raise ValueError("The start index %d of the original series "
       "has been differenced away" % start)
 elif (dynamic or 'mle' not in method) and start < k_ar:
  raise ValueError("Start must be >= k_ar for conditional MLE "
       "or dynamic forecast. Got %d" % start)
 
 
def _get_predict_out_of_sample(endog, p, q, k_trend, k_exog, start, errors,
        trendparam, exparams, arparams, maparams, steps,
        method, exog=None):
 """
 Returns endog, resid, mu of appropriate length for out of sample
 prediction.
 """
 if q:
  resid = np.zeros(q)
  if start and 'mle' in method or (start == p and not start == 0):
   resid[:q] = errors[start-q:start]
  elif start:
   resid[:q] = errors[start-q-p:start-p]
  else:
   resid[:q] = errors[-q:]
 else:
  resid = None
 
 y = endog
 if k_trend == 1:
  # use expectation not constant
  if k_exog > 0:
   #TODO: technically should only hold for MLE not
   # conditional model. See #274.
   # ensure 2-d for conformability
   if np.ndim(exog) == 1 and k_exog == 1:
    # have a 1d series of observations -> 2d
    exog = exog[:, None]
   elif np.ndim(exog) == 1:
    # should have a 1d row of exog -> 2d
    if len(exog) != k_exog:
     raise ValueError("1d exog given and len(exog) != k_exog")
    exog = exog[None, :]
   X = lagmat(np.dot(exog, exparams), p, original='in', trim='both')
   mu = trendparam * (1 - arparams.sum())
   # arparams were reversed in unpack for ease later
   mu = mu + (np.r_[1, -arparams[::-1]] * X).sum(1)[:, None]
  else:
   mu = trendparam * (1 - arparams.sum())
   mu = np.array([mu]*steps)
 elif k_exog > 0:
  X = np.dot(exog, exparams)
  #NOTE: you shouldn't have to give in-sample exog!
  X = lagmat(X, p, original='in', trim='both')
  mu = (np.r_[1, -arparams[::-1]] * X).sum(1)[:, None]
 else:
  mu = np.zeros(steps)
 
 endog = np.zeros(p + steps - 1)
 
 if p and start:
  endog[:p] = y[start-p:start]
 elif p:
  endog[:p] = y[-p:]
 
 return endog, resid, mu
 
 
def _arma_predict_out_of_sample(params, steps, errors, p, q, k_trend, k_exog,
        endog, exog=None, start=0, method='mle'):
 (trendparam, exparams,
  arparams, maparams) = _unpack_params(params, (p, q), k_trend,
           k_exog, reverse=True)
 # print 'params:',params
 # print 'arparams:',arparams,'maparams:',maparams
 endog, resid, mu = _get_predict_out_of_sample(endog, p, q, k_trend, k_exog,
             start, errors, trendparam,
             exparams, arparams,
             maparams, steps, method,
             exog)
# print 'mu[-1]:',mu[-1], 'mu[0]:',mu[0]
 forecast = np.zeros(steps)
 if steps == 1:
  if q:
   return mu[0] + np.dot(arparams, endog[:p]) + np.dot(maparams,
                resid[:q]), mu[0]
  else:
   return mu[0] + np.dot(arparams, endog[:p]), mu[0]
 
 if q:
  i = 0 # if q == 1
 else:
  i = -1
 
 for i in range(min(q, steps - 1)):
  fcast = (mu[i] + np.dot(arparams, endog[i:i + p]) +
     np.dot(maparams[:q - i], resid[i:i + q]))
  forecast[i] = fcast
  endog[i+p] = fcast
 
 for i in range(i + 1, steps - 1):
  fcast = mu[i] + np.dot(arparams, endog[i:i+p])
  forecast[i] = fcast
  endog[i+p] = fcast
 
 #need to do one more without updating endog
 forecast[-1] = mu[-1] + np.dot(arparams, endog[steps - 1:])
 return forecast, mu[-1] #Modified by me, the former is return forecast
 
 
def _arma_predict_in_sample(start, end, endog, resid, k_ar, method):
 """
 Pre- and in-sample fitting for ARMA.
 """
 if 'mle' in method:
  fittedvalues = endog - resid # get them all then trim
 else:
  fittedvalues = endog[k_ar:] - resid
 
 fv_start = start
 if 'mle' not in method:
  fv_start -= k_ar # start is in terms of endog index
 fv_end = min(len(fittedvalues), end + 1)
 return fittedvalues[fv_start:fv_end]
 
 
def _validate(start, k_ar, k_diff, dates, method):
 if isinstance(start, (string_types, datetime)):
  start = _index_date(start, dates)
  start -= k_diff
 if 'mle' not in method and start < k_ar - k_diff:
  raise ValueError("Start must be >= k_ar for conditional "
       "MLE or dynamic forecast. Got %s" % start)
 
 return start
 
 
def _unpack_params(params, order, k_trend, k_exog, reverse=False):
 p, q = order
 k = k_trend + k_exog
 maparams = params[k+p:]
 arparams = params[k:k+p]
 trend = params[:k_trend]
 exparams = params[k_trend:k]
 if reverse:
  return trend, exparams, arparams[::-1], maparams[::-1]
 return trend, exparams, arparams, maparams
 
 
def _unpack_order(order):
 k_ar, k_ma, k = order
 k_lags = max(k_ar, k_ma+1)
 return k_ar, k_ma, order, k_lags
 
 
def _make_arma_names(data, k_trend, order, exog_names):
 k_ar, k_ma = order
 exog_names = exog_names or []
 ar_lag_names = util.make_lag_names([data.ynames], k_ar, 0)
 ar_lag_names = [''.join(('ar.', i)) for i in ar_lag_names]
 ma_lag_names = util.make_lag_names([data.ynames], k_ma, 0)
 ma_lag_names = [''.join(('ma.', i)) for i in ma_lag_names]
 trend_name = util.make_lag_names('', 0, k_trend)
 exog_names = trend_name + exog_names + ar_lag_names + ma_lag_names
 return exog_names
 
 
def _make_arma_exog(endog, exog, trend):
 k_trend = 1 # overwritten if no constant
 if exog is None and trend == 'c': # constant only
  exog = np.ones((len(endog), 1))
 elif exog is not None and trend == 'c': # constant plus exogenous
  exog = add_trend(exog, trend='c', prepend=True)
 elif exog is not None and trend == 'nc':
  # make sure it's not holding constant from last run
  if exog.var() == 0:
   exog = None
  k_trend = 0
 if trend == 'nc':
  k_trend = 0
 return k_trend, exog
 
 
def _check_estimable(nobs, n_params):
 if nobs <= n_params:
  raise ValueError("Insufficient degrees of freedom to estimate")
 
 
class ARMA(tsbase.TimeSeriesModel):
 
 __doc__ = tsbase._tsa_doc % {"model" : _arma_model,
         "params" : _arma_params, "extra_params" : "",
         "extra_sections" : _armax_notes %
         {"Model" : "ARMA"}}
 
 def __init__(self, endog, order, exog=None, dates=None, freq=None,
     missing='none'):
  super(ARMA, self).__init__(endog, exog, dates, freq, missing=missing)
  exog = self.data.exog # get it after it's gone through processing
  _check_estimable(len(self.endog), sum(order))
  self.k_ar = k_ar = order[0]
  self.k_ma = k_ma = order[1]
  self.k_lags = max(k_ar, k_ma+1)
  self.constant = 0 #Added by me
  if exog is not None:
   if exog.ndim == 1:
    exog = exog[:, None]
   k_exog = exog.shape[1] # number of exog. variables excl. const
  else:
   k_exog = 0
  self.k_exog = k_exog
 
 def _fit_start_params_hr(self, order):
  """
  Get starting parameters for fit.
 
  Parameters
  ----------
  order : iterable
   (p,q,k) - AR lags, MA lags, and number of exogenous variables
   including the constant.
 
  Returns
  -------
  start_params : array
   A first guess at the starting parameters.
 
  Notes
  -----
  If necessary, fits an AR process with the laglength selected according
  to best BIC. Obtain the residuals. Then fit an ARMA(p,q) model via
  OLS using these residuals for a first approximation. Uses a separate
  OLS regression to find the coefficients of exogenous variables.
 
  References
  ----------
  Hannan, E.J. and Rissanen, J. 1982. "Recursive estimation of mixed
   autoregressive-moving average order." `Biometrika`. 69.1.
  """
  p, q, k = order
  start_params = zeros((p+q+k))
  endog = self.endog.copy() # copy because overwritten
  exog = self.exog
  if k != 0:
   ols_params = GLS(endog, exog).fit().params
   start_params[:k] = ols_params
   endog -= np.dot(exog, ols_params).squeeze()
  if q != 0:
   if p != 0:
    # make sure we don't run into small data problems in AR fit
    nobs = len(endog)
    maxlag = int(round(12*(nobs/100.)**(1/4.)))
    if maxlag >= nobs:
     maxlag = nobs - 1
    armod = AR(endog).fit(ic='bic', trend='nc', maxlag=maxlag)
    arcoefs_tmp = armod.params
    p_tmp = armod.k_ar
    # it's possible in small samples that optimal lag-order
    # doesn't leave enough obs. No consistent way to fix.
    if p_tmp + q >= len(endog):
     raise ValueError("Proper starting parameters cannot"
          " be found for this order with this "
          "number of observations. Use the "
          "start_params argument.")
    resid = endog[p_tmp:] - np.dot(lagmat(endog, p_tmp,
              trim='both'),
            arcoefs_tmp)
    if p < p_tmp + q:
     endog_start = p_tmp + q - p
     resid_start = 0
    else:
     endog_start = 0
     resid_start = p - p_tmp - q
    lag_endog = lagmat(endog, p, 'both')[endog_start:]
    lag_resid = lagmat(resid, q, 'both')[resid_start:]
    # stack ar lags and resids
    X = np.column_stack((lag_endog, lag_resid))
    coefs = GLS(endog[max(p_tmp + q, p):], X).fit().params
    start_params[k:k+p+q] = coefs
   else:
    start_params[k+p:k+p+q] = yule_walker(endog, order=q)[0]
  if q == 0 and p != 0:
   arcoefs = yule_walker(endog, order=p)[0]
   start_params[k:k+p] = arcoefs
 
  # check AR coefficients
  if p and not np.all(np.abs(np.roots(np.r_[1, -start_params[k:k + p]]
           )) < 1):
   raise ValueError("The computed initial AR coefficients are not "
        "stationary\nYou should induce stationarity, "
        "choose a different model order, or you can\n"
        "pass your own start_params.")
  # check MA coefficients
  elif q and not np.all(np.abs(np.roots(np.r_[1, start_params[k + p:]]
            )) < 1):
   return np.zeros(len(start_params)) #modified by me
   raise ValueError("The computed initial MA coefficients are not "
        "invertible\nYou should induce invertibility, "
        "choose a different model order, or you can\n"
        "pass your own start_params.")
 
  # check MA coefficients
  # print start_params
  return start_params
 
 def _fit_start_params(self, order, method):
  if method != 'css-mle': # use Hannan-Rissanen to get start params
   start_params = self._fit_start_params_hr(order)
  else: # use CSS to get start params
   func = lambda params: -self.loglike_css(params)
   #start_params = [.1]*(k_ar+k_ma+k_exog) # different one for k?
   start_params = self._fit_start_params_hr(order)
   if self.transparams:
    start_params = self._invtransparams(start_params)
   bounds = [(None,)*2]*sum(order)
   mlefit = optimize.fmin_l_bfgs_b(func, start_params,
           approx_grad=True, m=12,
           pgtol=1e-7, factr=1e3,
           bounds=bounds, iprint=-1)
   start_params = self._transparams(mlefit[0])
  return start_params
 
 def score(self, params):
  """
  Compute the score function at params.
 
  Notes
  -----
  This is a numerical approximation.
  """
  return approx_fprime_cs(params, self.loglike, args=(False,))
 
 def hessian(self, params):
  """
  Compute the Hessian at params,
 
  Notes
  -----
  This is a numerical approximation.
  """
  return approx_hess_cs(params, self.loglike, args=(False,))
 
 def _transparams(self, params):
  """
  Transforms params to induce stationarity/invertability.
 
  Reference
  ---------
  Jones(1980)
  """
  k_ar, k_ma = self.k_ar, self.k_ma
  k = self.k_exog + self.k_trend
  newparams = np.zeros_like(params)
 
  # just copy exogenous parameters
  if k != 0:
   newparams[:k] = params[:k]
 
  # AR Coeffs
  if k_ar != 0:
   newparams[k:k+k_ar] = _ar_transparams(params[k:k+k_ar].copy())
 
  # MA Coeffs
  if k_ma != 0:
   newparams[k+k_ar:] = _ma_transparams(params[k+k_ar:].copy())
  return newparams
 
 def _invtransparams(self, start_params):
  """
  Inverse of the Jones reparameterization
  """
  k_ar, k_ma = self.k_ar, self.k_ma
  k = self.k_exog + self.k_trend
  newparams = start_params.copy()
  arcoefs = newparams[k:k+k_ar]
  macoefs = newparams[k+k_ar:]
  # AR coeffs
  if k_ar != 0:
   newparams[k:k+k_ar] = _ar_invtransparams(arcoefs)
 
  # MA coeffs
  if k_ma != 0:
   newparams[k+k_ar:k+k_ar+k_ma] = _ma_invtransparams(macoefs)
  return newparams
 
 def _get_predict_start(self, start, dynamic):
  # do some defaults
  method = getattr(self, 'method', 'mle')
  k_ar = getattr(self, 'k_ar', 0)
  k_diff = getattr(self, 'k_diff', 0)
  if start is None:
   if 'mle' in method and not dynamic:
    start = 0
   else:
    start = k_ar
   self._set_predict_start_date(start) # else it's done in super
  elif isinstance(start, int):
   start = super(ARMA, self)._get_predict_start(start)
  else: # should be on a date
   #elif 'mle' not in method or dynamic: # should be on a date
   start = _validate(start, k_ar, k_diff, self.data.dates,
        method)
   start = super(ARMA, self)._get_predict_start(start)
  _check_arima_start(start, k_ar, k_diff, method, dynamic)
  return start
 
 def _get_predict_end(self, end, dynamic=False):
  # pass through so predict works for ARIMA and ARMA
  return super(ARMA, self)._get_predict_end(end)
 
 def geterrors(self, params):
  """
  Get the errors of the ARMA process.
 
  Parameters
  ----------
  params : array-like
   The fitted ARMA parameters
  order : array-like
   3 item iterable, with the number of AR, MA, and exogenous
   parameters, including the trend
  """
 
  #start = self._get_predict_start(start) # will be an index of a date
  #end, out_of_sample = self._get_predict_end(end)
  params = np.asarray(params)
  k_ar, k_ma = self.k_ar, self.k_ma
  k = self.k_exog + self.k_trend
 
  method = getattr(self, 'method', 'mle')
  if 'mle' in method: # use KalmanFilter to get errors
   (y, k, nobs, k_ar, k_ma, k_lags, newparams, Z_mat, m, R_mat,
    T_mat, paramsdtype) = KalmanFilter._init_kalman_state(params,
                 self)
 
   errors = KalmanFilter.geterrors(y, k, k_ar, k_ma, k_lags, nobs,
           Z_mat, m, R_mat, T_mat,
           paramsdtype)
   if isinstance(errors, tuple):
    errors = errors[0] # non-cython version returns a tuple
  else: # use scipy.signal.lfilter
   y = self.endog.copy()
   k = self.k_exog + self.k_trend
   if k > 0:
    y -= dot(self.exog, params[:k])
 
   k_ar = self.k_ar
   k_ma = self.k_ma
 
   (trendparams, exparams,
    arparams, maparams) = _unpack_params(params, (k_ar, k_ma),
             self.k_trend, self.k_exog,
             reverse=False)
   b, a = np.r_[1, -arparams], np.r_[1, maparams]
   zi = zeros((max(k_ar, k_ma)))
   for i in range(k_ar):
    zi[i] = sum(-b[:i+1][::-1]*y[:i+1])
   e = lfilter(b, a, y, zi=zi)
   errors = e[0][k_ar:]
  return errors.squeeze()
 
 def predict(self, params, start=None, end=None, exog=None, dynamic=False):
  method = getattr(self, 'method', 'mle') # don't assume fit
  #params = np.asarray(params)
 
  # will return an index of a date
  start = self._get_predict_start(start, dynamic)
  end, out_of_sample = self._get_predict_end(end, dynamic)
  if out_of_sample and (exog is None and self.k_exog > 0):
   raise ValueError("You must provide exog for ARMAX")
 
  endog = self.endog
  resid = self.geterrors(params)
  k_ar = self.k_ar
 
  if out_of_sample != 0 and self.k_exog > 0:
   if self.k_exog == 1 and exog.ndim == 1:
    exog = exog[:, None]
    # we need the last k_ar exog for the lag-polynomial
   if self.k_exog > 0 and k_ar > 0:
    # need the last k_ar exog for the lag-polynomial
    exog = np.vstack((self.exog[-k_ar:, self.k_trend:], exog))
 
  if dynamic:
   #TODO: now that predict does dynamic in-sample it should
   # also return error estimates and confidence intervals
   # but how? len(endog) is not tot_obs
   out_of_sample += end - start + 1
   pr, ct = _arma_predict_out_of_sample(params, out_of_sample, resid,
            k_ar, self.k_ma, self.k_trend,
            self.k_exog, endog, exog,
            start, method)
   self.constant = ct
   return pr
 
  predictedvalues = _arma_predict_in_sample(start, end, endog, resid,
             k_ar, method)
  if out_of_sample:
   forecastvalues, ct = _arma_predict_out_of_sample(params, out_of_sample,
               resid, k_ar,
               self.k_ma,
               self.k_trend,
               self.k_exog, endog,
               exog, method=method)
   self.constant = ct
   predictedvalues = np.r_[predictedvalues, forecastvalues]
  return predictedvalues
 predict.__doc__ = _arma_predict
 
 def loglike(self, params, set_sigma2=True):
  """
  Compute the log-likelihood for ARMA(p,q) model
 
  Notes
  -----
  Likelihood used depends on the method set in fit
  """
  method = self.method
  if method in ['mle', 'css-mle']:
   return self.loglike_kalman(params, set_sigma2)
  elif method == 'css':
   return self.loglike_css(params, set_sigma2)
  else:
   raise ValueError("Method %s not understood" % method)
 
 def loglike_kalman(self, params, set_sigma2=True):
  """
  Compute exact loglikelihood for ARMA(p,q) model by the Kalman Filter.
  """
  return KalmanFilter.loglike(params, self, set_sigma2)
 
 def loglike_css(self, params, set_sigma2=True):
  """
  Conditional Sum of Squares likelihood function.
  """
  k_ar = self.k_ar
  k_ma = self.k_ma
  k = self.k_exog + self.k_trend
  y = self.endog.copy().astype(params.dtype)
  nobs = self.nobs
  # how to handle if empty?
  if self.transparams:
   newparams = self._transparams(params)
  else:
   newparams = params
  if k > 0:
   y -= dot(self.exog, newparams[:k])
  # the order of p determines how many zeros errors to set for lfilter
  b, a = np.r_[1, -newparams[k:k + k_ar]], np.r_[1, newparams[k + k_ar:]]
  zi = np.zeros((max(k_ar, k_ma)), dtype=params.dtype)
  for i in range(k_ar):
   zi[i] = sum(-b[:i + 1][::-1] * y[:i + 1])
  errors = lfilter(b, a, y, zi=zi)[0][k_ar:]
 
  ssr = np.dot(errors, errors)
  sigma2 = ssr/nobs
  if set_sigma2:
   self.sigma2 = sigma2
  llf = -nobs/2.*(log(2*pi) + log(sigma2)) - ssr/(2*sigma2)
  return llf
 
 def fit(self, start_params=None, trend='c', method="css-mle",
   transparams=True, solver='lbfgs', maxiter=50, full_output=1,
   disp=5, callback=None, **kwargs):
  """
  Fits ARMA(p,q) model using exact maximum likelihood via Kalman filter.
 
  Parameters
  ----------
  start_params : array-like, optional
   Starting parameters for ARMA(p,q). If None, the default is given
   by ARMA._fit_start_params. See there for more information.
  transparams : bool, optional
   Whehter or not to transform the parameters to ensure stationarity.
   Uses the transformation suggested in Jones (1980). If False,
   no checking for stationarity or invertibility is done.
  method : str {'css-mle','mle','css'}
   This is the loglikelihood to maximize. If "css-mle", the
   conditional sum of squares likelihood is maximized and its values
   are used as starting values for the computation of the exact
   likelihood via the Kalman filter. If "mle", the exact likelihood
   is maximized via the Kalman Filter. If "css" the conditional sum
   of squares likelihood is maximized. All three methods use
   `start_params` as starting parameters. See above for more
   information.
  trend : str {'c','nc'}
   Whether to include a constant or not. 'c' includes constant,
   'nc' no constant.
  solver : str or None, optional
   Solver to be used. The default is 'lbfgs' (limited memory
   Broyden-Fletcher-Goldfarb-Shanno). Other choices are 'bfgs',
   'newton' (Newton-Raphson), 'nm' (Nelder-Mead), 'cg' -
   (conjugate gradient), 'ncg' (non-conjugate gradient), and
   'powell'. By default, the limited memory BFGS uses m=12 to
   approximate the Hessian, projected gradient tolerance of 1e-8 and
   factr = 1e2. You can change these by using kwargs.
  maxiter : int, optional
   The maximum number of function evaluations. Default is 50.
  tol : float
   The convergence tolerance. Default is 1e-08.
  full_output : bool, optional
   If True, all output from solver will be available in
   the Results object's mle_retvals attribute. Output is dependent
   on the solver. See Notes for more information.
  disp : bool, optional
   If True, convergence information is printed. For the default
   l_bfgs_b solver, disp controls the frequency of the output during
   the iterations. disp < 0 means no output in this case.
  callback : function, optional
   Called after each iteration as callback(xk) where xk is the current
   parameter vector.
  kwargs
   See Notes for keyword arguments that can be passed to fit.
 
  Returns
  -------
  statsmodels.tsa.arima_model.ARMAResults class
 
  See also
  --------
  statsmodels.base.model.LikelihoodModel.fit : for more information
   on using the solvers.
  ARMAResults : results class returned by fit
 
  Notes
  ------
  If fit by 'mle', it is assumed for the Kalman Filter that the initial
  unkown state is zero, and that the inital variance is
  P = dot(inv(identity(m**2)-kron(T,T)),dot(R,R.T).ravel('F')).reshape(r,
  r, order = 'F')
 
  """
  k_ar = self.k_ar
  k_ma = self.k_ma
 
  # enforce invertibility
  self.transparams = transparams
 
  endog, exog = self.endog, self.exog
  k_exog = self.k_exog
  self.nobs = len(endog) # this is overwritten if method is 'css'
 
  # (re)set trend and handle exogenous variables
  # always pass original exog
  k_trend, exog = _make_arma_exog(endog, self.exog, trend)
 
  # Check has something to estimate
  if k_ar == 0 and k_ma == 0 and k_trend == 0 and k_exog == 0:
   raise ValueError("Estimation requires the inclusion of least one "
       "AR term, MA term, a constant or an exogenous "
       "variable.")
 
  # check again now that we know the trend
  _check_estimable(len(endog), k_ar + k_ma + k_exog + k_trend)
 
  self.k_trend = k_trend
  self.exog = exog # overwrites original exog from __init__
 
  # (re)set names for this model
  self.exog_names = _make_arma_names(self.data, k_trend, (k_ar, k_ma),
           self.exog_names)
  k = k_trend + k_exog
 
  # choose objective function
  if k_ma == 0 and k_ar == 0:
   method = "css" # Always CSS when no AR or MA terms
 
  self.method = method = method.lower()
 
  # adjust nobs for css
  if method == 'css':
   self.nobs = len(self.endog) - k_ar
 
  if start_params is not None:
   start_params = np.asarray(start_params)
 
  else: # estimate starting parameters
   start_params = self._fit_start_params((k_ar, k_ma, k), method)
 
  if transparams: # transform initial parameters to ensure invertibility
   start_params = self._invtransparams(start_params)
 
  if solver == 'lbfgs':
   kwargs.setdefault('pgtol', 1e-8)
   kwargs.setdefault('factr', 1e2)
   kwargs.setdefault('m', 12)
   kwargs.setdefault('approx_grad', True)
  mlefit = super(ARMA, self).fit(start_params, method=solver,
          maxiter=maxiter,
          full_output=full_output, disp=disp,
          callback=callback, **kwargs)
  params = mlefit.params
 
  if transparams: # transform parameters back
   params = self._transparams(params)
 
  self.transparams = False # so methods don't expect transf.
 
  normalized_cov_params = None # TODO: fix this
  armafit = ARMAResults(self, params, normalized_cov_params)
  armafit.mle_retvals = mlefit.mle_retvals
  armafit.mle_settings = mlefit.mle_settings
  armafit.mlefit = mlefit
  return ARMAResultsWrapper(armafit)
 
 
#NOTE: the length of endog changes when we give a difference to fit
#so model methods are not the same on unfit models as fit ones
#starting to think that order of model should be put in instantiation...
class ARIMA(ARMA):
 
 __doc__ = tsbase._tsa_doc % {"model" : _arima_model,
         "params" : _arima_params, "extra_params" : "",
         "extra_sections" : _armax_notes %
         {"Model" : "ARIMA"}}
 
 def __new__(cls, endog, order, exog=None, dates=None, freq=None,
    missing='none'):
  p, d, q = order
  if d == 0: # then we just use an ARMA model
   return ARMA(endog, (p, q), exog, dates, freq, missing)
  else:
   mod = super(ARIMA, cls).__new__(cls)
   mod.__init__(endog, order, exog, dates, freq, missing)
   return mod
 
 def __init__(self, endog, order, exog=None, dates=None, freq=None,
     missing='none'):
  p, d, q = order
  if d > 2:
   #NOTE: to make more general, need to address the d == 2 stuff
   # in the predict method
   raise ValueError("d > 2 is not supported")
  super(ARIMA, self).__init__(endog, (p, q), exog, dates, freq, missing)
  self.k_diff = d
  self._first_unintegrate = unintegrate_levels(self.endog[:d], d)
  self.endog = np.diff(self.endog, n=d)
  #NOTE: will check in ARMA but check again since differenced now
  _check_estimable(len(self.endog), p+q)
  if exog is not None:
   self.exog = self.exog[d:]
  if d == 1:
   self.data.ynames = 'D.' + self.endog_names
  else:
   self.data.ynames = 'D{0:d}.'.format(d) + self.endog_names
  # what about exog, should we difference it automatically before
  # super call?
 
 def _get_predict_start(self, start, dynamic):
  """
  """
  #TODO: remove all these getattr and move order specification to
  # class constructor
  k_diff = getattr(self, 'k_diff', 0)
  method = getattr(self, 'method', 'mle')
  k_ar = getattr(self, 'k_ar', 0)
  if start is None:
   if 'mle' in method and not dynamic:
    start = 0
   else:
    start = k_ar
  elif isinstance(start, int):
    start -= k_diff
    try: # catch when given an integer outside of dates index
     start = super(ARIMA, self)._get_predict_start(start,
                 dynamic)
    except IndexError:
     raise ValueError("start must be in series. "
          "got %d" % (start + k_diff))
  else: # received a date
   start = _validate(start, k_ar, k_diff, self.data.dates,
        method)
   start = super(ARIMA, self)._get_predict_start(start, dynamic)
  # reset date for k_diff adjustment
  self._set_predict_start_date(start + k_diff)
  return start
 
 def _get_predict_end(self, end, dynamic=False):
  """
  Returns last index to be forecast of the differenced array.
  Handling of inclusiveness should be done in the predict function.
  """
  end, out_of_sample = super(ARIMA, self)._get_predict_end(end, dynamic)
  if 'mle' not in self.method and not dynamic:
   end -= self.k_ar
 
  return end - self.k_diff, out_of_sample
 
 def fit(self, start_params=None, trend='c', method="css-mle",
   transparams=True, solver='lbfgs', maxiter=50, full_output=1,
   disp=5, callback=None, **kwargs):
  """
  Fits ARIMA(p,d,q) model by exact maximum likelihood via Kalman filter.
 
  Parameters
  ----------
  start_params : array-like, optional
   Starting parameters for ARMA(p,q). If None, the default is given
   by ARMA._fit_start_params. See there for more information.
  transparams : bool, optional
   Whehter or not to transform the parameters to ensure stationarity.
   Uses the transformation suggested in Jones (1980). If False,
   no checking for stationarity or invertibility is done.
  method : str {'css-mle','mle','css'}
   This is the loglikelihood to maximize. If "css-mle", the
   conditional sum of squares likelihood is maximized and its values
   are used as starting values for the computation of the exact
   likelihood via the Kalman filter. If "mle", the exact likelihood
   is maximized via the Kalman Filter. If "css" the conditional sum
   of squares likelihood is maximized. All three methods use
   `start_params` as starting parameters. See above for more
   information.
  trend : str {'c','nc'}
   Whether to include a constant or not. 'c' includes constant,
   'nc' no constant.
  solver : str or None, optional
   Solver to be used. The default is 'lbfgs' (limited memory
   Broyden-Fletcher-Goldfarb-Shanno). Other choices are 'bfgs',
   'newton' (Newton-Raphson), 'nm' (Nelder-Mead), 'cg' -
   (conjugate gradient), 'ncg' (non-conjugate gradient), and
   'powell'. By default, the limited memory BFGS uses m=12 to
   approximate the Hessian, projected gradient tolerance of 1e-8 and
   factr = 1e2. You can change these by using kwargs.
  maxiter : int, optional
   The maximum number of function evaluations. Default is 50.
  tol : float
   The convergence tolerance. Default is 1e-08.
  full_output : bool, optional
   If True, all output from solver will be available in
   the Results object's mle_retvals attribute. Output is dependent
   on the solver. See Notes for more information.
  disp : bool, optional
   If True, convergence information is printed. For the default
   l_bfgs_b solver, disp controls the frequency of the output during
   the iterations. disp < 0 means no output in this case.
  callback : function, optional
   Called after each iteration as callback(xk) where xk is the current
   parameter vector.
  kwargs
   See Notes for keyword arguments that can be passed to fit.
 
  Returns
  -------
  `statsmodels.tsa.arima.ARIMAResults` class
 
  See also
  --------
  statsmodels.base.model.LikelihoodModel.fit : for more information
   on using the solvers.
  ARIMAResults : results class returned by fit
 
  Notes
  ------
  If fit by 'mle', it is assumed for the Kalman Filter that the initial
  unkown state is zero, and that the inital variance is
  P = dot(inv(identity(m**2)-kron(T,T)),dot(R,R.T).ravel('F')).reshape(r,
  r, order = 'F')
 
  """
  arima_fit = super(ARIMA, self).fit(start_params, trend,
           method, transparams, solver,
           maxiter, full_output, disp,
           callback, **kwargs)
  normalized_cov_params = None # TODO: fix this?
  arima_fit = ARIMAResults(self, arima_fit._results.params,
         normalized_cov_params)
  arima_fit.k_diff = self.k_diff
  return ARIMAResultsWrapper(arima_fit)
 
 def predict(self, params, start=None, end=None, exog=None, typ='linear',
    dynamic=False):
  # go ahead and convert to an index for easier checking
  if isinstance(start, (string_types, datetime)):
   start = _index_date(start, self.data.dates)
  if typ == 'linear':
   if not dynamic or (start != self.k_ar + self.k_diff and
        start is not None):
    return super(ARIMA, self).predict(params, start, end, exog,
             dynamic)
   else:
    # need to assume pre-sample residuals are zero
    # do this by a hack
    q = self.k_ma
    self.k_ma = 0
    predictedvalues = super(ARIMA, self).predict(params, start,
                end, exog,
                dynamic)
    self.k_ma = q
    return predictedvalues
  elif typ == 'levels':
   endog = self.data.endog
   if not dynamic:
    predict = super(ARIMA, self).predict(params, start, end,
              dynamic)
 
    start = self._get_predict_start(start, dynamic)
    end, out_of_sample = self._get_predict_end(end)
    d = self.k_diff
    if 'mle' in self.method:
     start += d - 1 # for case where d == 2
     end += d - 1
     # add each predicted diff to lagged endog
     if out_of_sample:
      fv = predict[:-out_of_sample] + endog[start:end+1]
      if d == 2: #TODO: make a general solution to this
       fv += np.diff(endog[start - 1:end + 1])
      levels = unintegrate_levels(endog[-d:], d)
      fv = np.r_[fv,
         unintegrate(predict[-out_of_sample:],
            levels)[d:]]
     else:
      fv = predict + endog[start:end + 1]
      if d == 2:
       fv += np.diff(endog[start - 1:end + 1])
    else:
     k_ar = self.k_ar
     if out_of_sample:
      fv = (predict[:-out_of_sample] +
        endog[max(start, self.k_ar-1):end+k_ar+1])
      if d == 2:
       fv += np.diff(endog[start - 1:end + 1])
      levels = unintegrate_levels(endog[-d:], d)
      fv = np.r_[fv,
         unintegrate(predict[-out_of_sample:],
            levels)[d:]]
     else:
      fv = predict + endog[max(start, k_ar):end+k_ar+1]
      if d == 2:
       fv += np.diff(endog[start - 1:end + 1])
   else:
    #IFF we need to use pre-sample values assume pre-sample
    # residuals are zero, do this by a hack
    if start == self.k_ar + self.k_diff or start is None:
     # do the first k_diff+1 separately
     p = self.k_ar
     q = self.k_ma
     k_exog = self.k_exog
     k_trend = self.k_trend
     k_diff = self.k_diff
     (trendparam, exparams,
      arparams, maparams) = _unpack_params(params, (p, q),
               k_trend,
               k_exog,
               reverse=True)
     # this is the hack
     self.k_ma = 0
 
     predict = super(ARIMA, self).predict(params, start, end,
               exog, dynamic)
     if not start:
      start = self._get_predict_start(start, dynamic)
      start += k_diff
     self.k_ma = q
     return endog[start-1] + np.cumsum(predict)
    else:
     predict = super(ARIMA, self).predict(params, start, end,
               exog, dynamic)
     return endog[start-1] + np.cumsum(predict)
   return fv
 
  else: # pragma : no cover
   raise ValueError("typ %s not understood" % typ)
 
 predict.__doc__ = _arima_predict
 
 
class ARMAResults(tsbase.TimeSeriesModelResults):
 """
 Class to hold results from fitting an ARMA model.
 
 Parameters
 ----------
 model : ARMA instance
  The fitted model instance
 params : array
  Fitted parameters
 normalized_cov_params : array, optional
  The normalized variance covariance matrix
 scale : float, optional
  Optional argument to scale the variance covariance matrix.
 
 Returns
 --------
 **Attributes**
 
 aic : float
  Akaike Information Criterion
  :math:`-2*llf+2* df_model`
  where `df_model` includes all AR parameters, MA parameters, constant
  terms parameters on constant terms and the variance.
 arparams : array
  The parameters associated with the AR coefficients in the model.
 arroots : array
  The roots of the AR coefficients are the solution to
  (1 - arparams[0]*z - arparams[1]*z**2 -...- arparams[p-1]*z**k_ar) = 0
  Stability requires that the roots in modulus lie outside the unit
  circle.
 bic : float
  Bayes Information Criterion
  -2*llf + log(nobs)*df_model
  Where if the model is fit using conditional sum of squares, the
  number of observations `nobs` does not include the `p` pre-sample
  observations.
 bse : array
  The standard errors of the parameters. These are computed using the
  numerical Hessian.
 df_model : array
  The model degrees of freedom = `k_exog` + `k_trend` + `k_ar` + `k_ma`
 df_resid : array
  The residual degrees of freedom = `nobs` - `df_model`
 fittedvalues : array
  The predicted values of the model.
 hqic : float
  Hannan-Quinn Information Criterion
  -2*llf + 2*(`df_model`)*log(log(nobs))
  Like `bic` if the model is fit using conditional sum of squares then
  the `k_ar` pre-sample observations are not counted in `nobs`.
 k_ar : int
  The number of AR coefficients in the model.
 k_exog : int
  The number of exogenous variables included in the model. Does not
  include the constant.
 k_ma : int
  The number of MA coefficients.
 k_trend : int
  This is 0 for no constant or 1 if a constant is included.
 llf : float
  The value of the log-likelihood function evaluated at `params`.
 maparams : array
  The value of the moving average coefficients.
 maroots : array
  The roots of the MA coefficients are the solution to
  (1 + maparams[0]*z + maparams[1]*z**2 + ... + maparams[q-1]*z**q) = 0
  Stability requires that the roots in modules lie outside the unit
  circle.
 model : ARMA instance
  A reference to the model that was fit.
 nobs : float
  The number of observations used to fit the model. If the model is fit
  using exact maximum likelihood this is equal to the total number of
  observations, `n_totobs`. If the model is fit using conditional
  maximum likelihood this is equal to `n_totobs` - `k_ar`.
 n_totobs : float
  The total number of observations for `endog`. This includes all
  observations, even pre-sample values if the model is fit using `css`.
 params : array
  The parameters of the model. The order of variables is the trend
  coefficients and the `k_exog` exognous coefficients, then the
  `k_ar` AR coefficients, and finally the `k_ma` MA coefficients.
 pvalues : array
  The p-values associated with the t-values of the coefficients. Note
  that the coefficients are assumed to have a Student's T distribution.
 resid : array
  The model residuals. If the model is fit using 'mle' then the
  residuals are created via the Kalman Filter. If the model is fit
  using 'css' then the residuals are obtained via `scipy.signal.lfilter`
  adjusted such that the first `k_ma` residuals are zero. These zero
  residuals are not returned.
 scale : float
  This is currently set to 1.0 and not used by the model or its results.
 sigma2 : float
  The variance of the residuals. If the model is fit by 'css',
  sigma2 = ssr/nobs, where ssr is the sum of squared residuals. If
  the model is fit by 'mle', then sigma2 = 1/nobs * sum(v**2 / F)
  where v is the one-step forecast error and F is the forecast error
  variance. See `nobs` for the difference in definitions depending on the
  fit.
 """
 _cache = {}
 
 #TODO: use this for docstring when we fix nobs issue
 
 def __init__(self, model, params, normalized_cov_params=None, scale=1.):
  super(ARMAResults, self).__init__(model, params, normalized_cov_params,
           scale)
  self.sigma2 = model.sigma2
  nobs = model.nobs
  self.nobs = nobs
  k_exog = model.k_exog
  self.k_exog = k_exog
  k_trend = model.k_trend
  self.k_trend = k_trend
  k_ar = model.k_ar
  self.k_ar = k_ar
  self.n_totobs = len(model.endog)
  k_ma = model.k_ma
  self.k_ma = k_ma
  df_model = k_exog + k_trend + k_ar + k_ma
  self._ic_df_model = df_model + 1
  self.df_model = df_model
  self.df_resid = self.nobs - df_model
  self._cache = resettable_cache()
  self.constant = 0 #Added by me
 
 @cache_readonly
 def arroots(self):
  return np.roots(np.r_[1, -self.arparams])**-1
 
 @cache_readonly
 def maroots(self):
  return np.roots(np.r_[1, self.maparams])**-1
 
 @cache_readonly
 def arfreq(self):
  r"""
  Returns the frequency of the AR roots.
 
  This is the solution, x, to z = abs(z)*exp(2j*np.pi*x) where z are the
  roots.
  """
  z = self.arroots
  if not z.size:
   return
  return np.arctan2(z.imag, z.real) / (2*pi)
 
 @cache_readonly
 def mafreq(self):
  r"""
  Returns the frequency of the MA roots.
 
  This is the solution, x, to z = abs(z)*exp(2j*np.pi*x) where z are the
  roots.
  """
  z = self.maroots
  if not z.size:
   return
  return np.arctan2(z.imag, z.real) / (2*pi)
 
 @cache_readonly
 def arparams(self):
  k = self.k_exog + self.k_trend
  return self.params[k:k+self.k_ar]
 
 @cache_readonly
 def maparams(self):
  k = self.k_exog + self.k_trend
  k_ar = self.k_ar
  return self.params[k+k_ar:]
 
 @cache_readonly
 def llf(self):
  return self.model.loglike(self.params)
 
 @cache_readonly
 def bse(self):
  params = self.params
  hess = self.model.hessian(params)
  if len(params) == 1: # can't take an inverse, ensure 1d
   return np.sqrt(-1./hess[0])
  return np.sqrt(np.diag(-inv(hess)))
 
 def cov_params(self): # add scale argument?
  params = self.params
  hess = self.model.hessian(params)
  return -inv(hess)
 
 @cache_readonly
 def aic(self):
  return -2 * self.llf + 2 * self._ic_df_model
 
 @cache_readonly
 def bic(self):
  nobs = self.nobs
  return -2 * self.llf + np.log(nobs) * self._ic_df_model
 
 @cache_readonly
 def hqic(self):
  nobs = self.nobs
  return -2 * self.llf + 2 * np.log(np.log(nobs)) * self._ic_df_model
 
 @cache_readonly
 def fittedvalues(self):
  model = self.model
  endog = model.endog.copy()
  k_ar = self.k_ar
  exog = model.exog # this is a copy
  if exog is not None:
   if model.method == "css" and k_ar > 0:
    exog = exog[k_ar:]
  if model.method == "css" and k_ar > 0:
   endog = endog[k_ar:]
  fv = endog - self.resid
  # add deterministic part back in
  #k = self.k_exog + self.k_trend
  #TODO: this needs to be commented out for MLE with constant
  #if k != 0:
  # fv += dot(exog, self.params[:k])
  return fv
 
 @cache_readonly
 def resid(self):
  return self.model.geterrors(self.params)
 
 @cache_readonly
 def pvalues(self):
 #TODO: same for conditional and unconditional?
  df_resid = self.df_resid
  return t.sf(np.abs(self.tvalues), df_resid) * 2
 
 def predict(self, start=None, end=None, exog=None, dynamic=False):
  return self.model.predict(self.params, start, end, exog, dynamic)
 predict.__doc__ = _arma_results_predict
 
 def _forecast_error(self, steps):
  sigma2 = self.sigma2
  ma_rep = arma2ma(np.r_[1, -self.arparams],
       np.r_[1, self.maparams], nobs=steps)
 
  fcasterr = np.sqrt(sigma2 * np.cumsum(ma_rep**2))
  return fcasterr
 
 def _forecast_conf_int(self, forecast, fcasterr, alpha):
  const = norm.ppf(1 - alpha / 2.)
  conf_int = np.c_[forecast - const * fcasterr,
       forecast + const * fcasterr]
 
  return conf_int
 
 def forecast(self, steps=1, exog=None, alpha=.05):
  """
  Out-of-sample forecasts
 
  Parameters
  ----------
  steps : int
   The number of out of sample forecasts from the end of the
   sample.
  exog : array
   If the model is an ARMAX, you must provide out of sample
   values for the exogenous variables. This should not include
   the constant.
  alpha : float
   The confidence intervals for the forecasts are (1 - alpha) %
 
  Returns
  -------
  forecast : array
   Array of out of sample forecasts
  stderr : array
   Array of the standard error of the forecasts.
  conf_int : array
   2d array of the confidence interval for the forecast
  """
  if exog is not None:
   #TODO: make a convenience function for this. we're using the
   # pattern elsewhere in the codebase
   exog = np.asarray(exog)
   if self.k_exog == 1 and exog.ndim == 1:
    exog = exog[:, None]
   elif exog.ndim == 1:
    if len(exog) != self.k_exog:
     raise ValueError("1d exog given and len(exog) != k_exog")
    exog = exog[None, :]
   if exog.shape[0] != steps:
    raise ValueError("new exog needed for each step")
   # prepend in-sample exog observations
   exog = np.vstack((self.model.exog[-self.k_ar:, self.k_trend:],
        exog))
 
  forecast, ct = _arma_predict_out_of_sample(self.params,
            steps, self.resid, self.k_ar,
            self.k_ma, self.k_trend,
            self.k_exog, self.model.endog,
            exog, method=self.model.method)
  self.constant = ct
 
  # compute the standard errors
  fcasterr = self._forecast_error(steps)
  conf_int = self._forecast_conf_int(forecast, fcasterr, alpha)
 
  return forecast, fcasterr, conf_int
 
 def summary(self, alpha=.05):
  """Summarize the Model
 
  Parameters
  ----------
  alpha : float, optional
   Significance level for the confidence intervals.
 
  Returns
  -------
  smry : Summary instance
   This holds the summary table and text, which can be printed or
   converted to various output formats.
 
  See Also
  --------
  statsmodels.iolib.summary.Summary
  """
  from statsmodels.iolib.summary import Summary
  model = self.model
  title = model.__class__.__name__ + ' Model Results'
  method = model.method
  # get sample TODO: make better sample machinery for estimation
  k_diff = getattr(self, 'k_diff', 0)
  if 'mle' in method:
   start = k_diff
  else:
   start = k_diff + self.k_ar
  if self.data.dates is not None:
   dates = self.data.dates
   sample = [dates[start].strftime('%m-%d-%Y')]
   sample += ['- ' + dates[-1].strftime('%m-%d-%Y')]
  else:
   sample = str(start) + ' - ' + str(len(self.data.orig_endog))
 
  k_ar, k_ma = self.k_ar, self.k_ma
  if not k_diff:
   order = str((k_ar, k_ma))
  else:
   order = str((k_ar, k_diff, k_ma))
  top_left = [('Dep. Variable:', None),
     ('Model:', [model.__class__.__name__ + order]),
     ('Method:', [method]),
     ('Date:', None),
     ('Time:', None),
     ('Sample:', [sample[0]]),
     ('', [sample[1]])
     ]
 
  top_right = [
      ('No. Observations:', [str(len(self.model.endog))]),
      ('Log Likelihood', ["%#5.3f" % self.llf]),
      ('S.D. of innovations', ["%#5.3f" % self.sigma2**.5]),
      ('AIC', ["%#5.3f" % self.aic]),
      ('BIC', ["%#5.3f" % self.bic]),
      ('HQIC', ["%#5.3f" % self.hqic])]
 
  smry = Summary()
  smry.add_table_2cols(self, gleft=top_left, gright=top_right,
        title=title)
  smry.add_table_params(self, alpha=alpha, use_t=False)
 
  # Make the roots table
  from statsmodels.iolib.table import SimpleTable
 
  if k_ma and k_ar:
   arstubs = ["AR.%d" % i for i in range(1, k_ar + 1)]
   mastubs = ["MA.%d" % i for i in range(1, k_ma + 1)]
   stubs = arstubs + mastubs
   roots = np.r_[self.arroots, self.maroots]
   freq = np.r_[self.arfreq, self.mafreq]
  elif k_ma:
   mastubs = ["MA.%d" % i for i in range(1, k_ma + 1)]
   stubs = mastubs
   roots = self.maroots
   freq = self.mafreq
  elif k_ar:
   arstubs = ["AR.%d" % i for i in range(1, k_ar + 1)]
   stubs = arstubs
   roots = self.arroots
   freq = self.arfreq
  else: # 0,0 model
   stubs = []
  if len(stubs): # not 0, 0
   modulus = np.abs(roots)
   data = np.column_stack((roots.real, roots.imag, modulus, freq))
   roots_table = SimpleTable(data,
          headers=['   Real',
            '   Imaginary',
            '   Modulus',
            '  Frequency'],
          title="Roots",
          stubs=stubs,
          data_fmts=["%17.4f", "%+17.4fj",
             "%17.4f", "%17.4f"])
 
   smry.tables.append(roots_table)
  return smry
 
 def summary2(self, title=None, alpha=.05, float_format="%.4f"):
  """Experimental summary function for ARIMA Results
 
  Parameters
  -----------
  title : string, optional
   Title for the top table. If not None, then this replaces the
   default title
  alpha : float
   significance level for the confidence intervals
  float_format: string
   print format for floats in parameters summary
 
  Returns
  -------
  smry : Summary instance
   This holds the summary table and text, which can be printed or
   converted to various output formats.
 
  See Also
  --------
  statsmodels.iolib.summary2.Summary : class to hold summary
   results
 
  """
  from pandas import DataFrame
  # get sample TODO: make better sample machinery for estimation
  k_diff = getattr(self, 'k_diff', 0)
  if 'mle' in self.model.method:
   start = k_diff
  else:
   start = k_diff + self.k_ar
  if self.data.dates is not None:
   dates = self.data.dates
   sample = [dates[start].strftime('%m-%d-%Y')]
   sample += [dates[-1].strftime('%m-%d-%Y')]
  else:
   sample = str(start) + ' - ' + str(len(self.data.orig_endog))
 
  k_ar, k_ma = self.k_ar, self.k_ma
 
  # Roots table
  if k_ma and k_ar:
   arstubs = ["AR.%d" % i for i in range(1, k_ar + 1)]
   mastubs = ["MA.%d" % i for i in range(1, k_ma + 1)]
   stubs = arstubs + mastubs
   roots = np.r_[self.arroots, self.maroots]
   freq = np.r_[self.arfreq, self.mafreq]
  elif k_ma:
   mastubs = ["MA.%d" % i for i in range(1, k_ma + 1)]
   stubs = mastubs
   roots = self.maroots
   freq = self.mafreq
  elif k_ar:
   arstubs = ["AR.%d" % i for i in range(1, k_ar + 1)]
   stubs = arstubs
   roots = self.arroots
   freq = self.arfreq
  else: # 0, 0 order
   stubs = []
 
  if len(stubs):
   modulus = np.abs(roots)
   data = np.column_stack((roots.real, roots.imag, modulus, freq))
   data = DataFrame(data)
   data.columns = ['Real', 'Imaginary', 'Modulus', 'Frequency']
   data.index = stubs
 
  # Summary
  from statsmodels.iolib import summary2
  smry = summary2.Summary()
 
  # Model info
  model_info = summary2.summary_model(self)
  model_info['Method:'] = self.model.method
  model_info['Sample:'] = sample[0]
  model_info[' '] = sample[-1]
  model_info['S.D. of innovations:'] = "%#5.3f" % self.sigma2**.5
  model_info['HQIC:'] = "%#5.3f" % self.hqic
  model_info['No. Observations:'] = str(len(self.model.endog))
 
  # Parameters
  params = summary2.summary_params(self)
  smry.add_dict(model_info)
  smry.add_df(params, float_format=float_format)
  if len(stubs):
   smry.add_df(data, float_format="%17.4f")
  smry.add_title(results=self, title=title)
 
  return smry
 
 def plot_predict(self, start=None, end=None, exog=None, dynamic=False,
      alpha=.05, plot_insample=True, ax=None):
  from statsmodels.graphics.utils import _import_mpl, create_mpl_ax
  _ = _import_mpl()
  fig, ax = create_mpl_ax(ax)
 
 
  # use predict so you set dates
  forecast = self.predict(start, end, exog, dynamic)
  # doing this twice. just add a plot keyword to predict?
  start = self.model._get_predict_start(start, dynamic=False)
  end, out_of_sample = self.model._get_predict_end(end, dynamic=False)
 
  if out_of_sample:
   steps = out_of_sample
   fc_error = self._forecast_error(steps)
   conf_int = self._forecast_conf_int(forecast[-steps:], fc_error,
            alpha)
 
 
  if hasattr(self.data, "predict_dates"):
   from pandas import TimeSeries
   forecast = TimeSeries(forecast, index=self.data.predict_dates)
   ax = forecast.plot(ax=ax, label='forecast')
  else:
   ax.plot(forecast)
 
  x = ax.get_lines()[-1].get_xdata()
  if out_of_sample:
   label = "{0:.0%} confidence interval".format(1 - alpha)
   ax.fill_between(x[-out_of_sample:], conf_int[:, 0], conf_int[:, 1],
       color='gray', alpha=.5, label=label)
 
  if plot_insample:
   ax.plot(x[:end + 1 - start], self.model.endog[start:end+1],
     label=self.model.endog_names)
 
  ax.legend(loc='best')
 
  return fig
 plot_predict.__doc__ = _plot_predict
 
 
class ARMAResultsWrapper(wrap.ResultsWrapper):
 _attrs = {}
 _wrap_attrs = wrap.union_dicts(tsbase.TimeSeriesResultsWrapper._wrap_attrs,
         _attrs)
 _methods = {}
 _wrap_methods = wrap.union_dicts(tsbase.TimeSeriesResultsWrapper._wrap_methods,
          _methods)
wrap.populate_wrapper(ARMAResultsWrapper, ARMAResults)
 
 
class ARIMAResults(ARMAResults):
 def predict(self, start=None, end=None, exog=None, typ='linear',
    dynamic=False):
  return self.model.predict(self.params, start, end, exog, typ, dynamic)
 predict.__doc__ = _arima_results_predict
 
 def _forecast_error(self, steps):
  sigma2 = self.sigma2
  ma_rep = arma2ma(np.r_[1, -self.arparams],
       np.r_[1, self.maparams], nobs=steps)
 
  fcerr = np.sqrt(np.cumsum(cumsum_n(ma_rep, self.k_diff)**2)*sigma2)
  return fcerr
 
 def _forecast_conf_int(self, forecast, fcerr, alpha):
  const = norm.ppf(1 - alpha/2.)
  conf_int = np.c_[forecast - const*fcerr, forecast + const*fcerr]
  return conf_int
 
 def forecast(self, steps=1, exog=None, alpha=.05):
  """
  Out-of-sample forecasts
 
  Parameters
  ----------
  steps : int
   The number of out of sample forecasts from the end of the
   sample.
  exog : array
   If the model is an ARIMAX, you must provide out of sample
   values for the exogenous variables. This should not include
   the constant.
  alpha : float
   The confidence intervals for the forecasts are (1 - alpha) %
 
  Returns
  -------
  forecast : array
   Array of out of sample forecasts
  stderr : array
   Array of the standard error of the forecasts.
  conf_int : array
   2d array of the confidence interval for the forecast
 
  Notes
  -----
  Prediction is done in the levels of the original endogenous variable.
  If you would like prediction of differences in levels use `predict`.
  """
  if exog is not None:
   if self.k_exog == 1 and exog.ndim == 1:
    exog = exog[:, None]
   if exog.shape[0] != steps:
    raise ValueError("new exog needed for each step")
   # prepend in-sample exog observations
   exog = np.vstack((self.model.exog[-self.k_ar:, self.k_trend:],
        exog))
  forecast, ct = _arma_predict_out_of_sample(self.params, steps, self.resid,
            self.k_ar, self.k_ma,
            self.k_trend, self.k_exog,
            self.model.endog,
            exog, method=self.model.method)
 
  #self.constant = ct
  d = self.k_diff
  endog = self.model.data.endog[-d:]
  forecast = unintegrate(forecast, unintegrate_levels(endog, d))[d:]
 
  # get forecast errors
  fcerr = self._forecast_error(steps)
  conf_int = self._forecast_conf_int(forecast, fcerr, alpha)
  return forecast, fcerr, conf_int
 
 def plot_predict(self, start=None, end=None, exog=None, dynamic=False,
      alpha=.05, plot_insample=True, ax=None):
  from statsmodels.graphics.utils import _import_mpl, create_mpl_ax
  _ = _import_mpl()
  fig, ax = create_mpl_ax(ax)
 
  # use predict so you set dates
  forecast = self.predict(start, end, exog, 'levels', dynamic)
  # doing this twice. just add a plot keyword to predict?
  start = self.model._get_predict_start(start, dynamic=dynamic)
  end, out_of_sample = self.model._get_predict_end(end, dynamic=dynamic)
 
  if out_of_sample:
   steps = out_of_sample
   fc_error = self._forecast_error(steps)
   conf_int = self._forecast_conf_int(forecast[-steps:], fc_error,
            alpha)
 
  if hasattr(self.data, "predict_dates"):
   from pandas import TimeSeries
   forecast = TimeSeries(forecast, index=self.data.predict_dates)
   ax = forecast.plot(ax=ax, label='forecast')
  else:
   ax.plot(forecast)
 
  x = ax.get_lines()[-1].get_xdata()
  if out_of_sample:
   label = "{0:.0%} confidence interval".format(1 - alpha)
   ax.fill_between(x[-out_of_sample:], conf_int[:, 0], conf_int[:, 1],
       color='gray', alpha=.5, label=label)
 
  if plot_insample:
   import re
   k_diff = self.k_diff
   label = re.sub("D\d*\.", "", self.model.endog_names)
   levels = unintegrate(self.model.endog,
         self.model._first_unintegrate)
   ax.plot(x[:end + 1 - start],
     levels[start + k_diff:end + k_diff + 1], label=label)
 
  ax.legend(loc='best')
 
  return fig
 
 plot_predict.__doc__ = _arima_plot_predict
 
 
class ARIMAResultsWrapper(ARMAResultsWrapper):
 pass
wrap.populate_wrapper(ARIMAResultsWrapper, ARIMAResults)
 
 
if __name__ == "__main__":
 import statsmodels.api as sm
 
 # simulate arma process
 from statsmodels.tsa.arima_process import arma_generate_sample
 y = arma_generate_sample([1., -.75], [1., .25], nsample=1000)
 arma = ARMA(y)
 res = arma.fit(trend='nc', order=(1, 1))
 
 np.random.seed(12345)
 y_arma22 = arma_generate_sample([1., -.85, .35], [1, .25, -.9],
         nsample=1000)
 arma22 = ARMA(y_arma22)
 res22 = arma22.fit(trend='nc', order=(2, 2))
 
 # test CSS
 arma22_css = ARMA(y_arma22)
 res22css = arma22_css.fit(trend='nc', order=(2, 2), method='css')
 
 data = sm.datasets.sunspots.load()
 ar = ARMA(data.endog)
 resar = ar.fit(trend='nc', order=(9, 0))
 
 y_arma31 = arma_generate_sample([1, -.75, -.35, .25], [.1],
         nsample=1000)
 
 arma31css = ARMA(y_arma31)
 res31css = arma31css.fit(order=(3, 1), method="css", trend="nc",
        transparams=True)
 
 y_arma13 = arma_generate_sample([1., -.75], [1, .25, -.5, .8],
         nsample=1000)
 arma13css = ARMA(y_arma13)
 res13css = arma13css.fit(order=(1, 3), method='css', trend='nc')
 
# check css for p < q and q < p
 y_arma41 = arma_generate_sample([1., -.75, .35, .25, -.3], [1, -.35],
         nsample=1000)
 arma41css = ARMA(y_arma41)
 res41css = arma41css.fit(order=(4, 1), trend='nc', method='css')
 
 y_arma14 = arma_generate_sample([1, -.25], [1., -.75, .35, .25, -.3],
         nsample=1000)
 arma14css = ARMA(y_arma14)
 res14css = arma14css.fit(order=(4, 1), trend='nc', method='css')
 
 # ARIMA Model
 from statsmodels.datasets import webuse
 dta = webuse('wpi1')
 wpi = dta['wpi']
 
 mod = ARIMA(wpi, (1, 1, 1)).fit()

到此這篇關(guān)于如何利用python進(jìn)行時間序列分析的文章就介紹到這了,更多相關(guān)python時間序列分析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

白白操白白色在线免费视频| 亚洲高清国产拍青青草原| 春色激情网欧美成人| 亚洲一级av无码一级久久精品| 欧美在线精品一区二区三区视频| 国产亚洲四十路五十路| 青青草原色片网站在线观看| 国产精品系列在线观看一区二区 | 偷拍自拍视频图片免费| 亚洲在线观看中文字幕av| 成人在线欧美日韩国产| 人妻另类专区欧美制服| 男生用鸡操女生视频动漫| 中文字幕第一页国产在线| 免费大片在线观看视频网站| 亚洲最大免费在线观看| 天天艹天天干天天操| 极品粉嫩小泬白浆20p主播| 国产无遮挡裸体免费直播视频| 好吊视频—区二区三区| 青青草亚洲国产精品视频| 欧美综合婷婷欧美综合| 青青青爽视频在线播放| 成人性黑人一级av| www,久久久,com| 国产美女一区在线观看| 亚洲另类伦春色综合小| 91av精品视频在线| 日韩视频一区二区免费观看| 国产97在线视频观看| 激情色图一区二区三区| 欧美 亚洲 另类综合| 久久三久久三久久三久久| 天堂av狠狠操蜜桃| 午夜美女少妇福利视频| 2017亚洲男人天堂| 最新国产精品拍在线观看| 一个人免费在线观看ww视频 | 91成人精品亚洲国产| 好太好爽好想要免费| 亚洲男人的天堂a在线| 青青草成人福利电影| 激情伦理欧美日韩中文字幕 | 99热色原网这里只有精品| 91人妻精品久久久久久久网站| 日韩少妇人妻精品无码专区| 欧美日韩国产一区二区三区三州| 中文字幕在线第一页成人| 哥哥姐姐综合激情小说| 成人影片高清在线观看| 亚洲天天干 夜夜操| 亚洲区欧美区另类最新章节| 视频啪啪啪免费观看| 国产欧美精品免费观看视频| 国产精品视频一区在线播放| 在线亚洲天堂色播av电影| 男人在床上插女人视频| 9久在线视频只有精品| 国产91久久精品一区二区字幕| 精品一区二区三区午夜| 久久这里有免费精品| 国产亚洲成人免费在线观看| lutube在线成人免费看| 在线观看的黄色免费网站| av视屏免费在线播放| 黑人性生活视频免费看| 日本女大学生的黄色小视频| 女警官打开双腿沦为性奴| 中文字幕成人日韩欧美| 蜜桃色婷婷久久久福利在线| 欧美亚洲一二三区蜜臀| 免费成人av中文字幕| 日韩加勒比东京热二区| 午夜久久久久久久99| 欧美麻豆av在线播放| 亚洲欧美综合另类13p| 免费观看国产综合视频| 成人激情文学网人妻| 1000部国产精品成人观看视频| 午夜影院在线观看视频羞羞羞| 天天色天天操天天舔| 韩国黄色一级二级三级| 婷婷综合蜜桃av在线| 三级等保密码要求条款| 可以在线观看的av中文字幕| av天堂中文免费在线| 人妻熟女中文字幕aⅴ在线| 亚洲熟妇无码一区二区三区| 中文字幕最新久久久| 首之国产AV医生和护士小芳| 成年美女黄网站18禁久久| av中文字幕电影在线看| 国产精品成久久久久三级蜜臀av | 久久www免费人成一看片| 国产成人小视频在线观看无遮挡| 国产精品sm调教视频| 视频一区 视频二区 视频| 午夜美女福利小视频| 久久这里只有精彩视频免费| 日韩欧美一级aa大片| 午夜青青草原网在线观看| 91麻豆精品传媒国产黄色片| 国产精品自拍偷拍a| 爱有来生高清在线中文字幕| 美女张开腿让男生操在线看| 一区二区三区麻豆福利视频| 欧美少妇性一区二区三区| 欧美美女人体视频一区| 国产精品大陆在线2019不卡| 亚洲人成精品久久久久久久| 亚洲精品国品乱码久久久久 | 亚洲 中文字幕在线 日韩| 一区二区三区四区视频| 日本精品一区二区三区在线视频。 | 夜夜骑夜夜操夜夜奸| 老师啊太大了啊啊啊尻视频| 传媒在线播放国产精品一区| 99热这里只有精品中文| 一级a看免费观看网站| 亚洲福利精品视频在线免费观看 | 2025年人妻中文字幕乱码在线| 非洲黑人一级特黄片| 日本免费一级黄色录像| 国产aⅴ一线在线观看| 成人久久精品一区二区三区| 91精品一区二区三区站长推荐| 熟女人妻一区二区精品视频| 最近中文2019年在线看| 亚洲人妻视频在线网| 成年午夜免费无码区| 国产高清在线在线视频| 加勒比视频在线免费观看| 伊人综合免费在线视频| 韩国爱爱视频中文字幕| 精内国产乱码久久久久久| 九色精品视频在线播放| 国产熟妇人妻ⅹxxxx麻豆| 无码精品一区二区三区人| av在线免费观看亚洲天堂| 99av国产精品欲麻豆| 免费观看污视频网站| 亚洲1卡2卡三卡4卡在线观看| 91国语爽死我了不卡| 在线免费观看国产精品黄色| 综合精品久久久久97| 午夜久久久久久久99| 岛国免费大片在线观看| 中文字幕日韩精品日本| 少妇高潮无套内谢麻豆| 欧美精品伦理三区四区| www天堂在线久久| 操操网操操伊剧情片中文字幕网| 中文字幕人妻三级在线观看| 亚洲av男人的天堂你懂的| 丝袜国产专区在线观看| 18禁精品网站久久| 日韩av有码中文字幕| 岛国黄色大片在线观看| 久久久久久久久久性潮| 亚洲一区二区三区精品视频在线 | 阿v天堂2014 一区亚洲| 97人妻人人澡爽人人精品| 一级黄片久久久久久久久| 91精品资源免费观看| 日本韩国在线观看一区二区| 91九色porny蝌蚪国产成人| 亚洲国产香蕉视频在线播放| 91麻豆精品传媒国产黄色片| 2020久久躁狠狠躁夜夜躁| 男人天堂av天天操| 99热久久这里只有精品| 天天色天天爱天天爽| 天天干天天爱天天色| 亚洲中文字幕人妻一区| 国产在线自在拍91国语自产精品| 搡老熟女一区二区在线观看| 久草福利电影在线观看| 欧美中文字幕一区最新网址| 91九色porny国产蝌蚪视频| 亚洲一区二区三区精品乱码| 亚洲国产香蕉视频在线播放| 中文字幕乱码av资源| 中文字幕国产专区欧美激情| 视频一区二区综合精品| 日比视频老公慢点好舒服啊| 亚洲成av人无码不卡影片一| 久久精品国产23696| 日韩美女精品视频在线观看网站| 最新日韩av传媒在线| 亚洲人成精品久久久久久久| 中文字幕在线观看极品视频| 欧美va不卡视频在线观看| 小穴多水久久精品免费看| 日韩欧美国产一区不卡| 国产精品亚洲а∨天堂免| 97小视频人妻一区二区| 精品亚洲国产中文自在线| 欧美一级视频一区二区| 国产女人被做到高潮免费视频 | 77久久久久国产精产品| 端庄人妻堕落挣扎沉沦| 动漫黑丝美女的鸡巴| 免费在线黄色观看网站| 顶级尤物粉嫩小尤物网站| 国产91久久精品一区二区字幕| 中国把吊插入阴蒂的视频| 日本一道二三区视频久久| 香蕉av影视在线观看| 激情综合治理六月婷婷| 亚洲中文精品人人免费| 9久在线视频只有精品| 国产综合视频在线看片| 中文字幕亚洲久久久| 婷婷色中文亚洲网68| 欧美爆乳肉感大码在线观看| mm131美女午夜爽爽爽| 含骚鸡巴玩逼逼视频| 欧美男人大鸡吧插女人视频| 国产成人无码精品久久久电影| 日韩av熟妇在线观看| 99精品国产自在现线观看| 成人免费毛片aaaa| 久久久久久久久久久久久97| 99亚洲美女一区二区三区| 少妇高潮无套内谢麻豆| 99久久99久国产黄毛片| 国产精品成人xxxx| 老鸭窝在线观看一区| 久久艹在线观看视频| 国产精品视频欧美一区二区| 日本丰满熟妇BBXBBXHD| 国产精品黄大片在线播放| 早川濑里奈av黑人番号| 99的爱精品免费视频| 日本精品视频不卡一二三| 日韩欧美制服诱惑一区在线| 人妻少妇亚洲一区二区| 狍和女人的王色毛片| 77久久久久国产精产品| 人妻少妇性色欲欧美日韩| 国产成人小视频在线观看无遮挡| 99av国产精品欲麻豆| 亚洲中文字幕综合小综合| 日本午夜爽爽爽爽爽视频在线观看| 非洲黑人一级特黄片| 五月天久久激情视频| 沙月文乃人妻侵犯中文字幕在线| 夏目彩春在线中文字幕| 天天做天天爽夜夜做少妇| 1000小视频在线| 日日夜夜大香蕉伊人| 欧美日韩不卡一区不区二区| 亚洲 清纯 国产com| 国产成人精品一区在线观看| 欧美黑人巨大性xxxxx猛交| 成年美女黄网站18禁久久| 亚洲av在线观看尤物| 四川五十路熟女av| jiujiure精品视频在线| 亚洲高清一区二区三区视频在线| 美女日逼视频免费观看| 日韩一个色综合导航| 国产精品伦理片一区二区| 亚洲综合自拍视频一区| 97少妇精品在线观看| 欧美国产亚洲中英文字幕| 天天通天天透天天插| aⅴ五十路av熟女中出| 亚洲福利精品视频在线免费观看 | 亚洲va国产va欧美精品88| 国产麻豆精品人妻av| 国产又粗又硬又大视频| 日本三极片视频网站观看| 亚洲一区二区三区精品乱码| 日本xx片在线观看| 亚洲欧美激情国产综合久久久| 岛国免费大片在线观看| 超鹏97历史在线观看| 99久久激情婷婷综合五月天| 少妇被强干到高潮视频在线观看| 人妻无码色噜噜狠狠狠狠色| 国产精品久久综合久久| www久久久久久久久久久| 欧美精品亚洲精品日韩在线| 在线视频精品你懂的| 三级黄色亚洲成人av| 青青社区2国产视频| 国产精品自拍在线视频| 黄页网视频在线免费观看| 欧美日韩一区二区电影在线观看| 婷婷午夜国产精品久久久| 免费大片在线观看视频网站| 和邻居少妇愉情中文字幕| 亚洲一区二区三区精品乱码| 国产麻豆乱子伦午夜视频观看| 清纯美女在线观看国产| 国产黑丝高跟鞋视频在线播放 | 狠狠躁狠狠爱网站视频| 伊人情人综合成人久久网小说| 国产视频网站国产视频| 最后99天全集在线观看| 免费av岛国天堂网站| 色婷婷综合激情五月免费观看 | 国产视频一区二区午夜| 青草亚洲视频在线观看| 亚洲欧洲av天堂综合| 日本一本午夜在线播放| 91久久国产成人免费网站| 亚洲精品乱码久久久久久密桃明| 免费啪啪啪在线观看视频| 免费看高清av的网站| 天天干天天啪天天舔| 久久永久免费精品人妻专区| 人人爱人人妻人人澡39| 男人和女人激情视频| 欧美亚洲偷拍自拍色图| 成人激情文学网人妻| 自拍偷拍日韩欧美亚洲| 日韩亚洲高清在线观看| 99热久久这里只有精品| 精品美女在线观看视频在线观看| 熟妇一区二区三区高清版| 午夜精品九一唐人麻豆嫩草成人| av手机在线观播放网站| 天天日天天天天天天天天天天| 在线制服丝袜中文字幕| 午夜的视频在线观看| 男人的天堂在线黄色| 国产自拍在线观看成人| 午夜91一区二区三区| 国产日韩av一区二区在线| 超碰中文字幕免费观看| 男女第一次视频在线观看| 手机看片福利盒子日韩在线播放| 日本性感美女视频网站| 亚洲欧美人精品高清| 岛国青草视频在线观看| 欧美爆乳肉感大码在线观看| 18禁美女羞羞免费网站| 色婷婷综合激情五月免费观看| 成人伊人精品色xxxx视频| 插小穴高清无码中文字幕| 男生用鸡操女生视频动漫 | 一个人免费在线观看ww视频 | 精内国产乱码久久久久久| 美日韩在线视频免费看| 91福利在线视频免费观看| 久久久久91精品推荐99| 欧美成人精品在线观看| 国产黄色大片在线免费播放| 动漫美女的小穴视频| 大陆av手机在线观看| 午夜美女福利小视频| 中文字幕,亚洲人妻| 日美女屁股黄邑视频| 在线免费观看日本伦理| 在线免费91激情四射 | 天天日天天做天天日天天做| 欧美交性又色又爽又黄麻豆| 亚洲国产美女一区二区三区软件| 欧美国产亚洲中英文字幕| 亚洲一区二区久久久人妻| 国产亚洲欧美视频网站| 中文字幕视频一区二区在线观看| 国产成人精品亚洲男人的天堂| 国产日韩av一区二区在线| 高清成人av一区三区| 男女啪啪啪啪啪的网站| 午夜91一区二区三区| 淫秽激情视频免费观看| 欧美另类重口味极品在线观看| 91人妻精品一区二区在线看| 国产一区二区火爆视频| 福利视频广场一区二区| 欧美80老妇人性视频| 日本av熟女在线视频| 黑人3p华裔熟女普通话| 男人操女人逼逼视频网站| 久久一区二区三区人妻欧美| 中文字幕日韩91人妻在线| 成人亚洲国产综合精品| www,久久久,com| 国产午夜男女爽爽爽爽爽视频| 啊啊好慢点插舔我逼啊啊啊视频| av网址在线播放大全| 大鸡巴插入美女黑黑的阴毛| 在线新三级黄伊人网| 在线观看视频 你懂的| 中文字幕奴隷色的舞台50| 国产露脸对白在线观看| 香蕉av影视在线观看| 日本特级片中文字幕| 性感美女诱惑福利视频| 日韩av有码一区二区三区4| 午夜毛片不卡在线看| 久草视频在线一区二区三区资源站 | 亚洲区欧美区另类最新章节| 亚洲综合另类精品小说| 十八禁在线观看地址免费| 大陆胖女人与丈夫操b国语高清 | 亚洲精品高清自拍av | 国产品国产三级国产普通话三级| 狍和女人的王色毛片| 超级福利视频在线观看| 2022天天干天天操| 日本成人一区二区不卡免费在线| 色偷偷伊人大杳蕉综合网| 亚洲av人人澡人人爽人人爱| 国产白袜脚足J棉袜在线观看| 成年人黄视频在线观看| 抽查舔水白紧大视频| 好了av中文字幕在线| 亚洲一区二区激情在线| huangse网站在线观看| 国产视频在线视频播放| 亚洲一区二区人妻av| 免费观看丰满少妇做受| 日本少妇在线视频大香蕉在线观看| 国产精品一区二区久久久av| 91麻豆精品久久久久| 日本特级片中文字幕| 日本高清撒尿pissing| 久久h视频在线观看| 97a片免费在线观看| 日本性感美女写真视频| 午夜久久香蕉电影网| 亚洲精品国产久久久久久| 精品一区二区三区在线观看| 99热国产精品666| 超鹏97历史在线观看| 日韩加勒比东京热二区| 精品美女福利在线观看| 人妻熟女中文字幕aⅴ在线| 日韩成人性色生活片| 熟女人妻在线中出观看完整版| 91精品国产高清自在线看香蕉网 | 天美传媒mv视频在线观看| 社区自拍揄拍尻屁你懂的 | 久久国产精品精品美女| 大香蕉伊人国产在线| 亚欧在线视频你懂的| 亚洲男人让女人爽的视频| 久草电影免费在线观看| 大胸性感美女羞爽操逼毛片| 中文字幕人妻av在线观看| 国产乱子伦精品视频潮优女| 人人妻人人澡欧美91精品| 天堂资源网av中文字幕| 免费国产性生活视频| 人妻素人精油按摩中出| 国产一区二区欧美三区| 亚洲激情,偷拍视频| 亚洲图片欧美校园春色| 福利一二三在线视频观看| 亚洲 中文字幕在线 日韩| av线天堂在线观看| sspd152中文字幕在线| 大香蕉大香蕉在线看| 国产av一区2区3区| 五十路人妻熟女av一区二区| 家庭女教师中文字幕在线播放| 日辽宁老肥女在线观看视频| 亚洲男人在线天堂网| 国产精品sm调教视频| 国产熟妇一区二区三区av| a v欧美一区=区三区| 国语对白xxxx乱大交| 国产av国片精品一区二区| 91亚洲国产成人精品性色| 91人妻精品一区二区在线看| 99人妻视频免费在线| 亚洲国产最大av综合| 888欧美视频在线| 99热99这里精品6国产| 好了av中文字幕在线| 亚洲人妻视频在线网| 69精品视频一区二区在线观看| 日本高清在线不卡一区二区| 1区2区3区4区视频在线观看| 亚洲日本一区二区三区| 日韩精品中文字幕在线| 天堂av中文在线最新版| 亚洲另类综合一区小说| 中文字幕,亚洲人妻| 黄色片黄色片wyaa| 66久久久久久久久久久| 高潮喷水在线视频观看| 色哟哟国产精品入口| 亚洲 人妻 激情 中文| 涩涩的视频在线观看视频| 日本黄在免费看视频| 国产成人综合一区2区| 91色九色porny| 日本黄色特一级视频| 成人激情文学网人妻| 久久农村老妇乱69系列| 欧美交性又色又爽又黄麻豆| 国产三级片久久久久久久| 88成人免费av网站| 1769国产精品视频免费观看| 综合激情网激情五月天| 精品一线二线三线日本| 91大神福利视频网| 精品91自产拍在线观看一区| 久久久久五月天丁香社区| 老司机欧美视频在线看| 中文字幕人妻熟女在线电影| 午夜福利资源综合激情午夜福利资 | 又色又爽又黄的美女裸体| lutube在线成人免费看| 美女操逼免费短视频下载链接| 亚洲福利午夜久久久精品电影网| 亚洲欧美激情国产综合久久久| 91色九色porny| 欧美老鸡巴日小嫩逼| 视频二区在线视频观看| 亚洲国产成人在线一区| 免费男阳茎伸入女阳道视频| 在线视频国产欧美日韩| 亚洲国际青青操综合网站| 91精品免费久久久久久| 人人妻人人爽人人添夜| 婷婷色中文亚洲网68| 亚洲人妻国产精品综合| 性生活第二下硬不起来| 久久久极品久久蜜桃| 亚洲一区二区三区uij| 水蜜桃一区二区三区在线观看视频| 精品少妇一二三视频在线| 九色porny九色9l自拍视频| 日本特级片中文字幕| 国产精品入口麻豆啊啊啊| av一本二本在线观看| 男人的天堂在线黄色| 一区国内二区日韩三区欧美| 女同久久精品秋霞网| 天天操天天爽天天干| 久久久久五月天丁香社区| 日本熟女50视频免费| 午夜场射精嗯嗯啊啊视频| 一本久久精品一区二区| 国产中文精品在线观看| 欧美成人精品欧美一级黄色| 亚洲 中文 自拍 无码| 无码国产精品一区二区高潮久久4| 久久久久久久亚洲午夜综合福利| 最新中文字幕免费视频| 精品老妇女久久9g国产| 无码日韩人妻精品久久| 亚洲福利天堂久久久久久| 黑人巨大的吊bdsm| 亚洲成人激情视频免费观看了 | 亚洲精品欧美日韩在线播放| 亚洲高清免费在线观看视频| 国产熟妇乱妇熟色T区| 69精品视频一区二区在线观看| 岛国黄色大片在线观看| 国产在线观看免费人成短视频| 91人妻精品久久久久久久网站| 日本午夜爽爽爽爽爽视频在线观看| 中文字幕视频一区二区在线观看| 国产精品亚洲а∨天堂免| 免费看国产又粗又猛又爽又黄视频| 5528327男人天堂| 亚洲成人情色电影在线观看| 亚洲最大黄 嗯色 操 啊| 99精品国产aⅴ在线观看| 欧美第一页在线免费观看视频| 国产熟妇人妻ⅹxxxx麻豆| 青青草人人妻人人妻| 亚洲国产成人最新资源| 婷婷色国产黑丝少妇勾搭AV| 天天操夜夜操天天操天天操| 午夜91一区二区三区| 老司机午夜精品视频资源| 91久久人澡人人添人人爽乱| 大肉大捧一进一出好爽在线视频| 中文人妻AV久久人妻水| 夜色撩人久久7777| 人妻熟女在线一区二区| 天天操夜夜骑日日摸| 国产黄色片在线收看| 免费av岛国天堂网站| 日本美女成人在线视频| 亚洲精品成人网久久久久久小说| 青青在线视频性感少妇和隔壁黑丝 | 亚洲的电影一区二区三区| 国产乱子伦精品视频潮优女| 国产精品国产精品一区二区| 日韩美女福利视频网| 在线观看视频 你懂的| 中国熟女@视频91| av在线免费观看亚洲天堂| 天天干夜夜操啊啊啊| 91亚洲精品干熟女蜜桃频道| 在线免费观看靠比视频的网站| 国产一区二区在线欧美| 天天干夜夜操天天舔| 精品av国产一区二区三区四区| 天天射,天天操,天天说| 大学生A级毛片免费视频| 经典av尤物一区二区| 在线免费观看黄页视频| 久久机热/这里只有| 91精品国产91青青碰| 干逼又爽又黄又免费的视频| 好太好爽好想要免费| 高潮视频在线快速观看国家快速 | 午夜婷婷在线观看视频| 中国视频一区二区三区| 国产刺激激情美女网站| 一级黄片久久久久久久久| 欧美另类z0z变态| 性感美女诱惑福利视频| aⅴ五十路av熟女中出| 欧美xxx成人在线| 一区二区三区日本伦理| 国产精品熟女久久久久浪潮| 天堂av狠狠操蜜桃| 99热久久极品热亚洲| 亚洲天天干 夜夜操| 欧美亚洲中文字幕一区二区三区 | 欧美日本在线视频一区| 青青青视频手机在线观看| 亚洲偷自拍高清视频| av大全在线播放免费| 绯色av蜜臀vs少妇| 亚洲图片偷拍自拍区| 欧美国品一二三产区区别| 福利视频网久久91| 偷拍自拍视频图片免费| 国产一区自拍黄视频免费观看| 成人亚洲国产综合精品| 涩涩的视频在线观看视频| 亚洲免费在线视频网站| 日本女人一级免费片| 国产亚洲欧美45p| 欧美香蕉人妻精品一区二区| 超碰97人人做人人爱| www久久久久久久久久久| 国产91精品拍在线观看| 老鸭窝日韩精品视频观看| 绯色av蜜臀vs少妇| 成熟丰满熟妇高潮xx×xx| 国产一区二区久久久裸臀| 欲乱人妻少妇在线视频裸| 久久久久久性虐视频| 亚洲区欧美区另类最新章节| 77久久久久国产精产品| 香蕉aⅴ一区二区三区| 欧美精产国品一二三产品区别大吗| av网站色偷偷婷婷网男人的天堂| 婷婷色国产黑丝少妇勾搭AV | 中文字幕视频一区二区在线观看| 色综合久久五月色婷婷综合| 女蜜桃臀紧身瑜伽裤| 青青草在观免费国产精品| 天天日天天舔天天射进去| 91精品综合久久久久3d动漫| 欧美视频综合第一页| 美女张开腿让男生操在线看| 婷婷激情四射在线观看视频| 亚洲熟女女同志女同| 国产免费av一区二区凹凸四季| 自拍偷拍一区二区三区图片| 天堂v男人视频在线观看| 男生用鸡操女生视频动漫| 成人精品视频99第一页| 岛国一区二区三区视频在线| 在线观看亚洲人成免费网址| 国产精品久久综合久久| 91麻豆精品久久久久| 成人国产影院在线观看| 护士小嫩嫩又紧又爽20p| 国产九色91在线视频| 特一级特级黄色网片| 搞黄色在线免费观看| 91www一区二区三区| 91九色porny国产在线| 97少妇精品在线观看| 久久99久久99精品影院| 欧美综合婷婷欧美综合| 久久久久久99国产精品| 欧美男人大鸡吧插女人视频| 亚洲 欧美 精品 激情 偷拍| av乱码一区二区三区| 19一区二区三区在线播放| 午夜久久香蕉电影网| asmr福利视频在线观看| 伊人成人在线综合网| 亚洲av成人免费网站| 天天操天天污天天射| 久久久精品精品视频视频| 北条麻妃高跟丝袜啪啪| 欧美精品伦理三区四区| 亚洲 清纯 国产com| 搡老熟女一区二区在线观看| 美女大bxxxx内射| 日韩无码国产精品强奸乱伦| 久久久精品精品视频视频| 亚洲一区二区三区久久午夜 | 亚洲av日韩av网站| av无限看熟女人妻另类av| 国产+亚洲+欧美+另类| 美女福利视频网址导航| 91亚洲手机在线视频播放| 狠狠地躁夜夜躁日日躁| 人人妻人人澡人人爽人人dvl| 在线视频这里只有精品自拍| 免费费一级特黄真人片| 久草视频中文字幕在线观看| 天天日天天干天天插舔舔| 少妇与子乱在线观看| 十八禁在线观看地址免费| 精品高跟鞋丝袜一区二区| 午夜精品一区二区三区更新| 午夜极品美女福利视频| 蜜桃色婷婷久久久福利在线| 88成人免费av网站| 91免费黄片可看视频| eeuss鲁片一区二区三区| 青青青青青免费视频| 亚洲一级av无码一级久久精品| 91成人在线观看免费视频| 日本一二三中文字幕| 人妻丝袜精品中文字幕| 在线观看国产网站资源| 999九九久久久精品| 日韩精品中文字幕播放| 午夜福利人人妻人人澡人人爽| 91国偷自产一区二区三区精品| 欧美va不卡视频在线观看| 久久久精品精品视频视频| 91老师蜜桃臀大屁股| 中出中文字幕在线观看| 蜜桃专区一区二区在线观看| 在线观看视频污一区| 欧美精品 日韩国产| 国产一线二线三线的区别在哪| 欧美激情精品在线观看| 和邻居少妇愉情中文字幕| 日韩中文字幕福利av| 久久久久久九九99精品| 亚洲Av无码国产综合色区| 亚洲精品麻豆免费在线观看| 91天堂天天日天天操| 欧美亚洲免费视频观看| 黄色片一级美女黄色片| 2018最新中文字幕在线观看| 沈阳熟妇28厘米大战黑人| 九九视频在线精品播放| 成年人免费看在线视频| 亚洲av日韩av第一区二区三区| 小穴多水久久精品免费看| 老司机深夜免费福利视频在线观看| 自拍 日韩 欧美激情| 亚洲精品ww久久久久久| 成人久久精品一区二区三区| 免费观看成年人视频在线观看| 加勒比视频在线免费观看| 99热碰碰热精品a中文| 日韩精品中文字幕在线| 不卡精品视频在线观看| 桃色视频在线观看一区二区| 插小穴高清无码中文字幕| 日韩加勒比东京热二区| 99精品亚洲av无码国产另类| 在线免费观看欧美小视频| chinese国产盗摄一区二区| 欧美特色aaa大片| 午夜极品美女福利视频| 亚洲 清纯 国产com| av天堂资源最新版在线看| 天天操天天射天天操天天天| 午夜精品亚洲精品五月色| 白白操白白色在线免费视频 | 中文字幕亚洲久久久| 国产又粗又硬又猛的毛片视频| 久碰精品少妇中文字幕av | 日韩中文字幕在线播放第二页| 任你操任你干精品在线视频| 在线免费观看国产精品黄色| 在线免费观看亚洲精品电影| 天天色天天操天天透| 中文字幕在线免费第一页| 97资源人妻免费在线视频| 岛国一区二区三区视频在线| 亚洲av天堂在线播放| 国产精品系列在线观看一区二区| 91麻豆精品久久久久| 天天日天天鲁天天操| 岛国黄色大片在线观看| 男人操女人逼逼视频网站| 午夜蜜桃一区二区三区| 久草视频在线一区二区三区资源站| 国产麻豆国语对白露脸剧情| 水蜜桃一区二区三区在线观看视频| 蜜臀av久久久久久久| 伊人综合免费在线视频| www日韩a级s片av| 高潮视频在线快速观看国家快速| 91综合久久亚洲综合| 天天操天天爽天天干| 国产使劲操在线播放| 青青草在观免费国产精品| 91色老99久久九九爱精品| 青青青青青免费视频| 欧美伊人久久大香线蕉综合| 欧美日韩人妻久久精品高清国产 | 亚洲高清自偷揄拍自拍| 丝袜肉丝一区二区三区四区在线| lutube在线成人免费看| 亚洲少妇高潮免费观看| 亚洲美女美妇久久字幕组| 国产精品视频男人的天堂| nagger可以指黑人吗| 男人天堂av天天操| 国产超码片内射在线| 欧美老鸡巴日小嫩逼| 骚货自慰被发现爆操| 欧美男人大鸡吧插女人视频| 天天插天天色天天日| 亚洲伊人色一综合网| 国产日本精品久久久久久久| 国产乱子伦精品视频潮优女| 久草电影免费在线观看| 75国产综合在线视频| 蜜臀av久久久久久久| 激情综合治理六月婷婷| 91老师蜜桃臀大屁股| 亚洲粉嫩av一区二区三区| 国产黑丝高跟鞋视频在线播放| 男女啪啪视频免费在线观看| 香蕉91一区二区三区| 2020av天堂网在线观看| 鸡巴操逼一级黄色气| 久久机热/这里只有| 日本xx片在线观看| 硬鸡巴动态操女人逼视频| 蜜臀av久久久久久久| 少妇一区二区三区久久久| 午夜久久久久久久99| 老熟妇凹凸淫老妇女av在线观看| 97色视频在线观看| 亚洲精品中文字幕下载| 久草视频 久草视频2| 日韩精品中文字幕在线| 国产精品福利小视频a| 大香蕉伊人国产在线| 中文字幕第三十八页久久| 中文字幕人妻熟女在线电影| 国产精品入口麻豆啊啊啊| av视网站在线观看| 9色在线视频免费观看| caoporm超碰国产| 精品国产午夜视频一区二区| 夏目彩春在线中文字幕| 亚洲中文字幕综合小综合| 特一级特级黄色网片| 3337p日本欧洲大胆色噜噜| 极品性荡少妇一区二区色欲| 韩国爱爱视频中文字幕| 国产福利小视频二区| 精品区一区二区三区四区人妻 | 经典av尤物一区二区| 中文字幕在线观看国产片| av在线观看网址av| 国产不卡av在线免费| 五十路熟女人妻一区二| 欧美偷拍亚洲一区二区| 亚洲中文精品人人免费| 91精品一区二区三区站长推荐| aⅴ五十路av熟女中出| 成人国产影院在线观看| 亚洲人妻av毛片在线| 2019av在线视频| 韩国三级aaaaa高清视频| 国产一区二区欧美三区 | 国产97视频在线精品| 97精品人妻一区二区三区精品| 黄色成年网站午夜在线观看| 国产亚洲天堂天天一区| 97小视频人妻一区二区| 天天日天天透天天操| 青青青激情在线观看视频| 嫩草aⅴ一区二区三区| 亚洲精品国偷自产在线观看蜜桃| 制丝袜业一区二区三区| 中国视频一区二区三区| 熟女少妇激情五十路| 日韩二区视频一线天婷婷五| 18禁美女羞羞免费网站| 成年人该看的视频黄免费| 2021天天色天天干| 在线制服丝袜中文字幕| 这里有精品成人国产99| 中文字幕乱码人妻电影| 亚洲av自拍天堂网| 人妻少妇一区二区三区蜜桃| 人妻少妇av在线观看| 99国内小视频在现欢看| 亚洲成人国产av在线| 99精品国产aⅴ在线观看| 亚洲av色香蕉一区二区三区| 日本av高清免费网站| 日韩加勒比东京热二区| 日韩欧美国产一区不卡| 伊拉克及约旦宣布关闭领空| 青娱乐最新视频在线| 自拍偷拍亚洲欧美在线视频| 四川乱子伦视频国产vip| 中文字母永久播放1区2区3区| 扒开腿挺进肉嫩小18禁视频| 黄片色呦呦视频免费看| 视频 国产 精品 熟女 | 天天做天天干天天舔| 国产真实灌醉下药美女av福利| 国产精品国产三级麻豆| 偷拍自拍视频图片免费| 大香蕉大香蕉在线有码 av| 91色九色porny| 91老熟女连续高潮对白| 亚洲男人让女人爽的视频| 天天爽夜夜爽人人爽QC| 91极品大一女神正在播放| 中文字幕日本人妻中出| 青娱乐最新视频在线| 天天操天天插天天色| 中文字幕免费福利视频6| 男生舔女生逼逼视频| av视网站在线观看| 亚洲熟女女同志女同| 中文字幕在线视频一区二区三区| 国产精品入口麻豆啊啊啊| 亚洲免费va在线播放| 欧美日本在线视频一区| av在线播放国产不卡| 色哟哟国产精品入口| 国产三级影院在线观看| 色吉吉影音天天干天天操| 极品丝袜一区二区三区| 国产自拍在线观看成人| 国产性色生活片毛片春晓精品| 韩国三级aaaaa高清视频| asmr福利视频在线观看| 欧美日本在线观看一区二区| 在线免费观看日本片| 亚洲av自拍偷拍综合| 亚洲精品国产久久久久久| 日韩特级黄片高清在线看| 亚洲中文字字幕乱码| 精品人人人妻人人玩日产欧| 日韩午夜福利精品试看| 一个人免费在线观看ww视频| 三级等保密码要求条款| 91久久国产成人免费网站| 80电影天堂网官网| 93视频一区二区三区| 中文乱理伦片在线观看| 二区中出在线观看老师| 绝色少妇高潮3在线观看| 一区二区三区四区视频在线播放| 91超碰青青中文字幕| 日韩av中文在线免费观看| 日本精品一区二区三区在线视频。| 黄色视频成年人免费观看| 日日操综合成人av| 黄色大片免费观看网站| 男人的网址你懂的亚洲欧洲av| 亚洲精品ww久久久久久| av天堂资源最新版在线看| 欧美一区二区三区四区性视频| 91亚洲精品干熟女蜜桃频道 | 国产精品国产三级国产午| 人妻丝袜榨强中文字幕| 日本美女性生活一级片| 国产精品欧美日韩区二区| 青青伊人一精品视频| 国产精品成人xxxx| 综合激情网激情五月五月婷婷| 日本最新一二三区不卡在线| 黑人变态深video特大巨大| 一区二区三区欧美日韩高清播放| 久久午夜夜伦痒痒想咳嗽P| 宅男噜噜噜666免费观看| 91色老99久久九九爱精品| 免费大片在线观看视频网站| 午夜福利资源综合激情午夜福利资 | 好吊视频—区二区三区| 大陆精品一区二区三区久久| 中文字幕一区二区三区人妻大片 | 中文字幕在线免费第一页| 中文字幕最新久久久| 在线视频这里只有精品自拍| 免费看国产又粗又猛又爽又黄视频| 亚洲av人人澡人人爽人人爱| 91av精品视频在线| 少妇露脸深喉口爆吞精| 可以免费看的www视频你懂的| 韩国男女黄色在线观看| 男女啪啪啪啪啪的网站| 亚洲欧美综合在线探花| 人人妻人人澡人人爽人人dvl| 99精品视频之69精品视频 | 国产麻豆剧果冻传媒app| 国产日韩欧美视频在线导航| 日本高清撒尿pissing| 91chinese在线视频| 亚洲一区二区三区久久午夜| 中文字幕熟女人妻久久久| www骚国产精品视频| 中文字幕在线一区精品| 精内国产乱码久久久久久| 天天干天天日天天谢综合156| 免费国产性生活视频| 精品人妻伦一二三区久| 77久久久久国产精产品| 97成人免费在线观看网站| 国产精品久久久久久美女校花| 538精品在线观看视频| 一区二区三区四区中文| 人妻最新视频在线免费观看| 日本免费一级黄色录像| 久久永久免费精品人妻专区 | 97青青青手机在线视频| 97瑟瑟超碰在线香蕉| 亚洲欧美激情国产综合久久久| 99久久99一区二区三区| 亚洲成人线上免费视频观看| 亚洲丝袜老师诱惑在线观看| 97小视频人妻一区二区| 狠狠的往里顶撞h百合| 久青青草视频手机在线免费观看| 绝色少妇高潮3在线观看| 久久久久久九九99精品| 欧美日本在线观看一区二区 | 天天日天天干天天要| 亚洲av可乐操首页| 无忧传媒在线观看视频| 天天操天天干天天插| 很黄很污很色的午夜网站在线观看 | 午夜精品亚洲精品五月色| 亚洲成人av在线一区二区| 欧美专区第八页一区在线播放| 亚洲熟女久久久36d| 国产成人自拍视频播放| 久久久久久久久久性潮| 夜色17s精品人妻熟女| 国产三级影院在线观看| 91一区精品在线观看| 一区二区三区四区视频在线播放| 欧亚日韩一区二区三区观看视频| 青青尤物在线观看视频网站| 日韩欧美高清免费在线| 宅男噜噜噜666免费观看| AV天堂一区二区免费试看| 偷拍自拍 中文字幕| 又大又湿又爽又紧A视频| 国产精品自拍偷拍a| 欧美精品伦理三区四区| 亚洲一区二区三区偷拍女厕91| 欧美老鸡巴日小嫩逼| 国产成人自拍视频在线免费观看| 中文字幕人妻被公上司喝醉在线| 又粗又硬又猛又黄免费30| 国产精品一二三不卡带免费视频| 亚洲av琪琪男人的天堂| 操日韩美女视频在线免费看| 国产成人自拍视频在线免费观看| 欧美天堂av无线av欧美| 99久久激情婷婷综合五月天| brazzers欧熟精品系列| 91九色porny蝌蚪国产成人| 亚洲麻豆一区二区三区| 91成人在线观看免费视频| 国产麻豆剧果冻传媒app| 美女大bxxxx内射| 成人福利视频免费在线| 亚洲精品一区二区三区老狼| 亚洲午夜电影在线观看| 中文字幕第一页国产在线| 黄色资源视频网站日韩| 中文字幕中文字幕人妻| 在线观看视频网站麻豆| 成熟丰满熟妇高潮xx×xx| 在线观看成人国产电影| 亚欧在线视频你懂的| 一区二区三区综合视频| 91九色porny国产在线| 一区二区三区精品日本| 中文字幕人妻被公上司喝醉在线| 538精品在线观看视频| gogo国模私拍视频| av网址在线播放大全| 夏目彩春在线中文字幕| 国产视频一区二区午夜| 夜色撩人久久7777| 2021久久免费视频| 国产大学生援交正在播放| 夜色撩人久久7777| 美日韩在线视频免费看| tube69日本少妇| 伊人网中文字幕在线视频| 在线观看欧美黄片一区二区三区| 四川乱子伦视频国产vip| av久久精品北条麻妃av观看| 亚洲av色图18p| 岛国毛片视频免费在线观看| 午夜极品美女福利视频| 人妻丝袜精品中文字幕| 日本一道二三区视频久久| 少妇高潮一区二区三区| 亚洲午夜福利中文乱码字幕| 91免费观看国产免费| 99亚洲美女一区二区三区| 女同性ⅹxx女同hd| 日日操夜夜撸天天干| 国产精品国产精品一区二区| av在线播放国产不卡| 五月天中文字幕内射| 免费在线观看视频啪啪| aiss午夜免费视频| 亚洲欧美福利在线观看| 蝴蝶伊人久久中文娱乐网| 欧美一级色视频美日韩| 欧美色婷婷综合在线| 日韩欧美亚洲熟女人妻| 93视频一区二区三区| 日韩熟女系列一区二区三区| 黄色中文字幕在线播放| 亚洲卡1卡2卡三卡四老狼| 一二三中文乱码亚洲乱码one| 少妇一区二区三区久久久| 国产极品美女久久久久久| 欧美日韩一区二区电影在线观看| 日本最新一二三区不卡在线| 美女张开两腿让男人桶av| 精品一线二线三线日本| 在线免费观看日本伦理| 春色激情网欧美成人| 日韩a级黄色小视频| 久久香蕉国产免费天天| 少妇高潮无套内谢麻豆| 水蜜桃国产一区二区三区| 激情图片日韩欧美人妻| 国产视频一区在线观看| 99人妻视频免费在线| 中文字幕av第1页中文字幕| 自拍偷拍vs一区二区三区| 亚洲区欧美区另类最新章节| 欧美在线精品一区二区三区视频| 激情人妻校园春色亚洲欧美| 国产午夜男女爽爽爽爽爽视频| 蝴蝶伊人久久中文娱乐网| 91成人在线观看免费视频| 黑人大几巴狂插日本少妇| 亚洲成人熟妇一区二区三区 | 日韩欧美亚洲熟女人妻| 换爱交换乱高清大片| 亚洲精品亚洲人成在线导航| 78色精品一区二区三区| 亚洲国产欧美一区二区三区久久| 国产精品自拍在线视频| 亚洲一级美女啪啪啪| 亚洲最大黄了色网站| 国产av福利网址大全| 91精品综合久久久久3d动漫| 色花堂在线av中文字幕九九| 欧美偷拍亚洲一区二区| 日本性感美女三级视频| 无码中文字幕波多野不卡| 午夜精品福利一区二区三区p| 2021国产一区二区| 91色老99久久九九爱精品| 狠狠躁夜夜躁人人爽天天久天啪| 男人操女人逼逼视频网站| 黄色三级网站免费下载| 98视频精品在线观看| 日本免费一级黄色录像| 午夜福利资源综合激情午夜福利资| 日美女屁股黄邑视频| 岛国免费大片在线观看| 亚洲欧美在线视频第一页| 美女在线观看日本亚洲一区| 老熟妇凹凸淫老妇女av在线观看| 自拍偷拍一区二区三区图片| 熟女人妻三十路四十路人妻斩| 人妻少妇中文有码精品| 天美传媒mv视频在线观看| 91国产在线视频免费观看| 色呦呦视频在线观看视频| 91久久精品色伊人6882| 亚洲伊人av天堂有码在线| 国产使劲操在线播放| 午夜激情久久不卡一区二区 | 亚洲成av人无码不卡影片一| 宅男噜噜噜666国产| 国产揄拍高清国内精品对白| 亚洲av日韩高清hd| 99精品免费久久久久久久久a| 中文字幕第一页国产在线| 日本韩国免费一区二区三区视频 | 在线成人日韩av电影| 在线观看视频网站麻豆| mm131美女午夜爽爽爽| 伊人开心婷婷国产av| 熟女国产一区亚洲中文字幕| avjpm亚洲伊人久久| 日韩欧美一级aa大片| 婷婷综合蜜桃av在线| 日韩特级黄片高清在线看| 97精品成人一区二区三区| 国产精品国产三级麻豆| 激情色图一区二区三区| 亚洲av日韩av网站| 视频 一区二区在线观看| 亚洲精品在线资源站| 亚洲免费国产在线日韩| 欧美性感尤物人妻在线免费看| 国产精品自偷自拍啪啪啪| 免费手机黄页网址大全| 大鸡巴操b视频在线| 成人综合亚洲欧美一区| 天天干夜夜操天天舔| 亚欧在线视频你懂的| 馒头大胆亚洲一区二区| 国产精品3p和黑人大战| 亚洲av无女神免非久久| 97人妻色免费视频| 亚洲的电影一区二区三区| 青青青青在线视频免费观看| 中文字幕综合一区二区| 国产超码片内射在线| 国产一区二区在线欧美| 丝袜长腿第一页在线| 91亚洲精品干熟女蜜桃频道| 一区二区三区综合视频| 18禁美女无遮挡免费| 国产在线观看免费人成短视频| 精品首页在线观看视频| 九色精品视频在线播放| 国产精品福利小视频a| 国产精选一区在线播放| 亚洲高清视频在线不卡| 久久尻中国美女视频| 国产一区av澳门在线观看| 国产成人一区二区三区电影网站| 国产日韩精品电影7777| 伊人精品福利综合导航| 日韩欧美一级aa大片| 国产麻豆国语对白露脸剧情 | 99热99这里精品6国产| 可以在线观看的av中文字幕| 丰满熟女午夜福利视频| 久久热久久视频在线观看| 无码精品一区二区三区人| 93精品视频在线观看| 黄片大全在线观看观看| 福利在线视频网址导航| 国产女人被做到高潮免费视频| 黄色大片免费观看网站| 91片黄在线观看喷潮| 久久久人妻一区二区| 亚洲av男人的天堂你懂的| 大鸡吧插逼逼视频免费看| 影音先锋女人av噜噜色| 国产自拍黄片在线观看| 97人妻夜夜爽二区欧美极品| 亚洲av成人网在线观看| 亚洲欧美色一区二区| 99精品视频在线观看婷婷| 夜夜骑夜夜操夜夜奸| 色秀欧美视频第一页| 九色porny九色9l自拍视频| 经典亚洲伊人第一页| 大鸡巴插入美女黑黑的阴毛| 久草福利电影在线观看| 日韩av中文在线免费观看| 日噜噜噜夜夜噜噜噜天天噜噜噜 | 在线观看成人国产电影| 日本一二三区不卡无| 一区二区三区蜜臀在线| 熟女俱乐部一二三区| 日视频免费在线观看| 2019av在线视频| 欧美美女人体视频一区| 91精品综合久久久久3d动漫| 2022国产综合在线干| 成人av天堂丝袜在线观看| 在线免费观看av日韩| 早川濑里奈av黑人番号| 久久这里只有精品热视频 | 国产精品三级三级三级| 色秀欧美视频第一页| 扒开腿挺进肉嫩小18禁视频| 少妇人妻二三区视频| 亚洲一区制服丝袜美腿| 色狠狠av线不卡香蕉一区二区| 天天日天天鲁天天操| 最新欧美一二三视频| 欧美黄色录像免费看的| 一级a看免费观看网站| 日韩亚国产欧美三级涩爱| 91大屁股国产一区二区| 亚洲国产最大av综合| 少妇被强干到高潮视频在线观看| 日日爽天天干夜夜操| 国产精品自拍偷拍a| 黑人借宿ntr人妻的沦陷2| 日韩欧美国产一区不卡| 日本18禁久久久久久| 亚洲激情唯美亚洲激情图片| 欧美日韩不卡一区不区二区| 青青伊人一精品视频| 中文字幕最新久久久| 国产欧美精品一区二区高清| 欧美一级视频一区二区| 久久h视频在线观看| 免费在线福利小视频| 班长撕开乳罩揉我胸好爽| www天堂在线久久| 国产精品成久久久久三级蜜臀av| 99久久激情婷婷综合五月天| 毛茸茸的大外阴中国视频| 日韩精品啪啪视频一道免费| 中文字幕av熟女人妻| 成人24小时免费视频| 免费啪啪啪在线观看视频| 中国黄片视频一区91| 人妻丝袜诱惑我操她视频| 在线观看免费视频网| 免费在线播放a级片| 骚逼被大屌狂草视频免费看| 成人av中文字幕一区| 青青色国产视频在线| 欧美日韩情色在线观看| 青青青aaaa免费| 99精品一区二区三区的区| 亚洲1区2区3区精华液| 欧美成人综合视频一区二区 | 国产女孩喷水在线观看| 丝袜美腿欧美另类 中文字幕| 国产精品国色综合久久| 91精品国产综合久久久蜜| 午夜精品久久久久麻豆影视| 国内资源最丰富的网站| 人妻最新视频在线免费观看| 福利午夜视频在线合集| 曰本无码人妻丰满熟妇啪啪| 国产超码片内射在线| 换爱交换乱高清大片| 老司机福利精品视频在线| 黄色视频在线观看高清无码 | 超级福利视频在线观看| av中文字幕国产在线观看| 男人天堂色男人av| 中文字幕 码 在线视频| 国产精品福利小视频a| 日曰摸日日碰夜夜爽歪歪| mm131美女午夜爽爽爽| 青娱乐极品视频青青草| 久草免费人妻视频在线| 天天日天天干天天搡| 日本女大学生的黄色小视频| 国产日本精品久久久久久久| 久草电影免费在线观看| 黄色大片免费观看网站| 日本少妇的秘密免费视频| 免费av岛国天堂网站| 亚洲图库另类图片区| 日韩欧美在线观看不卡一区二区 | 爆乳骚货内射骚货内射在线| 亚洲另类在线免费观看| 在线观看一区二区三级| 免费费一级特黄真人片| 亚洲高清免费在线观看视频| av在线观看网址av| 中国产一级黄片免费视频播放| 免费观看成年人视频在线观看| 人妻另类专区欧美制服| 韩国男女黄色在线观看| 少妇露脸深喉口爆吞精| 国产自拍在线观看成人| 欧美va亚洲va天堂va| 日本av高清免费网站| 一区二区三区在线视频福利| 成人在线欧美日韩国产| 日日夜夜精品一二三| 中文字幕成人日韩欧美| 美女av色播在线播放| 国产欧美日韩在线观看不卡| 无套猛戳丰满少妇人妻| 久久美欧人妻少妇一区二区三区| 亚洲的电影一区二区三区| 久久久91蜜桃精品ad| 日本韩国在线观看一区二区| 午夜精品久久久久久99热| 青青草人人妻人人妻| 成人资源在线观看免费官网| 中文字幕一区二 区二三区四区| av在线观看网址av| 粉嫩av懂色av蜜臀av| 亚洲成人熟妇一区二区三区| 激情伦理欧美日韩中文字幕| 亚洲第一伊人天堂网| 精品少妇一二三视频在线| 午夜成午夜成年片在线观看 | 午夜婷婷在线观看视频| 大陆胖女人与丈夫操b国语高清| 护士小嫩嫩又紧又爽20p| 久久免看30视频口爆视频| 亚洲av无女神免非久久| 人妻激情图片视频小说| 免费黄色成人午夜在线网站| 五十路在线观看完整版| a v欧美一区=区三区| av欧美网站在线观看| 天堂av在线播放免费| av资源中文字幕在线观看| 2019av在线视频| 欧美精产国品一二三区| 欧美成人精品欧美一级黄色| 欧美xxx成人在线| 深夜男人福利在线观看| 精品一区二区三四区| 操的小逼流水的文章| 91欧美在线免费观看| 啊啊啊视频试看人妻| 精品国产亚洲av一淫| 精品亚洲中文字幕av| gogo国模私拍视频| 国产污污污污网站在线| 欧美精品国产综合久久| free性日本少妇| 精品区一区二区三区四区人妻| 国产使劲操在线播放| 国产综合精品久久久久蜜臀| 大陆精品一区二区三区久久| 岛国毛片视频免费在线观看| 新婚人妻聚会被中出| 欧美精品 日韩国产| 天堂av在线官网中文| 亚洲变态另类色图天堂网| 亚洲最大免费在线观看| 大白屁股精品视频国产| 亚洲欧美福利在线观看| 一区二区三区日韩久久| 农村胖女人操逼视频| eeuss鲁片一区二区三区| 亚洲乱码中文字幕在线| 老鸭窝在线观看一区| 91人妻精品一区二区久久| 国产乱子伦一二三区| 都市家庭人妻激情自拍视频| 青青擦在线视频国产在线| 香蕉aⅴ一区二区三区| 免费一级黄色av网站| 亚洲1区2区3区精华液| 91九色porny国产在线| 成人网18免费视频版国产| 国产日本精品久久久久久久| 国产伦精品一区二区三区竹菊| 大香蕉伊人中文字幕| 国产janese在线播放| 精品国产亚洲av一淫| 一个色综合男人天堂| 干逼又爽又黄又免费的视频| 黄色成人在线中文字幕| 女同久久精品秋霞网| 日本乱人一区二区三区| 中文字幕日韩91人妻在线| 丁香花免费在线观看中文字幕| 人妻另类专区欧美制服| japanese五十路熟女熟妇| 护士特殊服务久久久久久久| 视频 国产 精品 熟女 | 成人高潮aa毛片免费| 成年人免费看在线视频| 国产久久久精品毛片| 蜜桃视频在线欧美一区| 狍和女人的王色毛片| 天天操天天插天天色| 18禁美女黄网站色大片下载| 91麻豆精品91久久久久同性 | 午夜在线观看岛国av,com| 伊人综合aⅴ在线网| 99av国产精品欲麻豆| 偷拍自拍视频图片免费| 国产aⅴ一线在线观看| 亚洲精品一线二线在线观看| 欧美亚洲自偷自拍 在线| 国内精品在线播放第一页| 亚洲图片欧美校园春色| 国产女人露脸高潮对白视频| 日韩欧美制服诱惑一区在线| 青青草亚洲国产精品视频| 国产精品自拍视频大全| 在线视频免费观看网| 中文字幕国产专区欧美激情| 97人妻无码AV碰碰视频| 久久www免费人成一看片| 揄拍成人国产精品免费看视频| 成年人黄色片免费网站| 国产黄网站在线观看播放| 又粗又硬又猛又黄免费30| 国产精选一区在线播放| 香蕉91一区二区三区| 51国产偷自视频在线播放| 99国产精品窥熟女精品| 亚洲熟女女同志女同| 欧美日韩中文字幕欧美| 亚洲中文字幕综合小综合| 桃色视频在线观看一区二区| 亚洲精品ww久久久久久| 亚洲色偷偷综合亚洲AV伊人| 黄色片年轻人在线观看| 成人av电影免费版| 男人天堂色男人av| 欧美xxx成人在线| 午夜场射精嗯嗯啊啊视频| 秋霞午夜av福利经典影视| 东京热男人的av天堂| 日韩视频一区二区免费观看| 特级无码毛片免费视频播放| 又色又爽又黄又刺激av网站| 被大鸡吧操的好舒服视频免费| 黄工厂精品视频在线观看| 成人性黑人一级av| 女同互舔一区二区三区| 国产日本精品久久久久久久| 亚洲成人免费看电影| 欧美viboss性丰满| 黄网十四区丁香社区激情五月天| 韩国爱爱视频中文字幕| 黄片色呦呦视频免费看| 一区二区视频在线观看免费观看| 爱有来生高清在线中文字幕| 日本一本午夜在线播放| 亚洲欧美精品综合图片小说| 亚洲中文字幕人妻一区| 福利在线视频网址导航| 韩国女主播精品视频网站| 十八禁在线观看地址免费| 美洲精品一二三产区区别| 自拍偷区二区三区麻豆| 亚洲高清视频在线不卡| 3D动漫精品啪啪一区二区下载| 老师啊太大了啊啊啊尻视频| 99热久久这里只有精品| 啊啊啊视频试看人妻| 亚洲高清免费在线观看视频| 亚洲最大黄了色网站| 在线新三级黄伊人网| 精内国产乱码久久久久久| 国产视频网站一区二区三区| 偷拍自拍福利视频在线观看| 国产美女午夜福利久久| 一区二区三区日本伦理| 免费在线播放a级片| 国产变态另类在线观看| 97国产精品97久久| www天堂在线久久| 99精品视频在线观看婷婷| 97超碰人人搞人人| 国产一区二区欧美三区| 久久久久久97三级| 日韩欧美在线观看不卡一区二区| 成人影片高清在线观看| 一区二区免费高清黄色视频| 欧美一区二区三区激情啪啪啪 | 狠狠躁狠狠爱网站视频| 黄色成人在线中文字幕| 人妻3p真实偷拍一二区| 狠狠的往里顶撞h百合| 国产麻豆剧果冻传媒app| 美女福利写真在线观看视频| 啊啊好大好爽啊啊操我啊啊视频| 1024久久国产精品| 性感美女高潮视频久久久| 1000部国产精品成人观看视频| 9国产精品久久久久老师 | 成人高清在线观看视频| 国产精品亚洲在线观看| 国产精品久久久黄网站| 粗大的内捧猛烈进出爽大牛汉子| 欧美 亚洲 另类综合| 黄色片黄色片wyaa| 日韩亚洲高清在线观看| 美女大bxxxx内射| 免费在线看的黄网站| 在线观看911精品国产| 午夜免费观看精品视频| 日韩a级精品一区二区| gav成人免费播放| 欧美麻豆av在线播放| 国产女人叫床高潮大片视频| 少妇人妻真实精品视频| 日本真人性生活视频免费看| 在线观看的黄色免费网站| 最新的中文字幕 亚洲| 91麻豆精品久久久久| 大香蕉大香蕉大香蕉大香蕉大香蕉 | 午夜精品九一唐人麻豆嫩草成人| 91精品国产麻豆国产| 国产极品精品免费视频| 中国黄片视频一区91| 亚洲美女美妇久久字幕组| 国产91精品拍在线观看| 天天干天天插天天谢| 国产清纯美女al在线| 国产+亚洲+欧美+另类| 国产久久久精品毛片| 日本美女成人在线视频| 亚洲国际青青操综合网站| 国产内射中出在线观看| 国产精品黄大片在线播放| 亚洲av极品精品在线观看| 亚洲1069综合男同| 三上悠亚和黑人665番号| 中文字幕在线观看极品视频| 亚洲高清国产一区二区三区| 天天操天天插天天色| 国产一区二区久久久裸臀| 98视频精品在线观看| 日本啪啪啪啪啪啪啪| 93精品视频在线观看| 亚洲另类在线免费观看| 免费在线福利小视频| 中文字幕高清资源站| 性感美女福利视频网站| 97a片免费在线观看| 亚洲天堂精品福利成人av| 日韩成人免费电影二区| 婷婷色国产黑丝少妇勾搭AV| 韩国AV无码不卡在线播放| av天堂中文字幕最新| 国产精品中文av在线播放 | 在线免费观看视频一二区| 9l人妻人人爽人人爽| 粉嫩av蜜乳av蜜臀| 国产露脸对白在线观看| 午夜在线精品偷拍一区二| 国产黄色片在线收看| 国产黄色片蝌蚪九色91| 久草视频首页在线观看| 中文字幕之无码色多多| 18禁精品网站久久| 国产揄拍高清国内精品对白| 色呦呦视频在线观看视频| 欧美一区二区三区激情啪啪啪| 老有所依在线观看完整版| av男人天堂狠狠干| 日本女人一级免费片| 操的小逼流水的文章| 啊啊啊视频试看人妻| 国产精品福利小视频a| 中国产一级黄片免费视频播放| 国产精品久久综合久久| 国产精品久久久久久久久福交| 日本在线不卡免费视频| 天天操天天干天天插| 自拍偷拍 国产资源| 欧美xxx成人在线| 黄色录像鸡巴插进去| 日本黄色三级高清视频| 天天日天天干天天干天天日| 国产刺激激情美女网站| 午夜国产福利在线观看| 天天综合天天综合天天网| 久草福利电影在线观看| 超级av免费观看一区二区三区| 日韩中文字幕在线播放第二页| 天堂av在线官网中文| 久久亚洲天堂中文对白| 性感美女诱惑福利视频| 女同久久精品秋霞网| 人妻丝袜av在线播放网址| 91精品国产黑色丝袜| 一个色综合男人天堂| 97黄网站在线观看| 色天天天天射天天舔| 亚洲熟女女同志女同| 东游记中文字幕版哪里可以看到| 国产亚洲精品欧洲在线观看| 亚洲久久午夜av一区二区| asmr福利视频在线观看| 少妇人妻真实精品视频| 边摸边做超爽毛片18禁色戒| 91精品视频在线观看免费| 丝袜美腿欧美另类 中文字幕| 国产+亚洲+欧美+另类| 九色porny九色9l自拍视频| 久久这里有免费精品| tube69日本少妇| 日本韩国在线观看一区二区| 亚洲精品一线二线在线观看| 中文字幕一区二区三区人妻大片| 久久久噜噜噜久久熟女av| 欧美特级特黄a大片免费| 99精品亚洲av无码国产另类| 热思思国产99re| 欧美视频中文一区二区三区| nagger可以指黑人吗| 巨乳人妻日下部加奈被邻居中出 | 成人综合亚洲欧美一区| 国产日韩欧美视频在线导航| 日韩亚洲高清在线观看| 色综合久久五月色婷婷综合 | 日韩美女精品视频在线观看网站| 一区二区熟女人妻视频| 亚洲成高清a人片在线观看| 搡老妇人老女人老熟女| 任你操视频免费在线观看| 亚洲欧美另类手机在线| 欧美乱妇无乱码一区二区| 国产+亚洲+欧美+另类| 国产欧美日韩在线观看不卡| 亚洲变态另类色图天堂网| 精品国产在线手机在线| 热思思国产99re| 三级等保密码要求条款| 国内自拍第一页在线观看| japanese日本熟妇另类| 天天色天天操天天舔| 五月天色婷婷在线观看视频免费| 被大鸡吧操的好舒服视频免费| 日本性感美女三级视频| 经典av尤物一区二区| 欧美成一区二区三区四区| 日本韩国在线观看一区二区| 久久人人做人人妻人人玩精品vr| 欧美偷拍自拍色图片| 老熟妇凹凸淫老妇女av在线观看| 91免费福利网91麻豆国产精品| 色婷婷久久久久swag精品| 黄色录像鸡巴插进去| 国产超码片内射在线| 亚洲1069综合男同| 精彩视频99免费在线| 中文字幕熟女人妻久久久| 天天射夜夜操狠狠干| 日本性感美女写真视频| 啊慢点鸡巴太大了啊舒服视频| 中国黄片视频一区91| 一区二区熟女人妻视频| 天天插天天色天天日| 9色精品视频在线观看| 亚洲精品精品国产综合| 999热精品视频在线| 欧美日韩人妻久久精品高清国产| 国产一区二区欧美三区| 天天色天天爱天天爽| 中文字幕奴隷色的舞台50| 欧洲欧美日韩国产在线| 天天操,天天干,天天射| 最新97国产在线视频| 美女福利写真在线观看视频| 亚洲狠狠婷婷综合久久app| 日本韩国免费福利精品| 1769国产精品视频免费观看| 青青青青青青青青青青草青青| 日韩亚洲高清在线观看| 国产中文字幕四区在线观看| 亚洲av日韩高清hd| 国产揄拍高清国内精品对白| 中文字幕人妻一区二区视频| 日韩欧美一级精品在线观看| 国产精品久久久久网| 不卡精品视频在线观看| 青青青国产片免费观看视频| 五十路老熟女码av| 亚洲熟妇x久久av久久| 亚洲av第国产精品| 91国偷自产一区二区三区精品| 久久尻中国美女视频| 欧美色婷婷综合在线| 天天躁日日躁狠狠躁躁欧美av| 亚洲av在线观看尤物| 亚洲精品国产久久久久久| chinese国产盗摄一区二区| 熟女国产一区亚洲中文字幕| 精品国产在线手机在线| 视频一区二区三区高清在线| 午夜精品一区二区三区更新| 成人性黑人一级av| 岛国毛片视频免费在线观看| 久久久久久久精品老熟妇| 精品成人午夜免费看| 青青青青操在线观看免费| 国产白袜脚足J棉袜在线观看| 少妇深喉口爆吞精韩国| 美女张开两腿让男人桶av| 91亚洲手机在线视频播放| 午夜激情精品福利视频| 日韩人妻丝袜中文字幕| 国产实拍勾搭女技师av在线| 国产实拍勾搭女技师av在线| 亚洲av男人天堂久久| 欧美精品亚洲精品日韩在线| av乱码一区二区三区| 初美沙希中文字幕在线| 自拍偷拍亚洲精品第2页| 又色又爽又黄的美女裸体| 99久久激情婷婷综合五月天| 亚洲变态另类色图天堂网| 成人av天堂丝袜在线观看| 国产成人一区二区三区电影网站| 国产亚洲视频在线二区| 国产成人一区二区三区电影网站| 日韩激情文学在线视频| 一本久久精品一区二区| 日韩黄色片在线观看网站| 2012中文字幕在线高清| 中文字幕日韩无敌亚洲精品| 好吊操视频这里只有精品| 久草视频首页在线观看| 三上悠亚和黑人665番号| 抽查舔水白紧大视频| 亚洲超碰97人人做人人爱| 在线视频自拍第三页| 日本性感美女视频网站| 欧美亚洲免费视频观看| 孕妇奶水仑乱A级毛片免费看| 日本美女性生活一级片| 国产精品欧美日韩区二区| 国产女人露脸高潮对白视频| 国产一区自拍黄视频免费观看| 亚洲欧美福利在线观看| 色爱av一区二区三区| 美女视频福利免费看| 日美女屁股黄邑视频| 男人操女人逼逼视频网站| 老司机福利精品免费视频一区二区 | 黑人大几巴狂插日本少妇| 操日韩美女视频在线免费看 | 一级黄片久久久久久久久| 啊啊啊想要被插进去视频| 免费人成黄页网站在线观看国产| 国产精品久久久久久久女人18| 亚洲嫩模一区二区三区| 999热精品视频在线| 日本少妇高清视频xxxxx| 国产福利在线视频一区| 91社福利《在线观看| www日韩a级s片av| 久草视频在线看免费| 婷婷综合亚洲爱久久| 91chinese在线视频| 特级无码毛片免费视频播放| 一区国内二区日韩三区欧美| 亚洲的电影一区二区三区| 亚洲 中文 自拍 无码| 精品一线二线三线日本| 亚洲欧美福利在线观看| 人妻久久无码中文成人| 亚洲老熟妇日本老妇| av成人在线观看一区| 日韩成人综艺在线播放| 日韩av免费观看一区| 另类av十亚洲av| av大全在线播放免费| 亚洲2021av天堂| 亚洲精品av在线观看| 人妻少妇一区二区三区蜜桃| 国产日韩精品一二三区久久久| 人妻自拍视频中国大陆| 久久久久久久99精品| 国产女孩喷水在线观看| gogo国模私拍视频| 欧美80老妇人性视频| 亚洲av男人天堂久久| 精品高潮呻吟久久av| 99久久激情婷婷综合五月天| 97国产在线av精品| 国产熟妇一区二区三区av| 黄色无码鸡吧操逼视频| 40道精品招牌菜特色| 九一传媒制片厂视频在线免费观看| 午夜精品久久久久麻豆影视| 亚洲欧美激情中文字幕| 成年人免费看在线视频| 午夜精品一区二区三区更新| 爱有来生高清在线中文字幕| 自拍 日韩 欧美激情| 中文字幕人妻被公上司喝醉在线 | 五十路丰满人妻熟妇| 男人操女人逼逼视频网站| 蜜桃视频17c在线一区二区| 手机看片福利盒子日韩在线播放 | 在线观看亚洲人成免费网址| 成人激情文学网人妻| 国产超码片内射在线| 热99re69精品8在线播放| 高清一区二区欧美系列| 中文字幕乱码人妻电影| 在线观看国产网站资源| 亚洲成人激情视频免费观看了| 青草亚洲视频在线观看| 在线观看黄色成年人网站| 国产不卡av在线免费| 国产精品人久久久久久| 亚洲 中文 自拍 另类 欧美| 777奇米久久精品一区| 在线播放一区二区三区Av无码| 国产又大又黄免费观看| 午夜免费观看精品视频| av中文字幕电影在线看| 99热久久极品热亚洲| 1000部国产精品成人观看视频 | 美女吃鸡巴操逼高潮视频| 欧美精产国品一二三产品价格 | 国产一区二区在线欧美| 天天操天天射天天操天天天| 中文字幕在线视频一区二区三区| 黄色av网站免费在线| 午夜精品一区二区三区福利视频| 天天日天天做天天日天天做| 黑人借宿ntr人妻的沦陷2| 欧美日韩高清午夜蜜桃大香蕉| 操日韩美女视频在线免费看| 日本少妇人妻xxxxx18| 啪啪啪18禁一区二区三区| 亚洲成a人片777777| 99精品国产自在现线观看| 黄色在线观看免费观看在线| 在线播放一区二区三区Av无码| av大全在线播放免费| 91色老99久久九九爱精品| 天堂av在线播放免费| 一区二区三区 自拍偷拍| 国产三级精品三级在线不卡| 1000部国产精品成人观看视频| 插小穴高清无码中文字幕| 国产午夜福利av导航| 久久精品久久精品亚洲人| 最新国产精品网址在线观看| 男人插女人视频网站| 国产精品人妻66p| 18禁美女羞羞免费网站| 天天色天天舔天天射天天爽| 黑人乱偷人妻中文字幕| 2020韩国午夜女主播在线| 果冻传媒av一区二区三区| 在线播放 日韩 av| 99热色原网这里只有精品| 亚洲午夜高清在线观看| 人妻自拍视频中国大陆| 精彩视频99免费在线| 亚洲免费va在线播放| 一区二区三区 自拍偷拍| 99久久超碰人妻国产| 99re国产在线精品| 78色精品一区二区三区| 狠狠躁狠狠爱网站视频| 青青青视频自偷自拍38碰| 福利视频一区二区三区筱慧| 丝袜长腿第一页在线| 天天日天天玩天天摸| 一区二区免费高清黄色视频| 亚洲中文字字幕乱码| 国产 在线 免费 精品| 在线不卡成人黄色精品| 99亚洲美女一区二区三区| 日韩美在线观看视频黄| 亚洲成人免费看电影| 亚洲成人情色电影在线观看| 国产剧情演绎系列丝袜高跟| 绯色av蜜臀vs少妇| 2020国产在线不卡视频| 88成人免费av网站| 福利午夜视频在线合集| 97人妻总资源视频| 亚洲av色香蕉一区二区三区| 日韩午夜福利精品试看| 在线国产日韩欧美视频| 97欧洲一区二区精品免费| 美日韩在线视频免费看| 久久精品在线观看一区二区| 91免费黄片可看视频 | 最新国产精品网址在线观看| 啪啪啪18禁一区二区三区| 999热精品视频在线| 亚洲第一伊人天堂网| 人妻另类专区欧美制服| 在线观看免费视频色97| 欧美一级视频一区二区| 欧美成一区二区三区四区| 中文字幕日韩精品日本| 午夜激情久久不卡一区二区| 国产一区二区三免费视频| 免费无码人妻日韩精品一区二区| 动漫美女的小穴视频| aiss午夜免费视频| 77久久久久国产精产品| 不戴胸罩引我诱的隔壁的人妻| 亚洲午夜伦理视频在线| 偷拍自拍视频图片免费| 91av中文视频在线| 免费成人av中文字幕| 国产自拍在线观看成人| 日本熟妇色熟妇在线观看| av久久精品北条麻妃av观看| 三上悠亚和黑人665番号| 人人人妻人人澡人人| 丰满的子国产在线观看| 中文字幕无码日韩专区免费| 亚洲 清纯 国产com| 亚洲国产第一页在线观看| 99人妻视频免费在线| 国产视频一区二区午夜| 国产精品黄色的av| 91福利视频免费在线观看| 天美传媒mv视频在线观看| av网址国产在线观看| 激情伦理欧美日韩中文字幕| 美味人妻2在线播放| 美女操逼免费短视频下载链接| 日韩亚洲高清在线观看| 欧美激情精品在线观看| 国产午夜男女爽爽爽爽爽视频| 中文字幕高清在线免费播放| 91麻豆精品传媒国产黄色片| 国产精品久久久久久美女校花| 青青热久免费精品视频在线观看| 亚洲欧美清纯唯美另类| 日本xx片在线观看| 免费看美女脱光衣服的视频| 91福利视频免费在线观看| 人人妻人人爱人人草| 偷拍自拍亚洲视频在线观看| 玖玖一区二区在线观看| 久久精品36亚洲精品束缚| 五月天中文字幕内射| 亚洲成人激情视频免费观看了| 一区二区三区在线视频福利| 亚洲av琪琪男人的天堂| 久久久久五月天丁香社区| 福利视频一区二区三区筱慧| 精品av国产一区二区三区四区 | 北条麻妃肉色丝袜视频| 日韩a级黄色小视频| 中文字幕在线欧美精品| tube69日本少妇| 天天通天天透天天插| 日日日日日日日日夜夜夜夜夜夜| 免费黄色成人午夜在线网站| 欧美视频一区免费在线| 亚洲综合在线视频可播放| 免费啪啪啪在线观看视频| 亚洲公开视频在线观看| 国产av自拍偷拍盛宴| 日本一区美女福利视频| 自拍偷拍,中文字幕| 特黄老太婆aa毛毛片| 老有所依在线观看完整版| mm131美女午夜爽爽爽| 国产使劲操在线播放| 亚洲国产最大av综合| 亚洲激情av一区二区| 天天日天天日天天擦| 欧美80老妇人性视频| 午夜影院在线观看视频羞羞羞| 热99re69精品8在线播放| 污污小视频91在线观看| 在线播放 日韩 av| 欧美黄片精彩在线免费观看| 国产黄色大片在线免费播放| 少妇被强干到高潮视频在线观看| 亚洲av可乐操首页| 99热这里只有国产精品6| 骚逼被大屌狂草视频免费看| 2021天天色天天干| 午夜精品在线视频一区| 宅男噜噜噜666国产| 午夜成午夜成年片在线观看| 免费国产性生活视频| 2022天天干天天操| 日韩欧美国产精品91| 欧美黄片精彩在线免费观看| 不卡一区一区三区在线| 青青青艹视频在线观看| 91免费福利网91麻豆国产精品| 久精品人妻一区二区三区| 午夜福利资源综合激情午夜福利资| 日本免费视频午夜福利视频| 色秀欧美视频第一页| 人人超碰国字幕观看97| 伊人成人在线综合网| 91人妻精品久久久久久久网站| 日本精品美女在线观看| 91免费放福利在线观看| 人妻最新视频在线免费观看| 五十路息与子猛烈交尾视频| 亚洲精品精品国产综合| 亚洲 欧美 精品 激情 偷拍 | 伊人网中文字幕在线视频| 韩国男女黄色在线观看| 伊拉克及约旦宣布关闭领空| 亚洲午夜电影之麻豆| 国产成人自拍视频播放| 精品久久久久久高潮| jiuse91九色视频| 成年午夜免费无码区| 自拍偷拍亚洲欧美在线视频| 青娱乐最新视频在线| 中文字幕AV在线免费看 | 综合激情网激情五月五月婷婷| 人妻少妇av在线观看| 一区二区三区精品日本| 午夜在线一区二区免费| 美女福利视频导航网站| 国产aⅴ一线在线观看| 天天日天天鲁天天操| 精品久久久久久久久久久a√国产| 五十路息与子猛烈交尾视频 | 激情人妻校园春色亚洲欧美| 偷拍自拍亚洲视频在线观看| 激情内射在线免费观看| 极品丝袜一区二区三区| 亚洲激情,偷拍视频| 亚洲1069综合男同| 日本黄在免费看视频| 亚洲偷自拍高清视频| 欧美久久久久久三级网| 亚洲av日韩精品久久久| 午夜蜜桃一区二区三区| 视频啪啪啪免费观看| 国产91精品拍在线观看| 国产内射中出在线观看| 偷青青国产精品青青在线观看| 亚洲区欧美区另类最新章节| 精品视频一区二区三区四区五区| 亚洲精品中文字幕下载| 中文亚洲欧美日韩无线码| 亚洲熟妇久久无码精品| 99久久成人日韩欧美精品| 国产精品黄色的av| av无限看熟女人妻另类av| 欧美一区二区三区久久久aaa| 亚洲av日韩av网站| 日韩美在线观看视频黄| 亚洲伊人久久精品影院一美女洗澡| 日韩精品中文字幕福利| 久久这里有免费精品| 夜色撩人久久7777| 亚洲第一黄色在线观看| 亚洲国产精品久久久久蜜桃| 久久精品在线观看一区二区| 一区二区视频在线观看免费观看| 欧美亚洲免费视频观看| 自拍偷拍亚洲欧美在线视频| 欧美日韩不卡一区不区二区| 偷青青国产精品青青在线观看 | 中文字幕欧美日韩射射一| 100%美女蜜桃视频| 最新中文字幕乱码在线| 天天干天天搞天天摸| 91一区精品在线观看| 国产自拍黄片在线观看| 亚洲蜜臀av一区二区三区九色| 五十路在线观看完整版| 特大黑人巨大xxxx| 欧美日韩在线精品一区二区三| 久久午夜夜伦痒痒想咳嗽P| 亚洲精品精品国产综合| 国产极品精品免费视频| 黑人巨大精品欧美视频| 伊人开心婷婷国产av| 宅男噜噜噜666国产| 九色视频在线观看免费| 国产精选一区在线播放| 免费在线看的黄片视频| 78色精品一区二区三区| 青青草视频手机免费在线观看| 三上悠亚和黑人665番号| 二区中出在线观看老师| 欧美乱妇无乱码一区二区| 欧美少妇性一区二区三区| 国产亚洲精品视频合集| 一区国内二区日韩三区欧美| 欧美日韩激情啪啪啪| 最后99天全集在线观看| 亚洲的电影一区二区三区| 青青青青青手机视频| 亚洲va国产va欧美va在线| 国产一区二区三免费视频| 日韩加勒比东京热二区| 天堂av狠狠操蜜桃| 青青草原网站在线观看| 欧美国品一二三产区区别| 免费在线看的黄片视频| 中国老熟女偷拍第一页| 4个黑人操素人视频网站精品91| 色综合久久无码中文字幕波多| 色婷婷精品大在线观看| 欧美美女人体视频一区| 亚洲图片欧美校园春色| 欧美色呦呦最新网址| 青青社区2国产视频| 午夜在线观看岛国av,com| 91精品国产黑色丝袜| 伊人精品福利综合导航| 欧美韩国日本国产亚洲| 天天日夜夜操天天摸| 久久久91蜜桃精品ad| 日本最新一二三区不卡在线| 亚洲av天堂在线播放| 国产va在线观看精品| 人人爱人人妻人人澡39| 韩国三级aaaaa高清视频| 日韩熟女系列一区二区三区| 久久久超爽一二三av| 国产女孩喷水在线观看| 91精品国产综合久久久蜜| 五十路熟女av天堂| 91福利视频免费在线观看| 成人av亚洲一区二区| 日本在线不卡免费视频| 黄色男人的天堂视频| av天堂中文免费在线| 一区二区三区蜜臀在线| 91色网站免费在线观看| 在线免费观看黄页视频| 动漫av网站18禁| 中文字幕无码日韩专区免费| 自拍偷拍日韩欧美一区二区| 欧美亚洲免费视频观看| 亚洲av色图18p| 2020韩国午夜女主播在线| 国产精品自拍偷拍a| 66久久久久久久久久久| 91久久国产成人免费网站| 亚洲欧美激情国产综合久久久| 熟妇一区二区三区高清版| 午夜精品在线视频一区| 国产av一区2区3区| 国产chinesehd精品麻豆| 巨乳人妻日下部加奈被邻居中出| 精品人妻每日一部精品| 天堂资源网av中文字幕| 91精品国产91青青碰| 精品日产卡一卡二卡国色天香 | 精品亚洲中文字幕av| 国产一区成人在线观看视频| gogo国模私拍视频| 亚洲中文字幕乱码区| 无码日韩人妻精品久久| 抽查舔水白紧大视频| 欧美激情精品在线观看| 加勒比视频在线免费观看| 欧美性受xx黑人性猛交| 国产熟妇人妻ⅹxxxx麻豆| 国产精品人妻一区二区三区网站| 蜜桃视频入口久久久| 2012中文字幕在线高清| 日韩午夜福利精品试看| 在线播放 日韩 av| 国产普通话插插视频| 亚洲av无硬久久精品蜜桃| 日本女人一级免费片| 在线观看黄色成年人网站| 高潮喷水在线视频观看| 精品视频国产在线观看| 姐姐的朋友2在线观看中文字幕| 大香蕉伊人中文字幕| 久久久精品国产亚洲AV一| 日本午夜久久女同精女女| 最新国产精品网址在线观看| 中文字幕午夜免费福利视频| v888av在线观看视频| 极品粉嫩小泬白浆20p主播| 操人妻嗷嗷叫视频一区二区| 午夜在线一区二区免费| 成人蜜臀午夜久久一区| 亚洲另类在线免费观看| 岛国免费大片在线观看| 国产一区二区三免费视频| 99热这里只有精品中文| 最新91九色国产在线观看| 五月激情婷婷久久综合网| 一区二区三区日韩久久| 大香蕉伊人国产在线| 大黑人性xxxxbbbb| 日韩北条麻妃一区在线| 国产精品黄片免费在线观看| 特级无码毛片免费视频播放| 97资源人妻免费在线视频| 97国产在线av精品| 国产精品国产三级国产精东| 92福利视频午夜1000看| 沙月文乃人妻侵犯中文字幕在线| 久久人人做人人妻人人玩精品vr | 亚洲激情偷拍一区二区| av手机免费在线观看高潮| 一区二区三区的久久的蜜桃的视频| 最新97国产在线视频| 91人妻精品一区二区在线看| 国产精品熟女久久久久浪潮| 中文字幕无码日韩专区免费| 国产精品视频欧美一区二区| 午夜在线观看一区视频| 久久永久免费精品人妻专区 | 激情啪啪啪啪一区二区三区 | 日本免费视频午夜福利视频| 无码中文字幕波多野不卡| 熟女国产一区亚洲中文字幕| 亚洲公开视频在线观看| 97精品综合久久在线| 亚洲在线一区二区欧美| 精品日产卡一卡二卡国色天香| 青青青青青操视频在线观看| 亚洲日本一区二区久久久精品| 97人妻夜夜爽二区欧美极品| 超鹏97历史在线观看| 美女操逼免费短视频下载链接 | 快插进小逼里大鸡吧视频| 在线免费观看99视频| 韩国三级aaaaa高清视频| 男人靠女人的逼视频| 中国视频一区二区三区| 18禁美女羞羞免费网站| 大胆亚洲av日韩av| 夜夜骑夜夜操夜夜奸| 97人人模人人爽人人喊| 成年午夜免费无码区| 亚洲一区二区三区久久受 | 亚洲欧美激情人妻偷拍| 日韩欧美一级aa大片| 午夜激情久久不卡一区二区| 岛国毛片视频免费在线观看| 中国视频一区二区三区| 成人蜜桃美臀九一一区二区三区| av久久精品北条麻妃av观看| 最新国产亚洲精品中文在线| 顶级尤物粉嫩小尤物网站| 亚洲av日韩高清hd| 成人精品在线观看视频| 女人精品内射国产99| 欧美一区二区三区乱码在线播放| 国产亚洲欧美45p| 91国偷自产一区二区三区精品| 99一区二区在线观看| 大香蕉日本伊人中文在线| 在线观看的a站 最新| 搡老妇人老女人老熟女| 亚洲av天堂在线播放| 特一级特级黄色网片| 综合色区亚洲熟妇shxstz| 在线观看国产免费麻豆| 人妻丝袜榨强中文字幕| 亚洲欧洲av天堂综合| 视频在线亚洲一区二区| 欧美另类z0z变态| 欧美亚洲免费视频观看| 午夜极品美女福利视频| 日日操综合成人av| 日韩精品中文字幕福利| 亚洲人一区二区中文字幕| 人人爱人人妻人人澡39| 亚洲av午夜免费观看| 一区二区久久成人网| 国产真实灌醉下药美女av福利| 天堂女人av一区二区| 久久午夜夜伦痒痒想咳嗽P| 人妻最新视频在线免费观看| 久久机热/这里只有| 福利在线视频网址导航| 大胸性感美女羞爽操逼毛片| 午夜精品久久久久久99热| 极品粉嫩小泬白浆20p主播| 丝袜国产专区在线观看| 大香蕉伊人国产在线| 青青尤物在线观看视频网站| 亚洲一级 片内射视正片| 亚洲av日韩精品久久久| 国产+亚洲+欧美+另类| 欧美一区二区三区四区性视频| 成人影片高清在线观看| 精品一区二区三区在线观看| 亚洲欧洲av天堂综合| 香蕉91一区二区三区| 91精品国产观看免费| 中文字幕一区的人妻欧美日韩| 91国内视频在线观看| 老熟妇凹凸淫老妇女av在线观看| 亚洲va欧美va人人爽3p| 日本www中文字幕| 蜜桃专区一区二区在线观看| 日本乱人一区二区三区| 日本熟女精品一区二区三区| 亚洲国产欧美一区二区三区…| 女同性ⅹxx女同hd| 91免费观看在线网站| 亚洲欧美成人综合在线观看| 亚洲狠狠婷婷综合久久app| 91she九色精品国产| 午夜激情精品福利视频| 姐姐的朋友2在线观看中文字幕| 国产日韩欧美美利坚蜜臀懂色| yy6080国产在线视频| 青青青青青青草国产| 国产视频一区二区午夜| 亚洲熟女久久久36d| 91大神福利视频网| 美女张开腿让男生操在线看| 亚洲精品麻豆免费在线观看 | 亚洲一级美女啪啪啪| 国产内射中出在线观看| 91桃色成人网络在线观看| 亚洲精品午夜aaa久久| 欧美成人精品欧美一级黄色| 在线播放 日韩 av| 成人H精品动漫在线无码播放| 中文字幕av第1页中文字幕| 国产福利在线视频一区| 久精品人妻一区二区三区| 黄色大片男人操女人逼| sspd152中文字幕在线| 亚洲一区二区三区偷拍女厕91| 国产亚洲精品品视频在线| 100%美女蜜桃视频| 国产精品人妻66p| 久久久久久九九99精品| 国产91久久精品一区二区字幕| 国产精品久久久久久美女校花| 欧美激情精品在线观看| 熟女视频一区,二区,三区| 丝袜肉丝一区二区三区四区在线看| 韩国AV无码不卡在线播放|