国产无遮挡裸体免费直播视频,久久精品国产蜜臀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)文章

最新評論

98视频精品在线观看| 操操网操操伊剧情片中文字幕网| 制服丝袜在线人妻中文字幕| 一区二区三区蜜臀在线| 沙月文乃人妻侵犯中文字幕在线| 亚洲最大黄了色网站| 最近中文2019年在线看| 中文字幕AV在线免费看 | 久久热这里这里只有精品| 久久久久五月天丁香社区| 色婷婷精品大在线观看| 91麻豆精品久久久久| 欧美黑人巨大性xxxxx猛交| 中文字幕av第1页中文字幕| 欧美日韩一级黄片免费观看| 狠狠躁夜夜躁人人爽天天久天啪| 亚洲另类在线免费观看| 日本a级视频老女人| 男人天堂最新地址av| 四虎永久在线精品免费区二区| 91试看福利一分钟| 婷婷激情四射在线观看视频| 亚洲人人妻一区二区三区| 日韩美在线观看视频黄| 中出中文字幕在线观看| 真实国模和老外性视频| 天天射夜夜操综合网| 在线视频自拍第三页| 无套猛戳丰满少妇人妻| 欧美国产亚洲中英文字幕| 男人操女人的逼免费视频| 哥哥姐姐综合激情小说| 毛片av在线免费看| 98视频精品在线观看| 久久久久只精品国产三级| 91社福利《在线观看| 亚洲国产成人最新资源| 日日摸夜夜添夜夜添毛片性色av| 97色视频在线观看| 久久精品亚洲成在人线a| 国产+亚洲+欧美+另类| 老师让我插进去69AV| 岳太深了紧紧的中文字幕| 欧美老妇精品另类不卡片| 成人H精品动漫在线无码播放| 国产性色生活片毛片春晓精品| 日本一道二三区视频久久| 93精品视频在线观看| 国产日韩精品一二三区久久久| 97香蕉碰碰人妻国产樱花| 欧美精品国产综合久久| 99视频精品全部15| 婷婷午夜国产精品久久久| 天天干天天日天天干天天操| 天堂v男人视频在线观看| 夜鲁夜鲁狠鲁天天在线| 成人高潮aa毛片免费| 久久久制服丝袜中文字幕| 狠狠操狠狠操免费视频| 亚洲青青操骚货在线视频| 狠狠的往里顶撞h百合| 日本五十路熟新垣里子| 国产97在线视频观看| 亚洲一区二区三区久久受| av老司机精品在线观看| 国产欧美精品不卡在线| 国产精品人妻66p| japanese五十路熟女熟妇| 青青青爽视频在线播放| 日本阿v视频在线免费观看| 888欧美视频在线| 同居了嫂子在线播高清中文| 一色桃子久久精品亚洲| 日韩中文字幕福利av| 黄片大全在线观看观看| 久久久久久久精品老熟妇| 日本阿v视频在线免费观看| huangse网站在线观看| 日本韩国亚洲综合日韩欧美国产| 91精品综合久久久久3d动漫| 男人的天堂在线黄色| 婷婷久久久久深爱网| 免费人成黄页网站在线观看国产| 日本熟妇喷水xxx| 精品一区二区三四区| 天天躁夜夜躁日日躁a麻豆| 91p0rny九色露脸熟女| 精品美女在线观看视频在线观看| 亚洲激情,偷拍视频| 1000部国产精品成人观看视频| 激情国产小视频在线| 人妻在线精品录音叫床| 欧美激情电影免费在线| 宅男噜噜噜666国产| 亚洲综合色在线免费观看| 国产极品美女久久久久久| 欧美在线一二三视频| 天天做天天干天天舔| AV无码一区二区三区不卡| 91啪国自产中文字幕在线| 成人蜜臀午夜久久一区| 爱爱免费在线观看视频| 韩国男女黄色在线观看| 久碰精品少妇中文字幕av| 久久机热/这里只有| 亚洲人妻30pwc| 亚洲中文字幕国产日韩| 亚洲最大免费在线观看| 欧洲欧美日韩国产在线| 黄片大全在线观看观看| 五月激情婷婷久久综合网| 亚洲1区2区3区精华液| 五月激情婷婷久久综合网| 中文字日产幕乱六区蜜桃| 美日韩在线视频免费看| 精品一区二区亚洲欧美| 久草视频 久草视频2| 中文字幕人妻熟女在线电影| 大肉大捧一进一出好爽在线视频 | 亚洲第17页国产精品| 久草福利电影在线观看| 哥哥姐姐综合激情小说| 在线免费观看靠比视频的网站| 98视频精品在线观看| 男人的天堂一区二区在线观看| av完全免费在线观看av| 中文字幕在线乱码一区二区 | 欧美亚洲牲夜夜综合久久| 亚洲国产欧美一区二区三区久久| 国产精品视频欧美一区二区| 天天日天天干天天舔天天射| 亚洲精品欧美日韩在线播放| 中文字幕高清在线免费播放| 亚洲国产精品久久久久蜜桃| 阴茎插到阴道里面的视频| 亚洲av无女神免非久久| 国产精品黄大片在线播放| 91综合久久亚洲综合| 精品国产亚洲av一淫| 日韩在线中文字幕色| 国产三级片久久久久久久 | 黄色无码鸡吧操逼视频| 日韩一区二区电国产精品| 粉嫩小穴流水视频在线观看| 青青青青青手机视频| 国产精品久久久久久久久福交| 国产精品黄片免费在线观看| 日韩欧美一级黄片亚洲| 国内资源最丰富的网站| 欧美3p在线观看一区二区三区| 亚洲天天干 夜夜操| 亚洲人人妻一区二区三区| 天天艹天天干天天操| 国产亚洲国产av网站在线| 被大鸡吧操的好舒服视频免费| 亚洲偷自拍高清视频| 一区二区三区美女毛片| 色婷婷六月亚洲综合香蕉| 天天躁日日躁狠狠躁躁欧美av| 美女福利写真在线观看视频| 日本性感美女写真视频| 欧洲亚洲欧美日韩综合| 性感美女高潮视频久久久| 国产精品女邻居小骚货| 国产视频一区在线观看| 欧美成人精品在线观看| 可以免费看的www视频你懂的| 国产一区二区三免费视频 | 制丝袜业一区二区三区| 日韩美女搞黄视频免费| 抽查舔水白紧大视频| 被大鸡吧操的好舒服视频免费| 国产高清精品极品美女| 亚洲成人三级在线播放| 51国产成人精品视频| nagger可以指黑人吗| 国产精品视频男人的天堂| 久久永久免费精品人妻专区 | 国产日本精品久久久久久久| 夜夜嗨av蜜臀av| 天天日天天干天天插舔舔| 青青草精品在线视频观看| 青青热久免费精品视频在线观看| 青青青青在线视频免费观看| 久久热久久视频在线观看| 人妻3p真实偷拍一二区| 欧美日韩亚洲国产无线码| 午夜青青草原网在线观看| 51国产成人精品视频| 黑人性生活视频免费看| av天堂中文免费在线| 哥哥姐姐综合激情小说| 天天日天天做天天日天天做| 日韩中文字幕福利av| 人妻久久无码中文成人| 91中文字幕最新合集| 一区二区在线视频中文字幕| 日韩不卡中文在线视频网站| 天天射夜夜操狠狠干| 成人H精品动漫在线无码播放| 国产女人被做到高潮免费视频| 在线视频国产欧美日韩| 欧美视频综合第一页| 青青青青青青青在线播放视频| 护士特殊服务久久久久久久| 可以在线观看的av中文字幕| 在线免费观看日本伦理| 欧洲日韩亚洲一区二区三区| 最新91精品视频在线| 人妻熟女中文字幕aⅴ在线| 青草青永久在线视频18| 蜜臀av久久久久蜜臀av麻豆| 久久久久久9999久久久久| 国产欧美精品不卡在线| 午夜场射精嗯嗯啊啊视频| 亚洲一区二区三区偷拍女厕91| 人人妻人人澡人人爽人人dvl| 99精品视频之69精品视频| 午夜毛片不卡免费观看视频| 青青青爽视频在线播放| 99热99这里精品6国产| 亚洲中文字幕人妻一区| 人妻3p真实偷拍一二区| 国产又粗又硬又猛的毛片视频| 免费观看污视频网站| 日本欧美视频在线观看三区| 蜜桃视频入口久久久| 欧美日韩一区二区电影在线观看| 一级黄片久久久久久久久| 亚洲变态另类色图天堂网| 天天操天天爽天天干| eeuss鲁片一区二区三区| 免费男阳茎伸入女阳道视频 | 夫妻在线观看视频91| 午夜极品美女福利视频| 日视频免费在线观看| 免费在线观看视频啪啪| 免费在线看的黄网站| 非洲黑人一级特黄片| 日本韩国在线观看一区二区| 班长撕开乳罩揉我胸好爽| 中文字幕成人日韩欧美| 无码日韩人妻精品久久| AV天堂一区二区免费试看| 超碰公开大香蕉97| 夜夜嗨av一区二区三区中文字幕| 欧美精品激情在线最新观看视频| 精品区一区二区三区四区人妻 | 一区二区三区四区视频| 瑟瑟视频在线观看免费视频| 日本一二三中文字幕| 自拍偷拍亚洲精品第2页| 天天日天天干天天舔天天射| 色吉吉影音天天干天天操 | 黄色男人的天堂视频| 91精品国产黑色丝袜| 韩国黄色一级二级三级| 国产自拍黄片在线观看| 岛国av高清在线成人在线| 一区二区在线视频中文字幕| 精品人妻一二三区久久| 蜜桃视频17c在线一区二区| 欧美亚洲偷拍自拍色图| 把腿张开让我插进去视频| 视频啪啪啪免费观看| 中文字幕日韩91人妻在线| 亚洲精品亚洲人成在线导航| 亚洲一区二区人妻av| 午夜在线观看岛国av,com| 少妇人妻二三区视频| 日本丰满熟妇大屁股久久| 93精品视频在线观看| 成人高潮aa毛片免费| 福利视频网久久91| 大鸡巴操b视频在线| 国产日韩av一区二区在线| 久久尻中国美女视频| 亚洲欧美综合在线探花| 欧美精品黑人性xxxx| 91小伙伴中女熟女高潮| 69精品视频一区二区在线观看| 欧美精品伦理三区四区| 大香蕉伊人国产在线| 又粗又硬又猛又爽又黄的| 国产日韩一区二区在线看| 国内精品在线播放第一页| 人人妻人人爽人人添夜| 精品高跟鞋丝袜一区二区| 亚洲美女美妇久久字幕组| 免费看国产又粗又猛又爽又黄视频 | 亚洲av男人的天堂你懂的| 美女被肏内射视频网站| 91大屁股国产一区二区| 在线播放 日韩 av| 美女操逼免费短视频下载链接| 2018在线福利视频| 不卡一不卡二不卡三| 成人福利视频免费在线| 免费成人av中文字幕| 国产亚洲天堂天天一区| 国产成人精品福利短视频| 高清成人av一区三区| 人妻久久无码中文成人| 中文字幕日韩无敌亚洲精品| 欧美精产国品一二三产品价格| av在线播放国产不卡| 男人靠女人的逼视频| 亚洲国产欧美国产综合在线| 日日夜夜大香蕉伊人| 天天干天天操天天玩天天射 | 青青青国产免费视频| 白嫩白嫩美女极品国产在线观看| 欧美另类z0z变态| 黄色成年网站午夜在线观看| 超级av免费观看一区二区三区| 国产97在线视频观看| 欧美80老妇人性视频| 999热精品视频在线| 欧美精品资源在线观看| 2021最新热播中文字幕| 一区二区三区 自拍偷拍| wwwxxx一级黄色片| 午夜精品一区二区三区更新| 大香蕉日本伊人中文在线| 日本美女成人在线视频| 中国熟女@视频91| 黄色大片免费观看网站| 日日操综合成人av| 日韩美av高清在线| 91精品激情五月婷婷在线| 天堂v男人视频在线观看| 宅男噜噜噜666国产| 中国视频一区二区三区| 青青青国产免费视频| 亚洲无线观看国产高清在线| 少妇露脸深喉口爆吞精| 久久精品国产23696| 风流唐伯虎电视剧在线观看| 色在线观看视频免费的| 人妻爱爱 中文字幕| 精品一区二区三区在线观看| 偷拍自拍亚洲美腿丝袜| 91福利视频免费在线观看| 又粗又长 明星操逼小视频| 亚洲免费在线视频网站| 久久三久久三久久三久久| 91天堂精品一区二区| 五十路人妻熟女av一区二区| 19一区二区三区在线播放| 国产精品久久久久久久久福交| 欧美老妇精品另类不卡片| 天天日天天添天天爽| 高清一区二区欧美系列| 久久久久久国产精品| 国产高清精品极品美女| 久久久久久性虐视频| 9国产精品久久久久老师| 91大神福利视频网| 美女吃鸡巴操逼高潮视频| 国产91嫩草久久成人在线视频| 欧美精品欧美极品欧美视频 | 亚洲高清国产自产av| 欧美亚洲少妇福利视频| 漂亮 人妻被中出中文| 2o22av在线视频| 婷婷综合亚洲爱久久| 制丝袜业一区二区三区| 真实国模和老外性视频| 欧美成人一二三在线网| 午夜av一区二区三区| 人妻无码中文字幕专区| 777奇米久久精品一区| 91在线免费观看成人| 中文字幕人妻被公上司喝醉在线| av资源中文字幕在线观看| 色综合久久久久久久久中文| 99久久激情婷婷综合五月天| 天天日天天做天天日天天做| 蜜桃色婷婷久久久福利在线| 欧美xxx成人在线| 国产麻豆国语对白露脸剧情| 黄色片黄色片wyaa| 亚洲嫩模一区二区三区| 天天摸天天亲天天舔天天操天天爽 | 国产精品久久久久久久女人18| av中文字幕在线观看第三页| 97精品综合久久在线| 宅男噜噜噜666免费观看| 丝袜肉丝一区二区三区四区在线看| 人妻素人精油按摩中出| 欧美日韩一区二区电影在线观看| 日美女屁股黄邑视频| 天天日天天干天天干天天日| 色97视频在线播放| 国产V亚洲V天堂无码欠欠| 青青在线视频性感少妇和隔壁黑丝 | 大屁股肉感人妻中文字幕在线| 欧美成一区二区三区四区| 亚洲狠狠婷婷综合久久app| 99久久激情婷婷综合五月天| 毛茸茸的大外阴中国视频| 国产亚洲精品欧洲在线观看| 欧美在线偷拍视频免费看| 97人妻人人澡爽人人精品| 日韩人妻xxxxx| 78色精品一区二区三区| 国产午夜无码福利在线看| 日本人妻精品久久久久久| 亚洲 图片 欧美 图片| 亚洲一区二区三区五区| 日本午夜爽爽爽爽爽视频在线观看| 国产高潮无码喷水AV片在线观看| 亚洲在线一区二区欧美| 国产大学生援交正在播放| 涩涩的视频在线观看视频| 免费十精品十国产网站| 果冻传媒av一区二区三区| 九色视频在线观看免费| 成人亚洲精品国产精品 | 欧美日韩不卡一区不区二区| 国产女人露脸高潮对白视频| 国产精品大陆在线2019不卡| 亚洲中文精品字幕在线观看| 欧美怡红院视频在线观看| 丝袜亚洲另类欧美变态| 福利午夜视频在线观看| 国产亚洲欧美视频网站| 91天堂天天日天天操| 大鸡巴后入爆操大屁股美女| 白嫩白嫩美女极品国产在线观看| 最新中文字幕免费视频| 国产精品精品精品999| 粗大的内捧猛烈进出爽大牛汉子| 91精品免费久久久久久| 人妻av无码专区久久绿巨人| 福利午夜视频在线合集| 亚洲av天堂在线播放| 福利午夜视频在线合集| 中文字幕一区二区亚洲一区| 天堂资源网av中文字幕| 国产精品一区二区av国| 93精品视频在线观看| 成熟熟女国产精品一区| 亚洲精品 欧美日韩| 青青青青操在线观看免费| 初美沙希中文字幕在线| 欧美乱妇无乱码一区二区| 自拍偷拍亚洲精品第2页| 国内资源最丰富的网站| 青青尤物在线观看视频网站| 青青青青青青青青青国产精品视频| 揄拍成人国产精品免费看视频| 一二三区在线观看视频| 亚洲av午夜免费观看| a v欧美一区=区三区| 久久精品36亚洲精品束缚| 国产乱子伦一二三区| 91精品资源免费观看| 狍和女人的王色毛片| 中文字幕在线观看极品视频| 女生自摸在线观看一区二区三区 | 国产美女午夜福利久久| 特级欧美插插插插插bbbbb| 男大肉棒猛烈插女免费视频| 国产普通话插插视频| 红桃av成人在线观看| 午夜免费观看精品视频| av亚洲中文天堂字幕网| 视频一区 二区 三区 综合| 福利一二三在线视频观看| 亚欧在线视频你懂的| 亚洲午夜福利中文乱码字幕| 成人区人妻精品一区二视频| 91免费观看在线网站| 欧美精产国品一二三产品价格| 午夜成午夜成年片在线观看| 99的爱精品免费视频| 白嫩白嫩美女极品国产在线观看| 黑人性生活视频免费看| 日韩激情文学在线视频| 男人天堂最新地址av| 日韩黄色片在线观看网站| 2022国产精品视频| 国产伦精品一区二区三区竹菊| 人人在线视频一区二区| yy6080国产在线视频| 欧美日韩在线精品一区二区三| 一色桃子人妻一区二区三区| 国产性生活中老年人视频网站| 久久农村老妇乱69系列| 中文字幕人妻被公上司喝醉在线| 2022天天干天天操| 日韩三级电影华丽的外出 | 国产精品污污污久久| 午夜精品一区二区三区4| 久久精品亚洲国产av香蕉| 欧美成人小视频在线免费看| 中文字幕网站你懂的| 一区二区麻豆传媒黄片| 亚洲av日韩精品久久久久久hd| 超碰公开大香蕉97| 亚洲av日韩av网站| 日曰摸日日碰夜夜爽歪歪| 黄色黄色黄片78在线| 国产自拍黄片在线观看| 国产品国产三级国产普通话三级| 激情五月婷婷综合色啪| 国产精彩福利精品视频| 75国产综合在线视频| 国产一区二区久久久裸臀| 欧美日本在线视频一区| 玩弄人妻熟妇性色av少妇| 91小伙伴中女熟女高潮| 五十路av熟女松本翔子| 国产精品久久久久网| 97超碰人人搞人人| 在线观看911精品国产| 2021国产一区二区| 午夜精品在线视频一区| 日韩成人免费电影二区| 春色激情网欧美成人| 欧洲亚洲欧美日韩综合| 国产a级毛久久久久精品| 国产在线观看免费人成短视频| 午夜精品久久久久久99热| 日韩成人性色生活片| 丰满的子国产在线观看| 国内资源最丰富的网站| 夏目彩春在线中文字幕| 国产亚洲欧美另类在线观看| 天天日天天舔天天射进去| 亚洲av无码成人精品区辽| 日比视频老公慢点好舒服啊| av高潮迭起在线观看| 精品美女福利在线观看| 欧美一区二区中文字幕电影| 亚洲中文字幕国产日韩| 天堂va蜜桃一区入口| 久草视频在线免播放| 人妻丝袜诱惑我操她视频| 99精品国产自在现线观看| 老师让我插进去69AV| 男生舔女生逼逼视频| 欧美精品伦理三区四区| 亚洲精品成人网久久久久久小说| 成人资源在线观看免费官网| 日韩精品一区二区三区在线播放| av老司机精品在线观看| 亚洲日产av一区二区在线| 午夜精品九一唐人麻豆嫩草成人| 一区二区三区视频,福利一区二区| 欧美日韩亚洲国产无线码| 夜鲁夜鲁狠鲁天天在线| 亚洲免费av在线视频| 日本乱人一区二区三区| 亚洲区美熟妇久久久久| 日本一本午夜在线播放| 亚洲国产在人线放午夜| 瑟瑟视频在线观看免费视频| 国产乱子伦精品视频潮优女| 黄色在线观看免费观看在线| 欧美视频一区免费在线| 婷婷五月亚洲综合在线| 91试看福利一分钟| 国产精品国产精品一区二区| 好男人视频在线免费观看网站| 免费观看污视频网站| 男人天堂av天天操| 日韩少妇人妻精品无码专区| 成人av在线资源网站| 日韩欧美国产精品91| 国产之丝袜脚在线一区二区三区| 国产福利小视频二区| 亚洲精品乱码久久久本| 日视频免费在线观看| 亚洲va国产va欧美精品88| 99精品免费观看视频| 人妻少妇av在线观看| 视频一区 二区 三区 综合| 蜜桃视频17c在线一区二区| 亚洲综合色在线免费观看| 黄色黄色黄片78在线| 人人在线视频一区二区| 五十路熟女av天堂| 日本裸体熟妇区二区欧美| 国产视频一区在线观看| 99热这里只有国产精品6| 91九色porny蝌蚪国产成人| 国产黄色a级三级三级三级| 99一区二区在线观看| 又粗又长 明星操逼小视频| 视频一区二区三区高清在线| 直接能看的国产av| 大肉大捧一进一出好爽在线视频| 成人福利视频免费在线| 成人亚洲精品国产精品| 一区二区三区激情在线| 亚洲欧洲一区二区在线观看| 国内自拍第一页在线观看| 超级福利视频在线观看| 色在线观看视频免费的| 日本av熟女在线视频| 亚洲一区二区三区久久午夜| 久久久麻豆精亚洲av麻花| 中文字幕乱码av资源| 大香蕉大香蕉在线有码 av| 岛国黄色大片在线观看| 青青擦在线视频国产在线| 97国产福利小视频合集| 欧美日韩v中文在线| av破解版在线观看| 午夜久久久久久久99| 午夜精彩视频免费一区| 在线视频国产欧美日韩| 国产成人精品午夜福利训2021| 久久久精品欧洲亚洲av| 午夜毛片不卡免费观看视频| 日本三极片视频网站观看| 绯色av蜜臀vs少妇| 天天干天天爱天天色| 欧亚日韩一区二区三区观看视频| 国产女孩喷水在线观看| 午夜国产免费福利av| 农村胖女人操逼视频| 91福利视频免费在线观看| 久久综合老鸭窝色综合久久| 日韩av熟妇在线观看| 国产日本精品久久久久久久| 91精品视频在线观看免费| 青娱乐蜜桃臀av色| 成人高清在线观看视频| 天天日天天日天天射天天干| 黄色黄色黄片78在线| 亚洲一级av无码一级久久精品| 天天干天天插天天谢| 2020久久躁狠狠躁夜夜躁 | 91九色国产熟女一区二区| 成人高潮aa毛片免费| 国产麻豆91在线视频| 欧美天堂av无线av欧美| 亚洲天堂av最新网址| 在线观看的a站 最新| av中文字幕在线导航| 亚洲高清自偷揄拍自拍| 姐姐的朋友2在线观看中文字幕| 黑人乱偷人妻中文字幕| 国产剧情演绎系列丝袜高跟| 亚洲午夜伦理视频在线| 日本熟女精品一区二区三区| 大鸡巴插入美女黑黑的阴毛| 中国无遮挡白丝袜二区精品| 免费大片在线观看视频网站| 青青色国产视频在线| 美女av色播在线播放| 欧美一区二区三区久久久aaa| 97人妻色免费视频| 欧美色呦呦最新网址| 亚洲欧美激情中文字幕| 熟女国产一区亚洲中文字幕| 538精品在线观看视频| 无码日韩人妻精品久久| 97少妇精品在线观看| 日本av熟女在线视频| 香港一级特黄大片在线播放| 亚洲高清国产自产av| 93人妻人人揉人人澡人人| 99re国产在线精品| 日日爽天天干夜夜操| 在线免费观看黄页视频| 老有所依在线观看完整版| 视频一区 视频二区 视频| 成人av中文字幕一区| 午夜成午夜成年片在线观看| 宅男噜噜噜666国产| 亚洲一区二区三区精品视频在线 | 91久久精品色伊人6882| 亚洲高清国产一区二区三区| 婷婷久久久综合中文字幕| 欧美亚洲少妇福利视频| 天天日天天玩天天摸| 91老师蜜桃臀大屁股| 2021久久免费视频| 天美传媒mv视频在线观看| 亚洲男人的天堂a在线| 天天日天天爽天天爽| 亚洲久久午夜av一区二区| 沙月文乃人妻侵犯中文字幕在线| 欧美成人综合色在线噜噜| 香蕉片在线观看av| 综合激情网激情五月五月婷婷| 日韩人妻在线视频免费| 成年美女黄网站18禁久久| 欧美亚洲偷拍自拍色图| 亚洲伊人久久精品影院一美女洗澡| 在线观看操大逼视频| 欧洲亚洲欧美日韩综合| 日韩影片一区二区三区不卡免费| 少妇深喉口爆吞精韩国| 婷婷综合蜜桃av在线| 欧美美女人体视频一区| asmr福利视频在线观看| 国产一区二区火爆视频| 红杏久久av人妻一区| 成人高清在线观看视频| 热99re69精品8在线播放| 激情五月婷婷综合色啪| 人妻少妇性色欲欧美日韩| 久草视频在线看免费| 日韩写真福利视频在线观看| 91国产在线免费播放| 亚洲天堂av最新网址| 国产1区,2区,3区| 亚洲va天堂va国产va久| 少妇ww搡性bbb91| 青青热久免费精品视频在线观看| 一色桃子久久精品亚洲| 国产福利小视频大全| 久久久久久久精品成人热| 色呦呦视频在线观看视频| 亚洲精品午夜久久久久| 特黄老太婆aa毛毛片| 成年女人免费播放视频| 免费黄色成人午夜在线网站| 超级碰碰在线视频免费观看| 扒开腿挺进肉嫩小18禁视频| 狠狠操狠狠操免费视频| 亚洲麻豆一区二区三区| 欧美成人精品在线观看| 中文字幕av男人天堂| 免费观看成年人视频在线观看| 亚洲特黄aaaa片| 精品首页在线观看视频| 久草视频在线免播放| 在线免费观看国产精品黄色| 国产在线一区二区三区麻酥酥 | 中文字幕 人妻精品| 亚洲高清视频在线不卡| 国产精品伦理片一区二区| 免费av岛国天堂网站| av线天堂在线观看| 日韩精品一区二区三区在线播放| 国产91嫩草久久成人在线视频| 亚洲精品无码久久久久不卡| 五十路av熟女松本翔子| 日本av熟女在线视频| 91精品免费久久久久久| 亚洲精品国品乱码久久久久 | 天天日天天敢天天干| 鸡巴操逼一级黄色气| 国产黑丝高跟鞋视频在线播放| 免费观看理论片完整版| 日本一本午夜在线播放| 在线观看免费视频网| 91精品啪在线免费| 天天日天天干天天要| 999九九久久久精品| 亚洲欧美自拍另类图片| 超pen在线观看视频公开97| 免费国产性生活视频| 日韩少妇人妻精品无码专区| 婷婷激情四射在线观看视频| 2020国产在线不卡视频 | 欧美在线偷拍视频免费看| 99热这里只有精品中文| 伊人综合aⅴ在线网| 日日夜夜精品一二三| 99久久99一区二区三区| 任你操任你干精品在线视频| 日日操夜夜撸天天干| 欧美日韩激情啪啪啪| 免费69视频在线看| 免费费一级特黄真人片| 亚洲最大黄了色网站| 欧美国品一二三产区区别| 又色又爽又黄又刺激av网站| 亚洲欧美清纯唯美另类| 老鸭窝日韩精品视频观看| 国产女人露脸高潮对白视频| 亚洲精品无码久久久久不卡| 精品国产污污免费网站入口自| 久久久久久久一区二区三| 国产自拍黄片在线观看| 日韩av大胆在线观看| 天天操天天弄天天射| 丰满的子国产在线观看| 精内国产乱码久久久久久| 人妻久久无码中文成人| 加勒比视频在线免费观看| 中英文字幕av一区| 在线观看视频一区麻豆| 国产精品大陆在线2019不卡| 在线观看亚洲人成免费网址| 亚洲1卡2卡三卡4卡在线观看| 人人妻人人澡人人爽人人dvl| 久精品人妻一区二区三区| jiuse91九色视频| 欧美日韩高清午夜蜜桃大香蕉| 成人高清在线观看视频| aⅴ五十路av熟女中出| 日韩av免费观看一区| 大胆亚洲av日韩av| 久久丁香花五月天色婷婷| 日曰摸日日碰夜夜爽歪歪| 偷拍自拍 中文字幕| 青青热久免费精品视频在线观看 | 黄色男人的天堂视频| 日韩欧美一级精品在线观看| 成人精品在线观看视频| 97成人免费在线观看网站| 欧美天堂av无线av欧美| 青青青青青手机视频| 91av精品视频在线| 亚洲熟女综合色一区二区三区四区| 亚洲欧美综合另类13p| 亚洲国产美女一区二区三区软件 | 欧美日本在线观看一区二区| 国产一区二区三免费视频 | 午夜的视频在线观看| 1000小视频在线| 亚洲区美熟妇久久久久| 午夜美女福利小视频| 一级a看免费观看网站| 欧美偷拍自拍色图片| 国产精品自拍视频大全| 国产午夜激情福利小视频在线| 一区二区三区欧美日韩高清播放| 91she九色精品国产| 国产日本精品久久久久久久| 国产自拍在线观看成人| 亚洲午夜伦理视频在线| 国产欧美日韩第三页| av成人在线观看一区| 国产又粗又硬又大视频| 国产极品精品免费视频| 日本韩国免费福利精品| 男大肉棒猛烈插女免费视频| 欧美黄片精彩在线免费观看| 国产一区成人在线观看视频| 天天干天天日天天谢综合156| 日本人妻欲求不满中文字幕| 大鸡巴插入美女黑黑的阴毛| 91久久综合男人天堂| 2022天天干天天操| 亚洲视频在线观看高清| 欧美精品激情在线最新观看视频| 久久久精品999精品日本| 久久丁香婷婷六月天| 国产1区,2区,3区| av森泽佳奈在线观看| mm131美女午夜爽爽爽| 三级黄色亚洲成人av| 欧洲欧美日韩国产在线| 欧美男人大鸡吧插女人视频| 888欧美视频在线| yy6080国产在线视频| www日韩毛片av| 亚洲av日韩精品久久久久久hd| 日韩精品中文字幕福利| 成年人午夜黄片视频资源| 国内精品在线播放第一页| 又大又湿又爽又紧A视频| 中文字幕+中文字幕| 熟女在线视频一区二区三区| 欧美精品欧美极品欧美视频| 亚洲熟色妇av日韩熟色妇在线| avjpm亚洲伊人久久| 东京热男人的av天堂| 天天躁夜夜躁日日躁a麻豆| 午夜青青草原网在线观看| 亚洲成人免费看电影| 中文字幕乱码av资源| 午夜频道成人在线91| 国产黑丝高跟鞋视频在线播放| 亚洲无码一区在线影院| 成人亚洲精品国产精品| eeuss鲁片一区二区三区| 中文字幕在线第一页成人| 国产免费av一区二区凹凸四季| 阴茎插到阴道里面的视频| 精品久久久久久久久久久99| 国产a级毛久久久久精品| 中文字幕 人妻精品| 懂色av之国产精品| 中文字幕av一区在线观看| 老司机免费视频网站在线看| 蜜桃专区一区二区在线观看| 日本五十路熟新垣里子| 免费在线黄色观看网站| 一本久久精品一区二区| 亚洲激情av一区二区| 2021最新热播中文字幕| 中文字幕第一页国产在线| 精品国产亚洲av一淫| 成熟丰满熟妇高潮xx×xx | 精品一区二区三区欧美| 亚洲av香蕉一区区二区三区犇| 亚洲午夜伦理视频在线| 不卡日韩av在线观看| 中英文字幕av一区| 成年午夜免费无码区| 亚洲 国产 成人 在线| 老鸭窝在线观看一区| 青青草原网站在线观看| 国产美女一区在线观看| 一区二区视频视频视频| 337p日本大胆欧美人| 亚洲国产香蕉视频在线播放| 无码日韩人妻精品久久| 绝顶痉挛大潮喷高潮无码| 99视频精品全部15| 久久久久久97三级| 欧美韩国日本国产亚洲| 久久久久久九九99精品| 另类av十亚洲av| 色偷偷伊人大杳蕉综合网| 青青操免费日综合视频观看| 中文字幕一区的人妻欧美日韩| 91福利在线视频免费观看| 欧美交性又色又爽又黄麻豆| 黄色中文字幕在线播放| 亚洲精品高清自拍av| 一区二区三区的久久的蜜桃的视频| 久久精品美女免费视频| 欧美日韩国产一区二区三区三州| 青青青青草手机在线视频免费看| 亚洲精品一线二线在线观看| 色综合天天综合网国产成人| AV无码一区二区三区不卡| 成人av久久精品一区二区| 精品久久久久久久久久久99| 91啪国自产中文字幕在线| 中文字幕熟女人妻久久久| 男人的天堂在线黄色| 97超碰人人搞人人| 97色视频在线观看| 国产精品午夜国产小视频| 美女福利视频网址导航| 国产熟妇人妻ⅹxxxx麻豆| 青青青视频手机在线观看| 3D动漫精品啪啪一区二区下载| 亚洲国际青青操综合网站| 国产免费高清视频视频| 亚洲成人激情av在线| 欧美怡红院视频在线观看| 欧美国品一二三产区区别| 日韩av有码中文字幕| 五月精品丁香久久久久福利社| 天天干天天搞天天摸| 77久久久久国产精产品| 男人天堂av天天操| av资源中文字幕在线观看| 日本精品美女在线观看| 精品人妻伦一二三区久| 中文字幕熟女人妻久久久| 精品人妻一二三区久久| 亚洲老熟妇日本老妇| 特级无码毛片免费视频播放 | 国产性生活中老年人视频网站| 在线播放一区二区三区Av无码| 521精品视频在线观看| 91亚洲国产成人精品性色| 人妻熟女中文字幕aⅴ在线| 欧美一区二区三区乱码在线播放 | 插小穴高清无码中文字幕| 在线网站你懂得老司机| 瑟瑟视频在线观看免费视频| 国产福利在线视频一区| 在线网站你懂得老司机| 18禁网站一区二区三区四区| 一级黄片大鸡巴插入美女| 精品欧美一区二区vr在线观看| 中文字幕熟女人妻久久久| 欧美3p在线观看一区二区三区| 男人操女人逼逼视频网站| 亚洲人妻av毛片在线| 久久久人妻一区二区| 亚洲护士一区二区三区| 适合午夜一个人看的视频| 欧美日韩激情啪啪啪| 91 亚洲视频在线观看| 91久久综合男人天堂| tube69日本少妇| 国产精品熟女久久久久浪潮| 蜜臀av久久久久久久| 国产亚洲四十路五十路| 欧美成人综合色在线噜噜| 日本脱亚入欧是指什么| 国产麻豆乱子伦午夜视频观看 | 综合激情网激情五月天| 在线网站你懂得老司机| 国产在线观看黄色视频| 午夜大尺度无码福利视频| 男生舔女生逼逼视频| 天天躁日日躁狠狠躁躁欧美av| 又大又湿又爽又紧A视频| 中文人妻AV久久人妻水| 区一区二区三国产中文字幕| 国产一区二区视频观看| 国产chinesehd精品麻豆| 亚洲成人av一区久久| 黑人性生活视频免费看| 2020av天堂网在线观看| 人人妻人人爱人人草| 任你操视频免费在线观看| 青青青青青青青青青国产精品视频| 天天色天天操天天透| 亚洲狠狠婷婷综合久久app | 国产超码片内射在线| 日韩近亲视频在线观看| 黑人大几巴狂插日本少妇| 91老师蜜桃臀大屁股| 在线观看av亚洲情色| 888欧美视频在线| 2022国产综合在线干| 这里有精品成人国产99| 专门看国产熟妇的网站| 国产黄色大片在线免费播放| 午夜的视频在线观看| 91一区精品在线观看| 超级av免费观看一区二区三区| 亚洲精品色在线观看视频| 在线观看的黄色免费网站| 免费在线播放a级片| 六月婷婷激情一区二区三区| 999久久久久999| 青青社区2国产视频| 亚洲 欧美 自拍 偷拍 在线| 亚洲欧美自拍另类图片| 特级无码毛片免费视频播放| 最新91精品视频在线| 午夜精品亚洲精品五月色| 国产又色又刺激在线视频| 不卡一区一区三区在线| 大香蕉大香蕉在线看| 99一区二区在线观看| 热久久只有这里有精品| 一级黄片大鸡巴插入美女| 在线国产精品一区二区三区| 揄拍成人国产精品免费看视频| 亚洲中文字幕人妻一区| 黄色黄色黄片78在线| 国产亚州色婷婷久久99精品| 欧美伊人久久大香线蕉综合| 日韩欧美国产精品91| 日韩国产乱码中文字幕| 日本av熟女在线视频| 1区2区3区不卡视频| 91社福利《在线观看| 自拍偷拍日韩欧美亚洲| 国产精品成久久久久三级蜜臀av| 黄色三级网站免费下载| 中文字幕最新久久久| 免费成人va在线观看| 国产亚洲天堂天天一区| jiujiure精品视频在线| 精品亚洲在线免费观看| 午夜在线精品偷拍一区二| 社区自拍揄拍尻屁你懂的| 日本欧美视频在线观看三区| 色综合久久五月色婷婷综合| 无码国产精品一区二区高潮久久4 日韩欧美一级精品在线观看 | 999九九久久久精品| rct470中文字幕在线| 欧美色呦呦最新网址| 懂色av蜜桃a v| 成人性爱在线看四区| 老鸭窝日韩精品视频观看| 国产精品人妻一区二区三区网站| 国产91久久精品一区二区字幕| 午夜在线观看岛国av,com| 美女大bxxxx内射| 91高清成人在线视频| 动漫精品视频在线观看| 国产精品视频欧美一区二区| 天天摸天天亲天天舔天天操天天爽| 亚洲黄色av网站免费播放| 一本久久精品一区二区| 国产精品sm调教视频| 91片黄在线观看喷潮| 男人的天堂av日韩亚洲| 夜夜操,天天操,狠狠操| 中文字幕在线乱码一区二区| 欧美成人综合视频一区二区| 日韩伦理短片在线观看| 视频二区在线视频观看| 亚洲一区二区三区精品视频在线 | 欧美亚洲一二三区蜜臀| 97小视频人妻一区二区| 国产大鸡巴大鸡巴操小骚逼小骚逼| 国产精品久久久久网| 少妇一区二区三区久久久| 2022天天干天天操| 97人妻色免费视频| 中文字幕一区的人妻欧美日韩| 狠狠地躁夜夜躁日日躁| 一级黄片久久久久久久久| 欧美熟妇一区二区三区仙踪林| 在线观看黄色成年人网站| 成人sm视频在线观看| 我想看操逼黄色大片| 欧美乱妇无乱码一区二区| tube69日本少妇| 亚洲丝袜老师诱惑在线观看| 男人操女人逼逼视频网站| 日本在线不卡免费视频| 国产刺激激情美女网站| 97年大学生大白天操逼| 亚洲中文字幕综合小综合| 精品美女福利在线观看| 久久久久91精品推荐99| 人妻久久久精品69系列| 青青热久免费精品视频在线观看 | 成人av天堂丝袜在线观看| 一区二区三区日韩久久| 国产精品免费不卡av| 亚洲1069综合男同| 亚洲人一区二区中文字幕| 午夜激情久久不卡一区二区| 国产又粗又硬又大视频| 天天想要天天操天天干| 国产chinesehd精品麻豆| 综合激情网激情五月五月婷婷| 免费黄页网站4188| av视网站在线观看| 11久久久久久久久久久| 亚洲 图片 欧美 图片| 五十路老熟女码av| 天天日天天日天天射天天干| 日韩一区二区电国产精品| 亚洲视频在线视频看视频在线| 日本一本午夜在线播放| 一区二区三区另类在线| 欧美一级片免费在线成人观看| 18禁网站一区二区三区四区| 18禁精品网站久久| 中文字幕人妻熟女在线电影| 免费黄高清无码国产| 亚洲人妻国产精品综合| 在线免费观看99视频| 免费在线观看视频啪啪| 亚洲国产成人在线一区| 亚洲Av无码国产综合色区| 东京干手机福利视频| 免费69视频在线看| 91she九色精品国产| 国产九色91在线视频| 老熟妇xxxhd老熟女| 免费观看成年人视频在线观看| 欧美亚洲免费视频观看| 欧美亚洲国产成人免费在线| 大香蕉福利在线观看| 一区二区久久成人网| 青青热久免费精品视频在线观看| av在线shipin| 深夜男人福利在线观看| 日本美女性生活一级片| 亚洲福利精品福利精品福利| 亚洲少妇高潮免费观看| 成人H精品动漫在线无码播放| 国产午夜男女爽爽爽爽爽视频 | 久草视频在线看免费| 综合页自拍视频在线播放| 日韩欧美国产精品91| 亚洲高清视频在线不卡| 888欧美视频在线| 在线免费91激情四射 | 天天干夜夜操啊啊啊| 在线免费观看国产精品黄色| 天天射夜夜操综合网| 熟女人妻三十路四十路人妻斩| 亚洲成人午夜电影在线观看| 2021天天色天天干| 欧美日韩在线精品一区二区三| 少妇与子乱在线观看| wwwxxx一级黄色片| 521精品视频在线观看| 性色蜜臀av一区二区三区| av在线免费中文字幕| 色狠狠av线不卡香蕉一区二区| 天堂va蜜桃一区入口| 中文字幕一区二区人妻电影冢本 | 精品国产乱码一区二区三区乱| 青青青青视频在线播放| 成人av亚洲一区二区| 在线免费观看亚洲精品电影| 欧美伊人久久大香线蕉综合| 99的爱精品免费视频| 欧美伊人久久大香线蕉综合| 97人妻无码AV碰碰视频| 曰本无码人妻丰满熟妇啪啪| 亚洲综合色在线免费观看| 中文字幕+中文字幕| 亚洲最大黄 嗯色 操 啊| 亚洲免费视频欧洲免费视频| 色综合久久无码中文字幕波多| 亚洲午夜在线视频福利| 日本少妇的秘密免费视频| 黄色av网站免费在线| 99婷婷在线观看视频| 视频啪啪啪免费观看| 毛片av在线免费看| 自拍偷拍 国产资源| 不卡精品视频在线观看| 99精品免费观看视频| 内射久久久久综合网| 国产在线观看免费人成短视频| 人妻久久久精品69系列| 国产精品日韩欧美一区二区| 女同性ⅹxx女同h偷拍| 日韩欧美亚洲熟女人妻| 精品人妻每日一部精品| 国产麻豆剧果冻传媒app| 日日爽天天干夜夜操| 五月天久久激情视频| 欧洲国产成人精品91铁牛tv| 国产精品人妻66p| 亚洲日本一区二区久久久精品| 欧美另类一区二区视频| 久久这里有免费精品| 黄片色呦呦视频免费看| 黑人解禁人妻叶爱071| 91小伙伴中女熟女高潮| 最近中文字幕国产在线| 岛国一区二区三区视频在线| 九色porny九色9l自拍视频| 天天干天天操天天玩天天射| 日本精品一区二区三区在线视频。| 亚洲最大免费在线观看| 日本后入视频在线观看| 免费岛国喷水视频在线观看| 国产精品一二三不卡带免费视频| 青青青青爽手机在线| 新97超碰在线观看| 骚逼被大屌狂草视频免费看| 啊啊啊想要被插进去视频| 亚洲综合图片20p| 97人妻色免费视频| 18禁美女羞羞免费网站| 亚洲天天干 夜夜操| 国产伦精品一区二区三区竹菊| 99国内精品永久免费视频| 动漫美女的小穴视频| av天堂中文字幕最新| 国产精品人妻66p| 亚洲中文字幕校园春色| 人妻少妇性色欲欧美日韩| 欧美专区日韩专区国产专区| avjpm亚洲伊人久久| 最新91精品视频在线| 欧洲亚洲欧美日韩综合| 日韩av有码一区二区三区4| 亚洲一区二区久久久人妻| 大鸡巴后入爆操大屁股美女| 亚洲av无乱一区二区三区性色| caoporm超碰国产| 国产精品一区二区三区蜜臀av| 57pao国产一区二区| 在线观看一区二区三级| 在线免费观看国产精品黄色| 岛国毛片视频免费在线观看| 成人av免费不卡在线观看| 毛片一级完整版免费| 亚洲成人情色电影在线观看| 播放日本一区二区三区电影 | 在线观看视频网站麻豆| 动漫黑丝美女的鸡巴| 日韩激情文学在线视频| 亚洲国产免费av一区二区三区| 综合色区亚洲熟妇shxstz| 大胆亚洲av日韩av| 日韩美女精品视频在线观看网站| 人妻无码中文字幕专区| 精品久久久久久久久久中文蒉| 国产一区二区欧美三区| 国产性感美女福利视频| 亚洲粉嫩av一区二区三区| 无码中文字幕波多野不卡| 免费在线黄色观看网站| 亚洲特黄aaaa片| 日本一二三中文字幕| 亚洲成人av一区在线| 亚洲av男人的天堂你懂的| 日日操夜夜撸天天干| 国产又粗又黄又硬又爽| 国产精品免费不卡av| 99精品久久久久久久91蜜桃| 日韩人妻xxxxx| 91欧美在线免费观看| av破解版在线观看| 亚洲成人精品女人久久久| 成人蜜桃美臀九一一区二区三区| 五十路老熟女码av| 色在线观看视频免费的| 免费无码人妻日韩精品一区二区| 这里有精品成人国产99| 中文字幕人妻被公上司喝醉在线| 日本精品一区二区三区在线视频。| 女人精品内射国产99| 天天操天天干天天日狠狠插| 亚洲伊人久久精品影院一美女洗澡| 日本黄色特一级视频| 夜色福利视频在线观看| 99精品免费观看视频| 国产美女午夜福利久久| 天天干天天爱天天色| 91色网站免费在线观看| 91精品国产观看免费| 精品美女在线观看视频在线观看| 韩国黄色一级二级三级| 国产精品久久综合久久| 国产欧美精品一区二区高清 | 精品少妇一二三视频在线| 日本人妻精品久久久久久| 密臀av一区在线观看| 久久久久久9999久久久久| 污污小视频91在线观看| 亚洲 中文 自拍 无码| 婷婷久久久久深爱网| 国内精品在线播放第一页| 91she九色精品国产| 国产精品熟女久久久久浪潮| 亚洲人一区二区中文字幕| 好了av中文字幕在线| 日韩中文字幕在线播放第二页| 97精品综合久久在线| 一区二区三区四区视频| 天天做天天干天天操天天射| 白白操白白色在线免费视频 | 人妻丝袜榨强中文字幕| 免费黄高清无码国产| 国产亚洲天堂天天一区| 天天艹天天干天天操| 亚洲成人精品女人久久久| 亚洲熟女久久久36d| 免费观看理论片完整版| 美女日逼视频免费观看| 亚洲一级特黄特黄黄色录像片| 一区二区视频在线观看免费观看| 亚洲卡1卡2卡三卡四老狼| 久久亚洲天堂中文对白| 97国产在线av精品| 成人综合亚洲欧美一区| 五十路在线观看完整版| 在线免费观看av日韩| 熟女人妻三十路四十路人妻斩| 中文字幕奴隷色的舞台50| 久久免看30视频口爆视频| 91国产资源在线视频| 视频一区二区综合精品| 老司机福利精品免费视频一区二区| 精品亚洲在线免费观看| 无码国产精品一区二区高潮久久4| 超黄超污网站在线观看| 免费福利av在线一区二区三区| 日韩美av高清在线| 亚洲国产精品美女在线观看| 国产成人自拍视频播放| 亚洲推理片免费看网站| 亚洲精品无码久久久久不卡| 亚洲一区二区人妻av| 久久这里只有精品热视频| 亚洲免费福利一区二区三区| 天堂av在线播放免费| 国产高潮无码喷水AV片在线观看| 国产日本精品久久久久久久| 成人区人妻精品一区二视频| 精品一区二区三区在线观看| 精品一区二区亚洲欧美| 极品丝袜一区二区三区| 国产成人午夜精品福利| 果冻传媒av一区二区三区| 孕妇奶水仑乱A级毛片免费看| 大白屁股精品视频国产| 99视频精品全部15| 欧美日韩人妻久久精品高清国产| 亚洲va国产va欧美精品88| 亚洲欧美国产麻豆综合| 亚洲欧美成人综合视频| 亚洲欧美在线视频第一页| avjpm亚洲伊人久久| 激情五月婷婷免费视频| 亚洲人妻视频在线网| 亚洲精品av在线观看| 888亚洲欧美国产va在线播放| 国产精品自拍偷拍a| 中文亚洲欧美日韩无线码| 绝色少妇高潮3在线观看| 人妻少妇亚洲精品中文字幕| 国产欧美精品免费观看视频| 日韩成人性色生活片| 美女福利视频网址导航| 性欧美日本大妈母与子| 我想看操逼黄色大片| 精品久久久久久久久久久99| 久久精品国产亚洲精品166m| 亚洲嫩模一区二区三区| 欧美激情精品在线观看| 天天色天天操天天舔| 2025年人妻中文字幕乱码在线| 超碰中文字幕免费观看| 亚洲 国产 成人 在线| 人妻在线精品录音叫床| 97国产精品97久久| 六月婷婷激情一区二区三区| 午夜精品一区二区三区福利视频| jiujiure精品视频在线| 在线免费视频 自拍| 国产午夜亚洲精品不卡在线观看| 青青青激情在线观看视频| 操日韩美女视频在线免费看| 日曰摸日日碰夜夜爽歪歪 | 亚洲区美熟妇久久久久| 91成人在线观看免费视频| 人妻激情图片视频小说| 在线国产日韩欧美视频| 激情五月婷婷综合色啪| 亚洲图库另类图片区| 男女啪啪视频免费在线观看| 国产妇女自拍区在线观看| 国产性色生活片毛片春晓精品| 精品国产在线手机在线| 中文字幕人妻熟女在线电影| 岛国黄色大片在线观看| 青青青青青青草国产| 大香蕉伊人国产在线| 亚洲精品久久综合久| 天天日夜夜干天天操| www,久久久,com| 人妻少妇亚洲一区二区| 日本www中文字幕| 玖玖一区二区在线观看| 亚洲午夜精品小视频| 中文乱理伦片在线观看| 久久精品国产23696| 激情啪啪啪啪一区二区三区| 天天艹天天干天天操| 大骚逼91抽插出水视频| 国产熟妇一区二区三区av| 最新97国产在线视频| 麻豆精品成人免费视频| 国产黄色a级三级三级三级| 中文字幕1卡1区2区3区| 亚洲熟色妇av日韩熟色妇在线| 人妻少妇一区二区三区蜜桃| 天天干夜夜操天天舔| 亚洲区美熟妇久久久久| 亚洲成人国产综合一区| 久久人人做人人妻人人玩精品vr| 97超碰国语国产97超碰| 1000部国产精品成人观看视频| 欧美一级片免费在线成人观看| av在线免费中文字幕| 亚洲天堂精品福利成人av| 国产精品亚洲在线观看| 色综合色综合色综合色| 无码中文字幕波多野不卡| 欧美熟妇一区二区三区仙踪林| 亚洲中文字字幕乱码| 红杏久久av人妻一区| 日韩不卡中文在线视频网站| av网址国产在线观看| 最新中文字幕乱码在线| 手机看片福利盒子日韩在线播放| 日韩美av高清在线| 欧美日韩人妻久久精品高清国产| www日韩毛片av| 午夜精品在线视频一区| 中文字幕一区二区自拍| 国产午夜亚洲精品不卡在线观看| 久久久人妻一区二区| 91色秘乱一区二区三区| 一二三中文乱码亚洲乱码one| 无套猛戳丰满少妇人妻| 天堂av狠狠操蜜桃| 欧美成人猛片aaaaaaa| av一本二本在线观看| 在线播放国产黄色av| 国产V亚洲V天堂无码欠欠| 老司机在线精品福利视频| 亚洲一区二区三区久久受| 2021最新热播中文字幕| 亚洲专区激情在线观看视频| 天干天天天色天天日天天射| 久久久久久久99精品| 亚洲福利午夜久久久精品电影网 | 99一区二区在线观看| 97青青青手机在线视频| 狠狠操操操操操操操操操| 国产亚洲精品视频合集| 亚洲第一伊人天堂网| 大尺度激情四射网站| 亚洲国产精品黑丝美女| 男女第一次视频在线观看| 特级无码毛片免费视频播放| 国产污污污污网站在线| 在线国产精品一区二区三区| 绯色av蜜臀vs少妇| 巨乳人妻日下部加奈被邻居中出| 亚洲女人的天堂av| 亚洲免费福利一区二区三区| 日韩不卡中文在线视频网站| 丝袜国产专区在线观看| 午夜在线精品偷拍一区二| 婷婷久久久综合中文字幕| mm131美女午夜爽爽爽| 亚洲精品福利网站图片| 另类av十亚洲av| 亚洲综合一区二区精品久久| 成人高清在线观看视频| 夜夜嗨av一区二区三区中文字幕| 欧美偷拍自拍色图片| 青青青青青青草国产| 五十路熟女人妻一区二区9933| 欧美日韩不卡一区不区二区| 日韩欧美亚洲熟女人妻| 蜜桃视频17c在线一区二区| 亚洲欧美人精品高清| 久久久久久九九99精品| 男人的网址你懂的亚洲欧洲av| 黄色视频在线观看高清无码| 在线免费观看日本片| 九色精品视频在线播放| 91人妻精品一区二区在线看| 久精品人妻一区二区三区| 亚洲自拍偷拍综合色| 欧美精品中文字幕久久二区| 中英文字幕av一区| 护士特殊服务久久久久久久| 伊人开心婷婷国产av| 亚洲欧美国产麻豆综合| 夜女神免费福利视频| 操人妻嗷嗷叫视频一区二区| 成人网18免费视频版国产| 极品性荡少妇一区二区色欲| 日视频免费在线观看| 夜夜嗨av蜜臀av| jul—619中文字幕在线| 香蕉91一区二区三区| 一区二区三区欧美日韩高清播放| 欧美另类重口味极品在线观看| 天天做天天爽夜夜做少妇| 久久精品亚洲国产av香蕉| 2021最新热播中文字幕| 日韩精品中文字幕在线| 五月婷婷在线观看视频免费| 天天夜天天日天天日| 91国产在线视频免费观看| 日韩人妻在线视频免费| 在线观看911精品国产| 大香蕉日本伊人中文在线| 动色av一区二区三区| 国产精品人久久久久久| 白白操白白色在线免费视频| 538精品在线观看视频| 午夜大尺度无码福利视频| 人人爽亚洲av人人爽av| 精品国产成人亚洲午夜| 欧美区一区二区三视频| 国产av欧美精品高潮网站| 干逼又爽又黄又免费的视频| 国产熟妇乱妇熟色T区| 久久久久久久精品成人热| 亚洲国产美女一区二区三区软件 | 热99re69精品8在线播放| 国产又粗又猛又爽又黄的视频美国| 中文字母永久播放1区2区3区| 白嫩白嫩美女极品国产在线观看| 中文字幕乱码人妻电影| 欧美激情电影免费在线| 日本黄在免费看视频| 中文字幕乱码av资源| 亚洲综合乱码一区二区| 97青青青手机在线视频| 五月激情婷婷久久综合网| 78色精品一区二区三区| 岛国黄色大片在线观看| 色综合色综合色综合色| 偷拍自拍 中文字幕| 中文字幕中文字幕人妻| 男生舔女生逼逼视频| 91精品免费久久久久久| 亚洲av无码成人精品区辽| 综合精品久久久久97| 真实国模和老外性视频| 一级黄片久久久久久久久| 午夜福利资源综合激情午夜福利资| 久久h视频在线观看| 国产自拍黄片在线观看| 97色视频在线观看| 国产福利小视频免费观看| 91人妻精品久久久久久久网站| 黄色成年网站午夜在线观看 | 男人天堂最新地址av| 免费费一级特黄真人片| 日韩中文字幕福利av| 国产一区二区神马久久| 成年人免费看在线视频| 青青青青青手机视频| nagger可以指黑人吗| okirakuhuhu在线观看| 国产中文精品在线观看| 色综合色综合色综合色| 色在线观看视频免费的| 亚洲一区二区人妻av| 亚洲国产精品黑丝美女| 一区二区三区综合视频| 人人妻人人爽人人澡人人精品| 91精品国产麻豆国产| 欧美另类重口味极品在线观看| 日韩成人免费电影二区| 国产精品人妻一区二区三区网站 | 福利午夜视频在线观看| 黑人借宿ntr人妻的沦陷2| 中文字幕在线欧美精品| 97青青青手机在线视频 | 98视频精品在线观看| 欲满人妻中文字幕在线| 成人激情文学网人妻| 女生自摸在线观看一区二区三区| 日韩精品激情在线观看| 中文字幕日韩精品就在这里| 天天干天天爱天天色| 亚洲中文字字幕乱码| 高潮喷水在线视频观看| 中文字幕视频一区二区在线观看| 中文字幕高清在线免费播放| 久久精品久久精品亚洲人| 色偷偷伊人大杳蕉综合网| 青青青视频手机在线观看| 动漫av网站18禁| 青春草视频在线免费播放| 97超碰免费在线视频| 亚洲精品午夜久久久久| 欧美成人综合色在线噜噜| 亚洲偷自拍高清视频| 亚洲午夜电影之麻豆| 亚洲国际青青操综合网站| 又大又湿又爽又紧A视频| 亚洲国产成人av在线一区| 亚洲在线免费h观看网站| av天堂中文字幕最新| 日本高清成人一区二区三区| 五月精品丁香久久久久福利社| 日本熟妇色熟妇在线观看| 3344免费偷拍视频| 中国无遮挡白丝袜二区精品| 婷婷色国产黑丝少妇勾搭AV| 美日韩在线视频免费看| 老有所依在线观看完整版| 亚洲免费成人a v| 天堂女人av一区二区| 免费无毒热热热热热热久| 亚洲一区av中文字幕在线观看| 天天操天天操天天碰| 九九热99视频在线观看97| 91精品国产黑色丝袜| 亚洲一区av中文字幕在线观看| 国产日韩欧美美利坚蜜臀懂色| 黄色三级网站免费下载| 黄色男人的天堂视频| 欧美精品免费aaaaaa| 直接能看的国产av| 久久久制服丝袜中文字幕| 亚洲欧美激情国产综合久久久| 国产女人被做到高潮免费视频| 国产女人叫床高潮大片视频| 老有所依在线观看完整版| 国产综合高清在线观看| ka0ri在线视频| 日韩写真福利视频在线观看| 成人国产小视频在线观看| 传媒在线播放国产精品一区| 亚洲综合图片20p| jul—619中文字幕在线| 天天摸天天日天天操| 丰满的继坶3中文在线观看| 久久三久久三久久三久久| 99热国产精品666| 亚洲国产精品美女在线观看| 五色婷婷综合狠狠爱| 久久久精品欧洲亚洲av| 漂亮 人妻被中出中文| 青青擦在线视频国产在线| 四川五十路熟女av| 高潮喷水在线视频观看| 精品一区二区亚洲欧美| 日本熟妇丰满厨房55| 丝袜肉丝一区二区三区四区在线看| 亚洲2021av天堂| 男人的天堂av日韩亚洲| av网址在线播放大全| 99久久成人日韩欧美精品| av在线资源中文字幕| 97黄网站在线观看| 插逼视频双插洞国产操逼插洞| 丁香花免费在线观看中文字幕 | 天天干夜夜操啊啊啊| 欧美怡红院视频在线观看| 国语对白xxxx乱大交| 丝袜国产专区在线观看| 18禁美女羞羞免费网站| tube69日本少妇| 国产三级片久久久久久久 | 成人av久久精品一区二区| 夜色17s精品人妻熟女| 国产成人综合一区2区| 久久热久久视频在线观看| 特级无码毛片免费视频播放| 97人妻总资源视频| 欧美亚洲牲夜夜综合久久| caoporm超碰国产| 91人妻精品久久久久久久网站| 国产精品中文av在线播放 | 国产成人精品午夜福利训2021| 丰满的继坶3中文在线观看| 漂亮 人妻被中出中文| 午夜精品久久久久久99热| 日韩美女综合中文字幕pp| 麻豆精品成人免费视频| huangse网站在线观看| 少妇人妻久久久久视频黄片| 黑人巨大精品欧美视频| 天天日天天爽天天爽| 成人免费公开视频无毒| 欧美 亚洲 另类综合| 大陆胖女人与丈夫操b国语高清| 狠狠嗨日韩综合久久| 欧美精品国产综合久久| 顶级尤物粉嫩小尤物网站| 国产高清精品一区二区三区| 99国产精品窥熟女精品| 天天艹天天干天天操| 亚洲另类综合一区小说| 在线观看国产免费麻豆| 在线观看免费av网址大全| 青青草人人妻人人妻| 久久精品36亚洲精品束缚| 青青青国产片免费观看视频| 亚洲少妇高潮免费观看| gogo国模私拍视频| 亚洲天天干 夜夜操| 人人妻人人爽人人添夜| 午夜青青草原网在线观看| 在线观看视频 你懂的| 青青擦在线视频国产在线| 国产欧美精品不卡在线| 人人妻人人人操人人人爽| 人妻另类专区欧美制服| 在线观看国产免费麻豆| yellow在线播放av啊啊啊| 99热这里只有精品中文| 果冻传媒av一区二区三区 | 日韩欧美亚洲熟女人妻| 啊慢点鸡巴太大了啊舒服视频| 在线观看黄色成年人网站| 国产精品成久久久久三级蜜臀av| 精品少妇一二三视频在线| 亚洲熟妇x久久av久久| 国产黄色大片在线免费播放| 日本女大学生的黄色小视频| 亚洲 图片 欧美 图片| av天堂资源最新版在线看| 欧美 亚洲 另类综合| 一区二区三区日本伦理| 中国视频一区二区三区| 欧洲亚洲欧美日韩综合| 99热色原网这里只有精品| 密臀av一区在线观看| av森泽佳奈在线观看| 青青青国产免费视频| 亚洲一区二区激情在线| AV天堂一区二区免费试看| 亚洲偷自拍高清视频| 亚洲va国产va欧美精品88| 青青青激情在线观看视频| 精品91高清在线观看| 99一区二区在线观看| 欧美色呦呦最新网址| 色综合天天综合网国产成人| www天堂在线久久| 中文字幕在线观看国产片| 黑人借宿ntr人妻的沦陷2| 一区二区三区毛片国产一区| 精品一区二区亚洲欧美| 国产视频网站国产视频| 亚洲av自拍偷拍综合| 亚洲一区二区三区在线高清| 韩国爱爱视频中文字幕| 国产精品伦理片一区二区| 综合精品久久久久97| 2021最新热播中文字幕| 老司机99精品视频在线观看| 一区二区三区综合视频| 熟女视频一区,二区,三区| 青青草国内在线视频精选| 2021久久免费视频| 换爱交换乱高清大片| 日本av在线一区二区三区| 老司机午夜精品视频资源| 久草视频中文字幕在线观看| 亚洲av在线观看尤物| 中英文字幕av一区| 国产午夜激情福利小视频在线| 欧美国产亚洲中英文字幕| 青青青爽视频在线播放| 久久农村老妇乱69系列| 欧美一级色视频美日韩| 91av中文视频在线| 韩国三级aaaaa高清视频 | 最后99天全集在线观看| 国产一区二区在线欧美| 亚洲欧美激情人妻偷拍| 蜜臀av久久久久久久| 宅男噜噜噜666免费观看| 五十路人妻熟女av一区二区| 成年人的在线免费视频| 成人精品在线观看视频| 人人妻人人澡人人爽人人dvl| 五十路熟女人妻一区二区9933| 丝袜肉丝一区二区三区四区在线看| 三级等保密码要求条款| 亚洲精品欧美日韩在线播放| 91天堂天天日天天操| 亚洲激情偷拍一区二区| 视频一区二区三区高清在线| 日本少妇在线视频大香蕉在线观看| 国产在线一区二区三区麻酥酥| 换爱交换乱高清大片| 男生用鸡操女生视频动漫| 91在线免费观看成人| 日本少妇人妻xxxxx18| 欧美交性又色又爽又黄麻豆| 在线国产精品一区二区三区| 国产成人精品一区在线观看| 中英文字幕av一区| 91麻豆精品久久久久| 免费在线播放a级片| 大胆亚洲av日韩av| 午夜大尺度无码福利视频| 97人妻色免费视频| 青青草在观免费国产精品| 超碰97免费人妻麻豆| 五月色婷婷综合开心网4438| 青青青国产片免费观看视频| 国产剧情演绎系列丝袜高跟| 中英文字幕av一区| 9色在线视频免费观看| 91福利在线视频免费观看| 国产麻豆剧传媒精品国产av蜜桃| 黄色三级网站免费下载| 最新日韩av传媒在线| 特大黑人巨大xxxx| 色吉吉影音天天干天天操| 日韩欧美一级aa大片| 天天躁日日躁狠狠躁躁欧美av| 成人亚洲精品国产精品 | 久久精品国产23696| 五月天中文字幕内射| 日韩中文字幕福利av| 青娱乐在线免费视频盛宴| 亚洲美女美妇久久字幕组| 国产成人无码精品久久久电影| 国产日本欧美亚洲精品视| 韩国三级aaaaa高清视频| 91久久综合男人天堂| 最新国产亚洲精品中文在线| 在线可以看的视频你懂的| 亚洲偷自拍高清视频| 亚洲欧美福利在线观看| 日日摸夜夜添夜夜添毛片性色av| 这里只有精品双飞在线播放| 中文字幕人妻熟女在线电影| 中文字幕无码日韩专区免费| 无忧传媒在线观看视频| 自拍偷拍一区二区三区图片| 国产成人午夜精品福利| 欧美日本aⅴ免费视频| 99国内精品永久免费视频| 国产日本欧美亚洲精品视| 成人伊人精品色xxxx视频| 国产成人自拍视频播放| 国产三级片久久久久久久| 人妻凌辱欧美丰满熟妇| 欧美精品 日韩国产| 亚洲av天堂在线播放| 5528327男人天堂| 久久农村老妇乱69系列| 一区二区三区四区视频| 专门看国产熟妇的网站| 欧美亚洲国产成人免费在线| 青娱乐蜜桃臀av色| 免费在线黄色观看网站| 中文字幕熟女人妻久久久| 青青热久免费精品视频在线观看| 久久这里只有精彩视频免费| 天堂av狠狠操蜜桃| 老司机午夜精品视频资源| 青青青激情在线观看视频| 久久农村老妇乱69系列| 青青草亚洲国产精品视频| 中文亚洲欧美日韩无线码| 好了av中文字幕在线| av成人在线观看一区| 中文字幕av第1页中文字幕| 鸡巴操逼一级黄色气| 国产精品3p和黑人大战| 久久美欧人妻少妇一区二区三区| 亚洲av香蕉一区区二区三区犇| 国产中文字幕四区在线观看| 日韩人妻xxxxx| 国产性色生活片毛片春晓精品 | 亚洲 欧美 精品 激情 偷拍| 91久久综合男人天堂| 国产午夜亚洲精品麻豆| 国产精品欧美日韩区二区| 最新91精品视频在线| 午夜激情久久不卡一区二区| gogo国模私拍视频| 国内自拍第一页在线观看| 2020久久躁狠狠躁夜夜躁| 日韩成人免费电影二区| 日本www中文字幕| 天堂av中文在线最新版| 国产av国片精品一区二区| 丝袜肉丝一区二区三区四区在线| 少妇ww搡性bbb91| 免费啪啪啪在线观看视频| 1区2区3区不卡视频| 婷婷久久久久深爱网| 人人妻人人人操人人人爽| 国产91久久精品一区二区字幕| 色婷婷久久久久swag精品| 国产a级毛久久久久精品| 日日夜夜狠狠干视频| 欧美精品欧美极品欧美视频| 中国产一级黄片免费视频播放| 男女啪啪视频免费在线观看| www天堂在线久久| 欧美专区第八页一区在线播放| 久久三久久三久久三久久| 青青色国产视频在线| 久久久久久九九99精品| 精品成人啪啪18免费蜜臀| 青青青青视频在线播放| 熟女视频一区,二区,三区| 黄色成年网站午夜在线观看| 超碰97免费人妻麻豆| 亚洲美女美妇久久字幕组| 天天日天天日天天射天天干| 免费在线看的黄片视频| 在线国产精品一区二区三区| 黄色片年轻人在线观看| 人人爱人人妻人人澡39| 97超碰免费在线视频| 婷婷午夜国产精品久久久| 天天操天天射天天操天天天| 91老师蜜桃臀大屁股| 久久精品久久精品亚洲人| 色呦呦视频在线观看视频| 国产日韩精品一二三区久久久| 国产精品久久久久国产三级试频 | 国产妇女自拍区在线观看| 中文字幕亚洲中文字幕| 色吉吉影音天天干天天操| 不卡精品视频在线观看| 一区二区三区激情在线| 我想看操逼黄色大片| 1024久久国产精品| 中文亚洲欧美日韩无线码| 国产福利小视频二区| av中文字幕在线导航| 97国产精品97久久| 青青青青青青草国产| 成人蜜桃美臀九一一区二区三区| 日本丰满熟妇大屁股久久| 中文乱理伦片在线观看| 男女啪啪啪啪啪的网站| av日韩在线免费播放| 夜色17s精品人妻熟女| 伊人开心婷婷国产av| 美女 午夜 在线视频| 久久www免费人成一看片| 不卡一不卡二不卡三| 亚欧在线视频你懂的| av手机免费在线观看高潮| 亚洲一区二区三区uij| 久久www免费人成一看片| 亚洲 人妻 激情 中文| 操人妻嗷嗷叫视频一区二区| weyvv5国产成人精品的视频| 国产成人精品av网站| 激情内射在线免费观看| 青青草精品在线视频观看| 国产普通话插插视频| 日本午夜久久女同精女女| 日本性感美女视频网站| 蜜臀av久久久久蜜臀av麻豆| 熟妇一区二区三区高清版| 国产视频在线视频播放| 夜夜操,天天操,狠狠操| 99精品久久久久久久91蜜桃| avjpm亚洲伊人久久| 美女大bxxxx内射| 欧洲亚洲欧美日韩综合| lutube在线成人免费看| 香蕉片在线观看av| av手机免费在线观看高潮| 亚洲国际青青操综合网站| 在线观看视频一区麻豆| 在线观看免费av网址大全| 国产日韩欧美美利坚蜜臀懂色| 国产中文字幕四区在线观看| 1区2区3区不卡视频| 亚洲一级美女啪啪啪| 中文字幕一区二区自拍| 亚洲中文字幕乱码区| 北条麻妃高跟丝袜啪啪| 黑人乱偷人妻中文字幕| 成人国产小视频在线观看| 午夜美女少妇福利视频| 阴茎插到阴道里面的视频| 顶级尤物粉嫩小尤物网站| okirakuhuhu在线观看| 瑟瑟视频在线观看免费视频| 久久精品国产23696| 自拍偷拍,中文字幕| 亚洲成人av一区在线| 99精品视频在线观看婷婷| 亚洲欧美一区二区三区电影| asmr福利视频在线观看| 懂色av蜜桃a v| a v欧美一区=区三区| 国产欧美精品不卡在线| 在线免费视频 自拍| 国产精品三级三级三级| 国产视频在线视频播放| 日韩欧美亚洲熟女人妻| 亚洲一区二区三区五区| 国产精品系列在线观看一区二区| 免费国产性生活视频| av在线免费资源站| 亚洲综合色在线免费观看| 中文字幕一区二 区二三区四区| 中文字幕av男人天堂| 欧美精品资源在线观看| 红杏久久av人妻一区| 中文字幕人妻av在线观看| 啪啪啪啪啪啪啪啪啪啪黄色| 国产精品伦理片一区二区| 国产大学生援交正在播放| 高潮视频在线快速观看国家快速| 国产精品人久久久久久| 久久久久久久亚洲午夜综合福利| japanese五十路熟女熟妇| 大黑人性xxxxbbbb| 欧美亚洲免费视频观看| 亚洲一级av无码一级久久精品| 日本免费一级黄色录像| 无码中文字幕波多野不卡| 毛茸茸的大外阴中国视频| 亚洲欧美综合另类13p| 亚洲欧美成人综合视频| 女同性ⅹxx女同hd| 北条麻妃高跟丝袜啪啪| 最新欧美一二三视频| 欧洲精品第一页欧洲精品亚洲| 精品亚洲国产中文自在线| 天天干夜夜操天天舔| 国产亚洲视频在线二区| 亚洲成人三级在线播放 | 免费av岛国天堂网站| 天天干夜夜操天天舔| 国产 在线 免费 精品| 男生舔女生逼逼视频| 91国语爽死我了不卡| 免费黄色成人午夜在线网站| japanese日本熟妇另类| 精品亚洲中文字幕av| 青青青激情在线观看视频| 干逼又爽又黄又免费的视频| 黄色男人的天堂视频| 日韩av有码一区二区三区4| 91麻豆精品传媒国产黄色片| 女生自摸在线观看一区二区三区| 午夜精品九一唐人麻豆嫩草成人| 瑟瑟视频在线观看免费视频| 91精品高清一区二区三区| 一区二区三区麻豆福利视频| 国产麻豆国语对白露脸剧情 | 成人免费公开视频无毒| 亚洲 清纯 国产com| av中文字幕国产在线观看| 久久永久免费精品人妻专区| 黑人性生活视频免费看| 极品性荡少妇一区二区色欲| 国产精品久久久久久久久福交| 天干天天天色天天日天天射| 一个色综合男人天堂| 一区二区三区av高清免费| 亚洲美女美妇久久字幕组| 沈阳熟妇28厘米大战黑人| 久久久精品国产亚洲AV一| 日日日日日日日日夜夜夜夜夜夜| 国产一线二线三线的区别在哪 | 日本av在线一区二区三区| 2017亚洲男人天堂| 在线免费观看亚洲精品电影| 2018最新中文字幕在线观看| 91久久精品色伊人6882| 亚洲一区二区三区av网站| 欧美黑人性猛交xxxxⅹooo| gogo国模私拍视频| 日韩欧美一级黄片亚洲| 国产黄色a级三级三级三级| 夜色17s精品人妻熟女| 天天做天天干天天舔| 国产成人精品亚洲男人的天堂| 91麻豆精品传媒国产黄色片| 在线观看视频网站麻豆| 91九色porny国产蝌蚪视频| 亚洲免费va在线播放| 欧洲日韩亚洲一区二区三区| 一区二区麻豆传媒黄片| 激情色图一区二区三区| 香蕉片在线观看av| 亚洲激情唯美亚洲激情图片| 欧美在线精品一区二区三区视频 | 精品一区二区三区午夜| 日本av高清免费网站| 国产视频精品资源网站| 亚洲成人熟妇一区二区三区| 一区二区三区 自拍偷拍| 亚洲一区av中文字幕在线观看| 亚洲一区自拍高清免费视频| 久久三久久三久久三久久| 欧美亚洲自偷自拍 在线| 黄色中文字幕在线播放| 丝袜肉丝一区二区三区四区在线| 国产变态另类在线观看| 欧洲亚洲欧美日韩综合| 中文字幕人妻被公上司喝醉在线 | 黄色片黄色片wyaa| 国产va精品免费观看| 国产欧美精品不卡在线| 人人爱人人妻人人澡39| 天天射,天天操,天天说| 女同性ⅹxx女同hd| 97超碰国语国产97超碰| 97成人免费在线观看网站| 18禁美女羞羞免费网站| 久久久久久久亚洲午夜综合福利| 亚洲va国产va欧美精品88| 最新91九色国产在线观看| 国语对白xxxx乱大交| 91精品国产91久久自产久强| 国产91久久精品一区二区字幕| 久久久久久cao我的性感人妻 | 天堂va蜜桃一区入口| 亚洲日本一区二区三区| 在线免费91激情四射 | 中文亚洲欧美日韩无线码| 久久久久久久一区二区三| 国产亚洲视频在线二区| 18禁网站一区二区三区四区| 亚洲乱码中文字幕在线| 国产av一区2区3区| 日本午夜福利免费视频| 1000小视频在线| 五月天色婷婷在线观看视频免费 | 天天艹天天干天天操| 日韩美女搞黄视频免费| 99精品免费观看视频| 欧美偷拍自拍色图片| 亚洲午夜在线视频福利| 熟女人妻在线中出观看完整版| 97年大学生大白天操逼| 亚洲午夜精品小视频| 一区二区三区四区中文| 日韩无码国产精品强奸乱伦| 亚洲高清国产自产av| 久久久久久cao我的性感人妻| 最新中文字幕免费视频| 真实国产乱子伦一区二区| 人妻少妇性色欲欧美日韩| av线天堂在线观看| 精品日产卡一卡二卡国色天香| 亚洲中文字幕校园春色| 欧美区一区二区三视频| 老司机99精品视频在线观看| 激情啪啪啪啪一区二区三区| 手机看片福利盒子日韩在线播放| 国产福利小视频二区| 婷婷激情四射在线观看视频| 亚洲av日韩精品久久久久久hd| yy96视频在线观看| 精内国产乱码久久久久久| 欧美韩国日本国产亚洲| 91欧美在线免费观看| 日本特级片中文字幕| 国产精品视频资源在线播放| 亚洲一区二区三区久久午夜| 成人网18免费视频版国产| 水蜜桃国产一区二区三区| 88成人免费av网站| 国产精品视频欧美一区二区| 内射久久久久综合网| 国产av福利网址大全| 日曰摸日日碰夜夜爽歪歪| 亚洲蜜臀av一区二区三区九色| 亚洲美女自偷自拍11页| 一区二区三区精品日本| 国产麻豆91在线视频| 中文字幕人妻一区二区视频 | 把腿张开让我插进去视频| 偷青青国产精品青青在线观看 | 天天日天天爽天天干| 天天日天天日天天射天天干| 在线观看的黄色免费网站| 人妻熟女中文字幕aⅴ在线| 日韩欧美一级黄片亚洲| 免费成人va在线观看| 国产使劲操在线播放| 天天日天天干天天要| 夜色17s精品人妻熟女| 日本乱人一区二区三区| 性感美女诱惑福利视频| 亚洲丝袜老师诱惑在线观看| 天天躁日日躁狠狠躁躁欧美av| 天天操天天操天天碰| 午夜在线观看一区视频| 亚洲av可乐操首页| 欧美地区一二三专区| 欧美日韩激情啪啪啪| 亚洲成人av一区在线| av线天堂在线观看| 亚洲精品久久视频婷婷| 色伦色伦777国产精品| 成年女人免费播放视频| 色噜噜噜噜18禁止观看| 成熟丰满熟妇高潮xx×xx| 黄色视频在线观看高清无码 | 亚洲一区二区三区偷拍女厕91| 国产揄拍高清国内精品对白| 日本黄在免费看视频| 国产污污污污网站在线| 日韩av免费观看一区| 国产精品入口麻豆啊啊啊| 国产精品自拍视频大全| 粗大的内捧猛烈进出爽大牛汉子 | 成人综合亚洲欧美一区| 天天日天天干天天要| 日本熟妇色熟妇在线观看| av在线免费观看亚洲天堂| 久久精品国产亚洲精品166m| 日韩欧美国产精品91| 亚洲国产成人无码麻豆艾秋| 91久久综合男人天堂| 午夜毛片不卡免费观看视频| 91高清成人在线视频| 自拍偷拍日韩欧美一区二区| 日美女屁股黄邑视频| 骚货自慰被发现爆操| 好吊视频—区二区三区| 日韩少妇人妻精品无码专区| 精品久久久久久久久久久久人妻| 自拍偷拍亚洲另类色图| 夏目彩春在线中文字幕| 亚洲av日韩av网站| 丰满少妇翘臀后进式| 成人色综合中文字幕| 国产1区,2区,3区| 阿v天堂2014 一区亚洲| 快点插进来操我逼啊视频| 中文字母永久播放1区2区3区| 国产剧情演绎系列丝袜高跟| 狠狠躁狠狠爱网站视频| 亚洲欧美国产综合777| 亚洲福利午夜久久久精品电影网| av手机在线免费观看日韩av| 免费一级黄色av网站| 福利午夜视频在线合集| 97精品综合久久在线| 国产精品久久久黄网站| 午夜在线观看岛国av,com| 精品视频中文字幕在线播放| 国产午夜亚洲精品麻豆| 国产福利小视频免费观看| 91色老99久久九九爱精品| 亚洲va国产va欧美va在线| 欧美久久久久久三级网| 性感美女福利视频网站| 国产在线一区二区三区麻酥酥| 九色视频在线观看免费| 欧美精产国品一二三产品价格| 欧美偷拍亚洲一区二区| 久久国产精品精品美女| 国产综合视频在线看片| 久青青草视频手机在线免费观看| 综合一区二区三区蜜臀| 十八禁在线观看地址免费| 38av一区二区三区| 啪啪啪操人视频在线播放| 免费观看理论片完整版| 亚洲欧美国产麻豆综合| 一本久久精品一区二区| 91精品啪在线免费| 国产又粗又猛又爽又黄的视频美国| 在线免费观看av日韩| 激情五月婷婷免费视频| 五十路人妻熟女av一区二区| 午夜青青草原网在线观看| av在线播放国产不卡| 国产精品入口麻豆啊啊啊 | 人人妻人人爱人人草| 啊用力插好舒服视频| 欧美日韩亚洲国产无线码| 久久三久久三久久三久久| 在线观看国产网站资源| 黄色片年轻人在线观看| 久久尻中国美女视频| 成人av在线资源网站| 免费在线观看污污视频网站| 国产九色91在线观看精品| 爱有来生高清在线中文字幕| 亚洲午夜精品小视频| 国产在线一区二区三区麻酥酥 | 在线免费观看靠比视频的网站| 久久久极品久久蜜桃| 五十路人妻熟女av一区二区| 果冻传媒av一区二区三区| 国产美女午夜福利久久| 日本三极片中文字幕| 国产一区二区视频观看| 国产日韩av一区二区在线| 日日夜夜大香蕉伊人| 在线网站你懂得老司机| 97人妻色免费视频| 91精品视频在线观看免费| 在线免费观看日本伦理| 日本黄色特一级视频| 天堂av在线播放免费| 欧美一级片免费在线成人观看| AV天堂一区二区免费试看| 成年美女黄网站18禁久久| 大香蕉大香蕉大香蕉大香蕉大香蕉 | 伊拉克及约旦宣布关闭领空| 农村胖女人操逼视频| 日本高清在线不卡一区二区| 亚洲一区二区久久久人妻| 亚洲第一黄色在线观看| 天天日天天干天天爱| 国产日韩精品一二三区久久久| 9l人妻人人爽人人爽| 日韩人妻xxxxx| 精品一区二区三区欧美| 国产精品女邻居小骚货| 丰满的继坶3中文在线观看| 日本精品美女在线观看| 夜女神免费福利视频| 欧美日本在线视频一区| 蜜桃视频入口久久久| ka0ri在线视频| 天天射夜夜操综合网| 涩涩的视频在线观看视频| 中文字幕日韩精品就在这里| 天天干天天操天天摸天天射| 国产亚洲视频在线二区| 婷婷久久一区二区字幕网址你懂得| 亚洲成人av一区在线| 中文字幕中文字幕人妻| 亚洲av日韩精品久久久| 天堂va蜜桃一区入口| 欧美 亚洲 另类综合| 黑人性生活视频免费看| 国产精彩福利精品视频| 人人人妻人人澡人人| 欧美在线一二三视频| 1024久久国产精品| 国产成人精品亚洲男人的天堂| 国产无遮挡裸体免费直播视频| 欧洲亚洲欧美日韩综合| 在线观看国产网站资源| 欧美视频不卡一区四区| 日本午夜福利免费视频| 日本一二三区不卡无| 亚洲无线观看国产高清在线| 亚洲 欧美 精品 激情 偷拍 | 国产在线自在拍91国语自产精品| 国产精品国产三级国产精东| 中国无遮挡白丝袜二区精品| 天天插天天色天天日| 青青青国产片免费观看视频| 51国产成人精品视频| 女同互舔一区二区三区| 夜夜嗨av一区二区三区中文字幕| 日韩美av高清在线| 青青尤物在线观看视频网站| 亚洲人妻30pwc| 亚洲久久午夜av一区二区| 欧美特级特黄a大片免费| 亚洲色偷偷综合亚洲AV伊人| 亚洲综合一区成人在线| 美洲精品一二三产区区别| japanese日本熟妇另类| 欧洲欧美日韩国产在线| 亚洲熟色妇av日韩熟色妇在线| 亚洲国产精品美女在线观看| 美女福利写真在线观看视频| 午夜免费体验区在线观看| 视频一区二区三区高清在线| 91久久精品色伊人6882| 综合精品久久久久97| av中文字幕福利网| 成年午夜免费无码区| 香蕉aⅴ一区二区三区| gogo国模私拍视频| aⅴ五十路av熟女中出| 一区二区三区四区视频在线播放| 懂色av之国产精品| 久草视频首页在线观看| 女警官打开双腿沦为性奴| 日美女屁股黄邑视频| 黄色三级网站免费下载| 中文字日产幕乱六区蜜桃| 国产麻豆91在线视频| 沈阳熟妇28厘米大战黑人| 99人妻视频免费在线| 3344免费偷拍视频| 亚洲一区制服丝袜美腿|