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

最新評論

熟女人妻在线观看视频| 自拍偷拍亚洲另类色图| 无码日韩人妻精品久久| 骚逼被大屌狂草视频免费看| 99热这里只有国产精品6| 99re国产在线精品| 黄色男人的天堂视频| 亚洲一区二区三区uij| 国产三级片久久久久久久| 欧美成一区二区三区四区| 亚洲欧美一区二区三区爱爱动图| 又粗又硬又猛又黄免费30| 黑人进入丰满少妇视频| 精品国产亚洲av一淫| 久久农村老妇乱69系列| 亚洲国产欧美一区二区丝袜黑人| 激情内射在线免费观看| 国产老熟女伦老熟妇ⅹ| 日本免费视频午夜福利视频| 亚洲Av无码国产综合色区| 久久久麻豆精亚洲av麻花| 亚洲中文字幕校园春色| 少妇深喉口爆吞精韩国| 中文字幕无码日韩专区免费| 人妻少妇亚洲精品中文字幕| 大胆亚洲av日韩av| 国产精彩福利精品视频| 日韩欧美一级黄片亚洲| 青青青aaaa免费| 80电影天堂网官网| 超pen在线观看视频公开97| 美女张开腿让男生操在线看| 狠狠鲁狠狠操天天晚上干干| 天天日天天舔天天射进去| 亚洲av色图18p| 欧美国产亚洲中英文字幕| 中文字幕高清免费在线人妻 | 色婷婷六月亚洲综合香蕉| 午夜极品美女福利视频| 精品亚洲在线免费观看| 青青色国产视频在线| 国产高清精品一区二区三区| 成人亚洲精品国产精品| 偷拍美女一区二区三区| 国产又大又黄免费观看| 成人免费做爰高潮视频| 欧亚乱色一区二区三区| 天天射夜夜操综合网| 岛国免费大片在线观看 | 欧美天堂av无线av欧美| 中文字幕免费在线免费| 亚洲欧美另类自拍偷拍色图| 中文字幕人妻熟女在线电影| 中文字幕奴隷色的舞台50| 女警官打开双腿沦为性奴| 人妻熟女在线一区二区| 国产精品黄页网站视频| 最新91精品视频在线 | 2021国产一区二区| 亚洲一区二区久久久人妻| 亚洲av日韩av第一区二区三区| 国产激情av网站在线观看| 精品91自产拍在线观看一区| 特大黑人巨大xxxx| 93视频一区二区三区| okirakuhuhu在线观看| 精品久久久久久高潮| 亚洲欧美另类手机在线| 在线成人日韩av电影| 黄色录像鸡巴插进去| 男女之间激情网午夜在线| 国产午夜激情福利小视频在线| 亚洲综合在线观看免费| 一区二区三区精品日本| 精品成人午夜免费看| 亚洲va国产va欧美精品88| 亚洲综合另类欧美久久| 国产精品久久久黄网站| 特大黑人巨大xxxx| 久久www免费人成一看片| 性感美女福利视频网站| 国产亚州色婷婷久久99精品| 亚洲精品 日韩电影| 日韩人妻丝袜中文字幕| 午夜精品福利一区二区三区p | 91破解版永久免费| 精品91自产拍在线观看一区| 最新黄色av网站在线观看| 午夜久久久久久久99| 一区二区三区四区视频| 51精品视频免费在线观看| 999九九久久久精品| 蜜臀av久久久久久久| 日韩av中文在线免费观看| 777奇米久久精品一区| 国产又粗又猛又爽又黄的视频在线 | av中文字幕在线观看第三页| 午夜91一区二区三区| 日本少妇高清视频xxxxx| 欧美专区第八页一区在线播放| 狠狠躁狠狠爱网站视频| 中文字幕在线视频一区二区三区| 真实国模和老外性视频| 亚洲国际青青操综合网站| 狍和女人的王色毛片| 天堂av中文在线最新版| 亚洲国产中文字幕啊啊啊不行了 | 一区二区在线视频中文字幕| 亚洲的电影一区二区三区| 搡老妇人老女人老熟女| 天天躁日日躁狠狠躁躁欧美av| 中文字幕一区二区三区人妻大片| 自拍偷拍日韩欧美一区二区| 中文字幕一区二区三区蜜月| 一级A一级a爰片免费免会员| 亚洲 中文 自拍 另类 欧美| 国产乱子伦一二三区| 毛片av在线免费看| 成人免费公开视频无毒| 亚洲成人情色电影在线观看| 五月天色婷婷在线观看视频免费| 性欧美日本大妈母与子| 岛国一区二区三区视频在线| 久久久极品久久蜜桃| 久久美欧人妻少妇一区二区三区| 青春草视频在线免费播放| 鸡巴操逼一级黄色气| 91久久人澡人人添人人爽乱| 日比视频老公慢点好舒服啊| 少妇与子乱在线观看| 最新激情中文字幕视频| 日本少妇人妻xxxxxhd| 性感美女高潮视频久久久| 超碰中文字幕免费观看| 一区二区三区四区视频在线播放 | 欧美精品黑人性xxxx| 人人在线视频一区二区| 中文字幕综合一区二区| 福利在线视频网址导航| 日韩av大胆在线观看| 在线观看免费av网址大全| 亚洲国产成人最新资源| 欧美成人综合视频一区二区| 天天操夜夜操天天操天天操 | 性色av一区二区三区久久久| 桃色视频在线观看一区二区| 天天干天天操天天扣| www日韩毛片av| 人妻丰满熟妇综合网| 日本女人一级免费片| 国产精品午夜国产小视频| 91国产资源在线视频| 成人免费做爰高潮视频| 青青草原网站在线观看| 91在线视频在线精品3| 日本少妇人妻xxxxx18| 91精品国产综合久久久蜜| 国产视频在线视频播放| 久草极品美女视频在线观看| 美女福利视频网址导航| 国产视频一区二区午夜| 亚洲中文精品人人免费| 精品视频一区二区三区四区五区| 在线国产中文字幕视频| 97人妻色免费视频| 在线制服丝袜中文字幕| 91福利在线视频免费观看| 护士小嫩嫩又紧又爽20p| 11久久久久久久久久久| 中文字幕人妻熟女在线电影| 91综合久久亚洲综合| 久久99久久99精品影院| 婷婷综合蜜桃av在线| 成人亚洲国产综合精品| 91麻豆精品久久久久| av老司机精品在线观看| 亚洲精品久久视频婷婷| 亚洲欧美成人综合视频| 男人操女人逼逼视频网站| 国产黄色片在线收看| 一色桃子久久精品亚洲| 欧美性感尤物人妻在线免费看| 成人影片高清在线观看| 免费成人va在线观看| 免费无码人妻日韩精品一区二区| 一级黄片大鸡巴插入美女| 伊人网中文字幕在线视频| 日韩精品中文字幕福利| 成人高清在线观看视频| 日本少妇精品免费视频| 亚洲欧美激情人妻偷拍| 91精品高清一区二区三区| 福利午夜视频在线合集| 午夜精彩视频免费一区| 亚洲欧美另类手机在线| 19一区二区三区在线播放| 最新中文字幕乱码在线| 美女少妇亚洲精选av| 亚洲狠狠婷婷综合久久app| 55夜色66夜色国产精品站| 熟妇一区二区三区高清版| 91九色porny国产蝌蚪视频| 在线视频这里只有精品自拍| 成人30分钟免费视频| 清纯美女在线观看国产| 久久久超爽一二三av| 2020中文字幕在线播放| 一级黄片大鸡巴插入美女| 亚洲欧洲av天堂综合| 亚洲精品在线资源站| 国产在线免费观看成人| 日韩一区二区三区三州| 国产精品成久久久久三级蜜臀av| 欧美麻豆av在线播放| 国产在线自在拍91国语自产精品| 中文人妻AV久久人妻水| jiujiure精品视频在线| 国产综合精品久久久久蜜臀| 哥哥姐姐综合激情小说| 男大肉棒猛烈插女免费视频| 97小视频人妻一区二区| 在线免费观看视频一二区| 成人性爱在线看四区| 亚洲精品三级av在线免费观看| 日本人妻少妇18—xx| 中文字幕高清在线免费播放 | 青青热久免费精品视频在线观看 | 中文字幕,亚洲人妻| 操操网操操伊剧情片中文字幕网| 97色视频在线观看| 欧美特级特黄a大片免费| 9色在线视频免费观看| 国产又粗又黄又硬又爽| 午夜激情久久不卡一区二区| 人妻久久久精品69系列| 中文字幕人妻三级在线观看| 日韩av免费观看一区| 亚洲午夜高清在线观看| 国产视频一区在线观看| 精品一线二线三线日本| 99精品视频在线观看免费播放| 密臀av一区在线观看| 亚洲成a人片777777| 一二三中文乱码亚洲乱码one| 人妻素人精油按摩中出| 中文字母永久播放1区2区3区| 亚洲推理片免费看网站| 亚洲国产在线精品国偷产拍| 久久久久久9999久久久久| 国产亚洲成人免费在线观看| 成年女人免费播放视频| 亚洲综合一区成人在线| 午夜精彩视频免费一区| 五十路熟女人妻一区二区9933| av新中文天堂在线网址| 视频一区二区在线免费播放| 一区二区免费高清黄色视频| 日本一二三中文字幕| 亚洲色偷偷综合亚洲AV伊人 | 中文字幕国产专区欧美激情| 午夜激情精品福利视频| 天天日天天日天天射天天干| 91九色porny国产在线| 51国产偷自视频在线播放| 婷婷午夜国产精品久久久| 黑人性生活视频免费看| 成人av电影免费版| 国产午夜亚洲精品麻豆| 天天干天天日天天谢综合156| 在线观看亚洲人成免费网址| 摧残蹂躏av一二三区| 亚洲中文字字幕乱码| 成人18禁网站在线播放| 久久久精品欧洲亚洲av| 伊人综合免费在线视频| 免费观看国产综合视频| 老司机午夜精品视频资源| 欧美一区二区三区高清不卡tv| 亚洲国产香蕉视频在线播放| 亚洲一区久久免费视频| 18禁网站一区二区三区四区| 91试看福利一分钟| 成人av免费不卡在线观看| 真实国模和老外性视频| 99精品视频在线观看婷婷| 亚洲av人人澡人人爽人人爱| 日本午夜久久女同精女女| 国产日韩精品免费在线| 经典av尤物一区二区| 国产亚洲天堂天天一区| 揄拍成人国产精品免费看视频| tube69日本少妇| 人人妻人人澡人人爽人人dvl| 国产清纯美女al在线| 日韩精品电影亚洲一区| 狠狠嗨日韩综合久久| 美女福利视频网址导航| 大鸡巴后入爆操大屁股美女| 中文字幕在线欧美精品| 97色视频在线观看| 北条麻妃av在线免费观看| 欧美国品一二三产区区别| 成人色综合中文字幕| 把腿张开让我插进去视频| 国产午夜亚洲精品麻豆| 91精品国产麻豆国产| 在线视频这里只有精品自拍| 天堂av在线播放免费| 精品日产卡一卡二卡国色天香| 免费在线黄色观看网站| jiuse91九色视频| 亚洲精品亚洲人成在线导航| 色狠狠av线不卡香蕉一区二区| 亚洲欧美国产麻豆综合| 久草电影免费在线观看| 日本裸体熟妇区二区欧美| 自拍偷拍亚洲精品第2页| 国产视频精品资源网站| 老有所依在线观看完整版| 亚洲 清纯 国产com| 亚洲精品无码色午夜福利理论片| 亚洲免费va在线播放| 99国产精品窥熟女精品| 亚洲欧美清纯唯美另类| 91精品高清一区二区三区| 大陆av手机在线观看| 国产97在线视频观看| 蜜桃视频入口久久久| www天堂在线久久| 91亚洲手机在线视频播放| 午夜激情精品福利视频| 亚洲精品久久视频婷婷| 日日夜夜大香蕉伊人| 一级a看免费观看网站| 欧美专区日韩专区国产专区| 成年人黄视频在线观看| 超级av免费观看一区二区三区| 岛国免费大片在线观看| 亚洲一区二区人妻av| 欧美天堂av无线av欧美| 91成人精品亚洲国产| 日韩a级黄色小视频| 人妻少妇精品久久久久久| 91亚洲国产成人精品性色| 中文字幕 亚洲av| 久久久精品国产亚洲AV一| 国产精品国产三级麻豆| 欧美一区二区中文字幕电影| 久久农村老妇乱69系列| 中文字幕免费福利视频6| 亚洲免费在线视频网站| 在线亚洲天堂色播av电影| 青青青青草手机在线视频免费看| 岛国黄色大片在线观看| 中国黄色av一级片| 看一级特黄a大片日本片黑人| 中文字幕一区二区三区蜜月| 亚洲美女自偷自拍11页| 亚洲综合另类精品小说| 天天日天天鲁天天操| 亚洲av在线观看尤物| 沙月文乃人妻侵犯中文字幕在线| 亚国产成人精品久久久| 成人国产小视频在线观看| avjpm亚洲伊人久久| 国产成人无码精品久久久电影| 人妻少妇精品久久久久久| 中文字幕日韩无敌亚洲精品| 内射久久久久综合网| 日日日日日日日日夜夜夜夜夜夜| 一区国内二区日韩三区欧美| 岛国青草视频在线观看| 一本一本久久a久久精品综合不卡| 国产精品久久久黄网站| 欧美亚洲少妇福利视频| 天天干天天操天天摸天天射 | 欧美成人黄片一区二区三区| 日本少妇人妻xxxxxhd| 日韩视频一区二区免费观看| 天天躁夜夜躁日日躁a麻豆| 97精品综合久久在线| av天堂中文字幕最新| av老司机亚洲一区二区| 18禁污污污app下载| 男人的天堂一区二区在线观看| 亚洲欧美福利在线观看| 熟女人妻在线观看视频| 国产精品视频一区在线播放| 97国产在线av精品| 天天摸天天日天天操| 国产午夜亚洲精品麻豆| 57pao国产一区二区| 色综合色综合色综合色| 国产精品免费不卡av| 丝袜长腿第一页在线| 夜色撩人久久7777| 2019av在线视频| 一区二区三区激情在线| 天天日天天干天天要| 一区二区久久成人网| 全国亚洲男人的天堂| 欧美黑人性猛交xxxxⅹooo| 免费高清自慰一区二区三区网站| 欧洲日韩亚洲一区二区三区| 男女第一次视频在线观看| 欧美国产亚洲中英文字幕| 92福利视频午夜1000看| 这里只有精品双飞在线播放| 亚洲最大黄 嗯色 操 啊| 蜜桃视频入口久久久| 99久久久无码国产精品性出奶水 | 午夜dv内射一区区| 日韩欧美国产一区ab| 亚洲成人激情av在线| 午夜精品久久久久久99热| 欧美精品一二三视频| 91国内视频在线观看| 夜夜嗨av蜜臀av| 欧美一区二区三区在线资源 | 18禁精品网站久久| 美女大bxxxx内射| 国产久久久精品毛片| 久久精品久久精品亚洲人| 精品国产乱码一区二区三区乱| 高清成人av一区三区| 狠狠躁狠狠爱网站视频 | 亚洲精品精品国产综合| 夫妻在线观看视频91| 黄页网视频在线免费观看| 青青青青草手机在线视频免费看 | 亚洲综合一区成人在线| 又色又爽又黄又刺激av网站| 四虎永久在线精品免费区二区| 国产成人无码精品久久久电影| 免费在线黄色观看网站| 在线观看视频网站麻豆| 2022精品久久久久久中文字幕| 亚洲精品国产在线电影| 亚洲日本一区二区久久久精品| 成人免费做爰高潮视频| 天码人妻一区二区三区在线看| 日本啪啪啪啪啪啪啪| 亚洲综合在线视频可播放| 特大黑人巨大xxxx| 97青青青手机在线视频| 又黄又刺激的午夜小视频| 淫秽激情视频免费观看| 在线国产日韩欧美视频| 天天通天天透天天插| 午夜毛片不卡免费观看视频| 欧美在线一二三视频| 中国黄片视频一区91| 深夜男人福利在线观看| 欧美3p在线观看一区二区三区| 美女骚逼日出水来了| 久久麻豆亚洲精品av| 天天干天天操天天摸天天射| 男人天堂av天天操| 亚洲一区二区三区五区| 天堂av在线播放免费| 91精品国产麻豆国产| 欧美亚洲免费视频观看| 2021最新热播中文字幕| 欧美精品欧美极品欧美视频| 午夜dv内射一区区| 成人免费做爰高潮视频| 国产女孩喷水在线观看| 国产精品欧美日韩区二区| 欧美亚洲少妇福利视频| 人妻少妇性色欲欧美日韩| 一区二区久久成人网| 自拍 日韩 欧美激情| 加勒比视频在线免费观看| 亚洲成人熟妇一区二区三区 | 九九视频在线精品播放| 性感美女福利视频网站| 综合精品久久久久97| 视频一区 视频二区 视频| 成年人免费看在线视频| 亚洲另类图片蜜臀av| 天天想要天天操天天干| 亚欧在线视频你懂的| 成人24小时免费视频| ka0ri在线视频| 国产精品熟女久久久久浪潮| 国产清纯美女al在线| 欧美国品一二三产区区别| 特黄老太婆aa毛毛片| 久碰精品少妇中文字幕av| 日本美女性生活一级片| 亚洲av黄色在线网站| av一区二区三区人妻| 91免费福利网91麻豆国产精品| 欧美少妇性一区二区三区| 在线观看911精品国产| 中文字幕无码日韩专区免费| 男人操女人逼逼视频网站| 2018在线福利视频| 边摸边做超爽毛片18禁色戒| 欧美日韩一级黄片免费观看| 天天操天天弄天天射| 人妻少妇av在线观看| 狠狠地躁夜夜躁日日躁| 久久精品在线观看一区二区| 欧美亚洲中文字幕一区二区三区| sw137 中文字幕 在线| 亚洲成人黄色一区二区三区| 亚洲综合图片20p| 好男人视频在线免费观看网站| 污污小视频91在线观看| 国产一级精品综合av| 亚洲Av无码国产综合色区| 亚洲免费va在线播放| 中文字幕高清资源站| 啊用力插好舒服视频| 91免费黄片可看视频| 亚洲天天干 夜夜操| yy96视频在线观看| 亚洲天堂有码中文字幕视频| 自拍偷拍 国产资源| 青草青永久在线视频18| 国产精品久久综合久久| 成年午夜影片国产片| 美女张开腿让男生操在线看| 欧美精品免费aaaaaa| 97精品视频在线观看| 欧美日韩一区二区电影在线观看| 熟女视频一区,二区,三区| eeuss鲁片一区二区三区| 亚洲码av无色中文| 在线观看欧美黄片一区二区三区 | 黑人巨大的吊bdsm| 韩国黄色一级二级三级| 97色视频在线观看| 亚洲一区二区人妻av| 国产性感美女福利视频| 一区二区久久成人网| 99国内精品永久免费视频| 国产V亚洲V天堂无码欠欠| 蜜桃久久久久久久人妻| 国产精品黄片免费在线观看| 日本少妇高清视频xxxxx | 婷婷六月天中文字幕| 97国产在线av精品| 在线制服丝袜中文字幕| 色综合色综合色综合色| 中文字幕免费在线免费| 日韩北条麻妃一区在线| 伊人日日日草夜夜草| 亚洲av日韩av网站| 九色视频在线观看免费| 在线观看免费岛国av| 福利在线视频网址导航| 国产 在线 免费 精品| 国产又粗又硬又大视频| 中国熟女一区二区性xx| 黄色无码鸡吧操逼视频| 区一区二区三国产中文字幕| 亚洲国产欧美一区二区三区…| 岛国青草视频在线观看| 国产老熟女伦老熟妇ⅹ| 国产精品入口麻豆啊啊啊| 女人精品内射国产99| 国产在线一区二区三区麻酥酥| 中文字日产幕乱六区蜜桃| 熟女人妻在线观看视频| 成人精品在线观看视频| 亚洲免费在线视频网站| 抽查舔水白紧大视频| 美女骚逼日出水来了| 91色九色porny| 国产精品久久久黄网站| 精品久久久久久高潮| 国产91久久精品一区二区字幕| 天天日天天爽天天干| 免费福利av在线一区二区三区| 老熟妇xxxhd老熟女| 青青草成人福利电影| 在线国产精品一区二区三区| 亚洲人一区二区中文字幕| 亚洲午夜精品小视频| 黄色的网站在线免费看| 香蕉aⅴ一区二区三区| 小穴多水久久精品免费看| 日韩精品激情在线观看| 中文字幕在线乱码一区二区 | 99国内精品永久免费视频| 人妻激情图片视频小说| 成人免费毛片aaaa| 9久在线视频只有精品| 成人亚洲精品国产精品| 女同久久精品秋霞网| 美洲精品一二三产区区别| 欧美精产国品一二三区| 蜜臀av久久久久久久| 欧美亚洲一二三区蜜臀| 欧美日本在线观看一区二区| 国产中文字幕四区在线观看| 久久丁香花五月天色婷婷| 亚洲av无女神免非久久| 精品成人午夜免费看| 欧美乱妇无乱码一区二区| 熟妇一区二区三区高清版| 97色视频在线观看| 成人亚洲国产综合精品| av视网站在线观看| 又黄又刺激的午夜小视频| 免费男阳茎伸入女阳道视频| 麻豆精品成人免费视频| 国产亚洲精品品视频在线| 91中文字幕免费在线观看| 91精品综合久久久久3d动漫 | 一区二区视频在线观看免费观看| 国产精品成久久久久三级蜜臀av| 日曰摸日日碰夜夜爽歪歪| 青青青国产片免费观看视频| 精品久久久久久久久久中文蒉 | 粉嫩av懂色av蜜臀av| 2020中文字幕在线播放| 水蜜桃国产一区二区三区| 视频一区 视频二区 视频| 亚洲午夜电影在线观看| 成人区人妻精品一区二视频 | 天天日天天干天天插舔舔| 亚洲国产精品中文字幕网站| 久草福利电影在线观看| 日韩人妻在线视频免费| 青春草视频在线免费播放| 韩国女主播精品视频网站| 美女吃鸡巴操逼高潮视频| AV天堂一区二区免费试看| 爱爱免费在线观看视频| 免费观看国产综合视频| 亚洲区美熟妇久久久久| 免费看美女脱光衣服的视频| 国产精品人妻66p| 国产精品国色综合久久| 亚洲国产第一页在线观看| 日本午夜久久女同精女女| 国产美女午夜福利久久| 色呦呦视频在线观看视频| 美女大bxxxx内射| 在线观看亚洲人成免费网址| 国产九色91在线观看精品| 18禁精品网站久久| 99热这里只有国产精品6| 亚洲一区二区激情在线| 国产一区成人在线观看视频| 日本韩国亚洲综合日韩欧美国产| 日美女屁股黄邑视频| 老司机在线精品福利视频| 亚洲免费成人a v| 岳太深了紧紧的中文字幕| 日本av熟女在线视频| 女生自摸在线观看一区二区三区 | 国产揄拍高清国内精品对白 | 亚洲蜜臀av一区二区三区九色| 国产亚洲精品视频合集| 日韩欧美中文国产在线| 国产精品探花熟女在线观看| av在线免费观看亚洲天堂| 国产伦精品一区二区三区竹菊| 亚洲欧美色一区二区| 成人免费公开视频无毒| 青青青视频自偷自拍38碰| 亚洲欧美一区二区三区爱爱动图| 一区二区三区久久久91| 九一传媒制片厂视频在线免费观看| 亚洲一级美女啪啪啪| 国产视频精品资源网站| 亚洲欧美另类手机在线| 日本一区美女福利视频| 亚洲熟妇x久久av久久| 一二三区在线观看视频| 精品亚洲在线免费观看| 9l人妻人人爽人人爽| 亚洲伊人久久精品影院一美女洗澡 | 免费黄高清无码国产| 中文字幕日韩精品日本| 国产黄色a级三级三级三级| 老司机免费福利视频网| 97人人模人人爽人人喊| 又色又爽又黄又刺激av网站| 少妇一区二区三区久久久| 成年午夜影片国产片| 九九视频在线精品播放| 搡老熟女一区二区在线观看| 久草极品美女视频在线观看| 93视频一区二区三区| 日韩成人综艺在线播放| 天天日天天敢天天干| av完全免费在线观看av| 精品一线二线三线日本| 性欧美激情久久久久久久| 无码中文字幕波多野不卡| 97国产福利小视频合集| 在线免费观看日本片| av黄色成人在线观看| 亚洲成人情色电影在线观看| 久久久人妻一区二区| 女生自摸在线观看一区二区三区 | 黄工厂精品视频在线观看 | 国产又粗又黄又硬又爽| 国产亚洲欧美45p| 人妻无码色噜噜狠狠狠狠色| 天天日天天爽天天爽| 亚洲护士一区二区三区| 大鸡巴插入美女黑黑的阴毛| 国产综合高清在线观看| 国产精品伦理片一区二区| 欧美地区一二三专区| 欧美女同性恋免费a| 免费看高清av的网站| 精品美女福利在线观看| 五月激情婷婷久久综合网| avjpm亚洲伊人久久| 亚洲一区二区三区久久受| 国产性色生活片毛片春晓精品| 久久久极品久久蜜桃| 最近中文字幕国产在线| 视频一区二区在线免费播放| 国产精品成人xxxx| 成人国产激情自拍三区| 欧美色婷婷综合在线| 五月天中文字幕内射| 黄色的网站在线免费看| 亚洲成人国产综合一区| 亚洲av一妻不如妾| 精品亚洲国产中文自在线| 国产剧情演绎系列丝袜高跟| 精品少妇一二三视频在线| 黄色视频在线观看高清无码 | 最新日韩av传媒在线| 天堂中文字幕翔田av| 国产老熟女伦老熟妇ⅹ| 中国熟女一区二区性xx| 五十路在线观看完整版| 成人在线欧美日韩国产| 亚洲特黄aaaa片| 大鸡巴操b视频在线| 大学生A级毛片免费视频| 人妻丝袜榨强中文字幕| 狠狠鲁狠狠操天天晚上干干| 亚洲精品av在线观看| 日本一道二三区视频久久| 超碰在线中文字幕一区二区| av中文字幕福利网| 欧美黑人与人妻精品| 久久久久久国产精品| 欧美亚洲少妇福利视频| 高清成人av一区三区| 午夜精品福利91av| 一区二区视频在线观看免费观看| 国产普通话插插视频| av破解版在线观看| 国产成人小视频在线观看无遮挡| 日本在线不卡免费视频| 最新黄色av网站在线观看| 午夜成午夜成年片在线观看| 99精品国自产在线人| 农村胖女人操逼视频| 中文字幕在线一区精品| 成人伊人精品色xxxx视频| 少妇人妻二三区视频| 欧美一级色视频美日韩| 久草免费人妻视频在线| 色av色婷婷人妻久久久精品高清| 手机看片福利盒子日韩在线播放| 97精品视频在线观看| 大香蕉日本伊人中文在线| 中文字幕第三十八页久久 | 国产片免费观看在线观看| 亚洲伊人久久精品影院一美女洗澡 | 亚洲1069综合男同| 人妻少妇中文有码精品| 日韩欧美亚洲熟女人妻| 国产日韩精品一二三区久久久| 亚洲久久午夜av一区二区| 综合精品久久久久97| 91社福利《在线观看| 熟女少妇激情五十路| 91精品国产91久久自产久强 | 国产一区二区久久久裸臀| 天堂v男人视频在线观看| 人妻丝袜榨强中文字幕| 99热99re在线播放| 99热碰碰热精品a中文| 久久精品久久精品亚洲人| 欧美精品国产综合久久| 天天操夜夜操天天操天天操| 91久久人澡人人添人人爽乱| av乱码一区二区三区| 亚洲最大黄 嗯色 操 啊| 国产精品久久综合久久| 91国产在线免费播放| 伊人精品福利综合导航| av视网站在线观看| 国产精品成久久久久三级蜜臀av| 亚洲卡1卡2卡三卡四老狼| 国产内射中出在线观看| 久久久久久cao我的性感人妻| 精品久久久久久久久久久a√国产| 九一传媒制片厂视频在线免费观看| 国产福利小视频免费观看| 黑人巨大的吊bdsm| 精品黑人一区二区三区久久国产| 91久久国产成人免费网站| av老司机精品在线观看| 美女 午夜 在线视频| 在线观看国产网站资源| 精品高潮呻吟久久av| 天堂中文字幕翔田av| 精品国产午夜视频一区二区| 蜜臀av久久久久久久| 亚洲图片欧美校园春色 | 国产精品一二三不卡带免费视频| gogo国模私拍视频| 18禁精品网站久久| 国产成人小视频在线观看无遮挡| 一个色综合男人天堂| 亚洲午夜精品小视频| 国产成人精品av网站| 亚洲国际青青操综合网站| 色综合久久五月色婷婷综合| 韩国爱爱视频中文字幕| 久久永久免费精品人妻专区| 天干天天天色天天日天天射| 中国产一级黄片免费视频播放| 一区二区三区av高清免费| 摧残蹂躏av一二三区| 日本少妇人妻xxxxxhd| 亚洲黄色av网站免费播放| 在线不卡日韩视频播放| 欧美在线一二三视频| 精品一区二区三区三区色爱| 亚洲 欧美 精品 激情 偷拍| 日本黄色三级高清视频| 性欧美激情久久久久久久| 88成人免费av网站| 国产日韩精品免费在线| 青青青青青手机视频| 亚洲天天干 夜夜操| 亚洲精品午夜aaa久久| 久久国产精品精品美女| 欧美 亚洲 另类综合| 97精品成人一区二区三区| 狠狠操狠狠操免费视频| 欧美一区二区中文字幕电影| www日韩毛片av| 激情国产小视频在线| 天天草天天色天天干| 亚洲最大免费在线观看| av天堂资源最新版在线看| 中国熟女一区二区性xx| 亚洲综合在线观看免费| 最新国产亚洲精品中文在线| 激情图片日韩欧美人妻| 欧美日本aⅴ免费视频| 色综合久久无码中文字幕波多| 大屁股熟女一区二区三区| 国产又粗又黄又硬又爽| 在线网站你懂得老司机| 岛国免费大片在线观看| 91老熟女连续高潮对白| 538精品在线观看视频| 中国黄色av一级片| 超级av免费观看一区二区三区| 亚洲av自拍偷拍综合| 最新97国产在线视频| 国产精品sm调教视频| 老熟妇xxxhd老熟女| 国产综合高清在线观看| 青草久久视频在线观看| 在线观看av亚洲情色| 午夜av一区二区三区| 在线视频免费观看网| 日本一道二三区视频久久 | 亚洲精品ww久久久久久| 亚洲第17页国产精品| 色综合色综合色综合色| 欧美激情精品在线观看| 精品久久久久久久久久久99| 日本美女成人在线视频| 国产视频一区二区午夜| 岛国青草视频在线观看| 日韩中文字幕在线播放第二页| 亚洲公开视频在线观看| 人妻丰满熟妇综合网| 在线免费观看视频一二区| 欧美成人黄片一区二区三区| 日本真人性生活视频免费看| 色哟哟国产精品入口| 日韩近亲视频在线观看| 无码日韩人妻精品久久| 日本一区精品视频在线观看| 天天干天天啪天天舔| 深田咏美亚洲一区二区| 婷婷综合蜜桃av在线| 日韩一个色综合导航| 色偷偷伊人大杳蕉综合网| 中文字幕AV在线免费看 | 区一区二区三国产中文字幕| 中文字幕最新久久久| 亚洲一级美女啪啪啪| 亚洲一区二区三区久久受| 亚洲午夜精品小视频| 亚洲av极品精品在线观看| 热99re69精品8在线播放| 少妇人妻二三区视频| 中文字幕日韩无敌亚洲精品| 三上悠亚和黑人665番号| 日本一二三中文字幕| 最新91九色国产在线观看| 不卡一区一区三区在线| 四川五十路熟女av| 宅男噜噜噜666国产| 国产V亚洲V天堂无码欠欠| 青娱乐蜜桃臀av色| 久草视频在线看免费| 91九色porny国产在线| 一区二区三区的久久的蜜桃的视频| 天天射,天天操,天天说| 一区二区三区日本伦理| 婷婷久久久久深爱网| 亚洲精品欧美日韩在线播放| 免费一级特黄特色大片在线观看| 国产91嫩草久久成人在线视频| 888欧美视频在线| 日本精品一区二区三区在线视频。 | 一区二区三区四区中文| 天天干天天操天天爽天天摸 | 大胸性感美女羞爽操逼毛片| 国产一区二区三免费视频| 日韩av有码中文字幕| 丰满少妇翘臀后进式| 日本熟妇色熟妇在线观看| 在线制服丝袜中文字幕| 中文字幕第1页av一天堂网| 任你操任你干精品在线视频| 亚洲国产免费av一区二区三区 | 亚洲综合另类精品小说| 国产又色又刺激在线视频 | 亚洲成人午夜电影在线观看| 宅男噜噜噜666国产| 亚洲人一区二区中文字幕| 久久精品视频一区二区三区四区| 亚洲免费国产在线日韩| 美女在线观看日本亚洲一区| 国产91嫩草久久成人在线视频| 插逼视频双插洞国产操逼插洞| 人妻自拍视频中国大陆| 99婷婷在线观看视频| 日本福利午夜电影在线观看| 青青青青视频在线播放| 欧美日韩中文字幕欧美| 亚洲国产香蕉视频在线播放| 亚洲va天堂va国产va久| 欧洲亚洲欧美日韩综合| 国产精品久久久黄网站| 精品一区二区三四区| 免费黄页网站4188| 在线国产中文字幕视频| 青青青视频手机在线观看| 欧美专区第八页一区在线播放| 97人人妻人人澡人人爽人人精品| 在线成人日韩av电影| 欧美精品久久久久久影院| 99久久久无码国产精品性出奶水 | 欧美日本在线观看一区二区| 成年人该看的视频黄免费| 日本女大学生的黄色小视频| 欧美专区第八页一区在线播放| 欧美亚洲中文字幕一区二区三区| 91高清成人在线视频| 午夜精品在线视频一区| 久久热这里这里只有精品| 在线观看国产免费麻豆| 国产精品精品精品999| 日本女大学生的黄色小视频| 视频一区二区综合精品| 精品视频一区二区三区四区五区| 青青草在观免费国产精品| 精内国产乱码久久久久久| 91福利视频免费在线观看| 不卡日韩av在线观看| 国产黄网站在线观看播放| 中文字幕网站你懂的| 亚洲熟妇无码一区二区三区| 亚洲免费va在线播放| 91精品国产91久久自产久强| 又黄又刺激的午夜小视频| 视频一区 二区 三区 综合| 男大肉棒猛烈插女免费视频| 日噜噜噜夜夜噜噜噜天天噜噜噜| 日韩av熟妇在线观看| 2020中文字幕在线播放| 三上悠亚和黑人665番号| 75国产综合在线视频| 日本女大学生的黄色小视频| 国产一区二区欧美三区| 老熟妇凹凸淫老妇女av在线观看 | 国产精品久久久黄网站| 成年人黄色片免费网站| 丝袜美腿欧美另类 中文字幕| 99re久久这里都是精品视频| av俺也去在线播放| 亚洲激情唯美亚洲激情图片| 日韩中文字幕精品淫| 欧美亚洲少妇福利视频| 日本高清撒尿pissing| 年轻的人妻被夫上司侵犯| 动漫黑丝美女的鸡巴| 成人24小时免费视频| 亚洲午夜精品小视频| 中文字幕综合一区二区| 少妇人妻二三区视频| 国产亚洲视频在线观看| 人妻凌辱欧美丰满熟妇| 日日操夜夜撸天天干| 亚洲欧美一区二区三区电影| 偷拍自拍视频图片免费| 姐姐的朋友2在线观看中文字幕| 国产 在线 免费 精品| 1024久久国产精品| 不卡精品视频在线观看| 国产一区二区欧美三区| 天天综合天天综合天天网 | 黄色成年网站午夜在线观看| 成人影片高清在线观看| 久久丁香花五月天色婷婷| av中文字幕在线观看第三页| 日本少妇人妻xxxxxhd| 在线免费观看国产精品黄色| www,久久久,com| 青青草视频手机免费在线观看| 可以在线观看的av中文字幕| 国产精品中文av在线播放| 天天想要天天操天天干| 免费人成黄页网站在线观看国产| 红杏久久av人妻一区| 一区二区三区精品日本| 免费大片在线观看视频网站| 国产91久久精品一区二区字幕| 中文字幕一区二区自拍| 超碰97免费人妻麻豆| av资源中文字幕在线观看| 丝袜长腿第一页在线| 老司机99精品视频在线观看| 欧美视频不卡一区四区| 亚洲人妻av毛片在线| 日韩av有码中文字幕| 黑人3p华裔熟女普通话| 欧美怡红院视频在线观看| 欧美精品国产综合久久| 夜色17s精品人妻熟女| 日曰摸日日碰夜夜爽歪歪| 天天色天天操天天舔| 午夜dv内射一区区| 91极品新人『兔兔』精品新作| 激情人妻校园春色亚洲欧美| 丝袜美腿视频诱惑亚洲无| 11久久久久久久久久久| 人妻无码色噜噜狠狠狠狠色| 91成人精品亚洲国产| 亚洲av自拍偷拍综合| 国产女孩喷水在线观看| 欧美日韩一级黄片免费观看| 新97超碰在线观看| 亚洲中文字幕乱码区| 亚洲欧美国产综合777| 天天摸天天亲天天舔天天操天天爽| 视频二区在线视频观看| 51国产成人精品视频| 久久久久久97三级| 四虎永久在线精品免费区二区| 啪啪啪操人视频在线播放| 亚洲精品国产久久久久久| 亚洲综合自拍视频一区| 精品一区二区三区三区88| 青青青青青青青青青青草青青| 精品久久久久久久久久久a√国产| 免费观看成年人视频在线观看| 亚洲精品无码久久久久不卡| 国产一线二线三线的区别在哪| 丰满的继坶3中文在线观看| 日韩欧美高清免费在线| 日韩少妇人妻精品无码专区 | 日本性感美女视频网站| 一区二区麻豆传媒黄片| 18禁美女黄网站色大片下载| 在线免费观看日本片| 人妻在线精品录音叫床| 国产精品久久久久久久久福交| 护士小嫩嫩又紧又爽20p| 青草亚洲视频在线观看| 亚洲综合图片20p| 天天操天天爽天天干| av中文字幕国产在线观看| 欧美黄片精彩在线免费观看 | 久久美欧人妻少妇一区二区三区| 黄色成人在线中文字幕| 日日夜夜精品一二三| 中国黄片视频一区91| xxx日本hd高清| 国产麻豆91在线视频| 亚洲少妇高潮免费观看| 五十路在线观看完整版| 日韩美女搞黄视频免费| 日本裸体熟妇区二区欧美| 日韩在线中文字幕色| 在线免费观看99视频| 91chinese在线视频| 亚洲天堂有码中文字幕视频| 亚洲蜜臀av一区二区三区九色| 999九九久久久精品| av一区二区三区人妻| 欧美成人精品在线观看| 97超碰人人搞人人| 日本一二三区不卡无| 家庭女教师中文字幕在线播放| 人妻激情图片视频小说| 欧美男人大鸡吧插女人视频| 大陆精品一区二区三区久久| 天天日天天日天天擦| 久久精品亚洲国产av香蕉| 日韩加勒比东京热二区| 成人高清在线观看视频| 最新97国产在线视频| 中文字幕免费福利视频6| 伊人开心婷婷国产av| 日韩中文字幕在线播放第二页| 亚洲人妻视频在线网| 久草视频首页在线观看| 大屁股肉感人妻中文字幕在线| 精品人妻每日一部精品| 大香蕉大香蕉在线看| 99久久激情婷婷综合五月天| 成人动漫大肉棒插进去视频| 在线观看黄色成年人网站| 午夜福利资源综合激情午夜福利资 | rct470中文字幕在线| 91破解版永久免费| 五十路老熟女码av| 少妇人妻久久久久视频黄片| 午夜国产免费福利av| 2020久久躁狠狠躁夜夜躁| 男人操女人的逼免费视频| 欧美日韩不卡一区不区二区| 国产精品久久久久网| 深夜男人福利在线观看| 亚洲高清自偷揄拍自拍| 亚洲中文字幕人妻一区| 中文字幕日韩无敌亚洲精品 | 天天日天天摸天天爱| 中文字幕午夜免费福利视频| 国产97在线视频观看| 亚洲人妻30pwc| gav成人免费播放| 天天干天天日天天干天天操| 中文字幕网站你懂的| 极品粉嫩小泬白浆20p主播| 五十路熟女人妻一区二| 99久久中文字幕一本人| 国产高清精品极品美女| 中文字幕中文字幕 亚洲国产| 91免费黄片可看视频| 成熟熟女国产精品一区| 国产精品久久久黄网站| 国产日韩一区二区在线看 | 阴茎插到阴道里面的视频| 一区二区三区欧美日韩高清播放 | 久久机热/这里只有| 少妇ww搡性bbb91| av破解版在线观看| 国产福利在线视频一区| 久草视频 久草视频2| 五十路息与子猛烈交尾视频| 97人妻无码AV碰碰视频| 视频一区 视频二区 视频| 抽查舔水白紧大视频| 伊人综合免费在线视频| 日本少妇的秘密免费视频| 九九热99视频在线观看97| 国产成人精品亚洲男人的天堂| 熟女国产一区亚洲中文字幕| 密臀av一区在线观看| 边摸边做超爽毛片18禁色戒 | 日本少妇的秘密免费视频| 把腿张开让我插进去视频| 成人av天堂丝袜在线观看| av手机在线免费观看日韩av| 亚洲熟女久久久36d| 亚洲一区二区三区av网站| 亚洲少妇高潮免费观看| 午夜精品久久久久久99热| 激情五月婷婷综合色啪| 一色桃子人妻一区二区三区| 久久久久久久99精品| 97精品成人一区二区三区| 精品人妻一二三区久久| 国产清纯美女al在线| 亚洲中文字幕国产日韩| 青青青激情在线观看视频| 青草青永久在线视频18| 人人妻人人澡人人爽人人dvl| 亚洲2021av天堂| 中文字幕av第1页中文字幕| 色婷婷六月亚洲综合香蕉| 日韩成人综艺在线播放| 日韩激情文学在线视频| 色综合天天综合网国产成人| 国产高清女主播在线| 成人av免费不卡在线观看| 欧美男同性恋69视频| 欧美日韩一级黄片免费观看| av资源中文字幕在线观看| 国产va精品免费观看| 国产亚州色婷婷久久99精品| 2021久久免费视频| av乱码一区二区三区| 内射久久久久综合网| 首之国产AV医生和护士小芳| 欧美日韩在线精品一区二区三| 亚洲av一妻不如妾| 一区二区久久成人网| 国产九色91在线观看精品| 骚货自慰被发现爆操| 国产97在线视频观看| 中文字幕熟女人妻久久久| 国产麻豆国语对白露脸剧情| 天天日天天爽天天爽| 99国内精品永久免费视频| 成人30分钟免费视频| 国产欧美日韩第三页| 国产亚洲成人免费在线观看 | 一区二区视频视频视频| 不卡一区一区三区在线| 国产又粗又猛又爽又黄的视频在线 | 夜色17s精品人妻熟女| 在线观看视频 你懂的| 男女啪啪视频免费在线观看| www天堂在线久久| 精彩视频99免费在线| 久草视频福利在线首页| 啊啊好大好爽啊啊操我啊啊视频| 大白屁股精品视频国产| 亚洲高清一区二区三区视频在线| 中文字幕一区二区自拍| 国产精选一区在线播放| 天堂av在线播放免费| 国产亚洲精品欧洲在线观看| 国产又粗又猛又爽又黄的视频在线| 天天射夜夜操狠狠干| 一区二区三区精品日本| 亚洲视频乱码在线观看| 黄色成人在线中文字幕| 熟女视频一区,二区,三区 | 老司机99精品视频在线观看| 成年人该看的视频黄免费| 国产在线自在拍91国语自产精品| 国产普通话插插视频| 日本乱人一区二区三区| 大鸡八强奸视频在线观看| rct470中文字幕在线| 亚洲美女高潮喷浆视频| 97精品视频在线观看| 淫秽激情视频免费观看| 欧美日本在线视频一区| 天天干天天插天天谢| av中文在线天堂精品| 成人色综合中文字幕| 宅男噜噜噜666国产| 亚洲区美熟妇久久久久| 免费一级特黄特色大片在线观看 | 人人在线视频一区二区| 青青青视频自偷自拍38碰| 亚洲国产欧美一区二区丝袜黑人| 精品一线二线三线日本| 免费在线福利小视频| 日日夜夜大香蕉伊人| 亚洲美女美妇久久字幕组| 人人妻人人澡人人爽人人dvl| 97超碰国语国产97超碰| 欧美另类z0z变态| 91精品国产综合久久久蜜 | 亚洲欧美成人综合在线观看| 中文字幕熟女人妻久久久| 97国产在线av精品| 国产日韩欧美美利坚蜜臀懂色| 黄色成人在线中文字幕| 男生舔女生逼逼视频| 国产一级精品综合av| 伊人成人综合开心网| 精品少妇一二三视频在线| 国产视频一区二区午夜| 熟女国产一区亚洲中文字幕| 大鸡八强奸视频在线观看| 91桃色成人网络在线观看| 狍和女人的王色毛片| 欧美麻豆av在线播放| 中文字幕亚洲久久久| 一区二区三区综合视频| 蜜桃精品久久久一区二区| 午夜精品一区二区三区福利视频| 久久久久久9999久久久久| 亚洲综合在线观看免费| 2020中文字幕在线播放| 97超碰最新免费在线观看| 欧美aa一级一区三区四区| 欧美日韩亚洲国产无线码| 99精品久久久久久久91蜜桃| 亚洲Av无码国产综合色区| 国产伦精品一区二区三区竹菊| 绯色av蜜臀vs少妇| 爱有来生高清在线中文字幕| 亚洲精品在线资源站| 硬鸡巴动态操女人逼视频| 97国产在线观看高清| 亚洲成人黄色一区二区三区| 久久国产精品精品美女| 啪啪啪啪啪啪啪免费视频| 2022国产精品视频| 超pen在线观看视频公开97| 亚洲高清国产一区二区三区| 婷婷六月天中文字幕| 亚洲欧美成人综合视频| 国产精品视频资源在线播放| 综合精品久久久久97| av天堂中文免费在线| 国产成人综合一区2区| 日本裸体熟妇区二区欧美| 晚上一个人看操B片| 97瑟瑟超碰在线香蕉| 被大鸡吧操的好舒服视频免费| 亚洲成人国产综合一区| 欧美少妇性一区二区三区| 亚洲老熟妇日本老妇| 在线观看免费岛国av| 88成人免费av网站| 在线观看黄色成年人网站| 91福利视频免费在线观看| 天天干天天搞天天摸| 青青青青青青青在线播放视频| av线天堂在线观看| 快点插进来操我逼啊视频| 亚洲激情偷拍一区二区| 欧美天堂av无线av欧美| 成人在线欧美日韩国产| 天堂av中文在线最新版| 日韩a级精品一区二区| 久久美欧人妻少妇一区二区三区| 久久久久久9999久久久久| 好吊操视频这里只有精品| 亚洲推理片免费看网站| 欧洲黄页网免费观看| 人妻激情图片视频小说| h国产小视频福利在线观看| 天天通天天透天天插| 久碰精品少妇中文字幕av| 视频一区 二区 三区 综合| 精品老妇女久久9g国产| 91麻豆精品秘密入口在线观看| 91久久国产成人免费网站| 亚洲成人免费看电影| 丰满的继坶3中文在线观看| 99精品视频在线观看免费播放| 亚洲图片偷拍自拍区| 亚洲国产在人线放午夜| 日本熟妇一区二区x x| 亚洲va国产va欧美va在线| 97人妻无码AV碰碰视频| 亚洲视频乱码在线观看| 日本熟女精品一区二区三区| 国产高清精品一区二区三区| 免费男阳茎伸入女阳道视频| 自拍偷拍亚洲精品第2页| 男人的网址你懂的亚洲欧洲av| 国产密臀av一区二区三| 男女之间激情网午夜在线| 日本最新一二三区不卡在线| 蜜臀av久久久久久久| 91精品国产高清自在线看香蕉网| 99精品视频之69精品视频| 日韩欧美制服诱惑一区在线| 国产午夜男女爽爽爽爽爽视频| 成人性黑人一级av| 色综合天天综合网国产成人| 亚洲成人午夜电影在线观看| 午夜青青草原网在线观看| 亚洲人成精品久久久久久久| 大胸性感美女羞爽操逼毛片| 97精品视频在线观看| av中文字幕在线导航| 欧美另类一区二区视频| 美女骚逼日出水来了| 99精品一区二区三区的区| 久草视频首页在线观看| 91麻豆精品传媒国产黄色片| 国产视频一区在线观看| 亚洲人一区二区中文字幕| 狠狠地躁夜夜躁日日躁| 五月婷婷在线观看视频免费| 少妇人妻100系列| 人人在线视频一区二区| 成熟丰满熟妇高潮xx×xx| 久久久久久久久久久久久97| 日韩av大胆在线观看| 天天日天天摸天天爱| 最新国产亚洲精品中文在线| 香港三日本三韩国三欧美三级| 国产不卡av在线免费| 91精品综合久久久久3d动漫| 蝴蝶伊人久久中文娱乐网| 亚洲精品久久视频婷婷| 免费成人va在线观看| 午夜dv内射一区区| 欧美精品资源在线观看| 中文字幕在线第一页成人 | 少妇人妻真实精品视频| 天天日天天舔天天射进去| 日韩成人免费电影二区| 中文字幕,亚洲人妻| 大香蕉玖玖一区2区| 97人妻色免费视频| 国语对白xxxx乱大交| 经典亚洲伊人第一页| 中文字幕日韩精品就在这里| 亚国产成人精品久久久| 国产精品入口麻豆啊啊啊| 久久热久久视频在线观看| 岛国一区二区三区视频在线| 少妇一区二区三区久久久| 亚洲另类综合一区小说| 午夜极品美女福利视频| 最新日韩av传媒在线| 91国内精品自线在拍白富美| 农村胖女人操逼视频| 日日夜夜狠狠干视频| 玩弄人妻熟妇性色av少妇| 亚洲国际青青操综合网站| 一二三区在线观看视频| 999九九久久久精品| 哥哥姐姐综合激情小说 | 91国产资源在线视频| 亚洲美女美妇久久字幕组| 欧美激情精品在线观看| 国产一区av澳门在线观看| 欧美日本aⅴ免费视频| 91试看福利一分钟| 久青青草视频手机在线免费观看| 日本午夜福利免费视频| 免费成人av中文字幕| 欧美久久久久久三级网| 最近中文字幕国产在线| 99亚洲美女一区二区三区| 国产精品手机在线看片| 福利视频一区二区三区筱慧| 和邻居少妇愉情中文字幕| 老司机在线精品福利视频| 夜鲁夜鲁狠鲁天天在线| 最新国产精品拍在线观看| 99热久久极品热亚洲| 婷婷激情四射在线观看视频| 亚洲va国产va欧美va在线| 国产视频在线视频播放| 欧美一区二区三区啪啪同性| 99热99re在线播放| 日韩近亲视频在线观看| 91久久人澡人人添人人爽乱| 中文字幕熟女人妻久久久| 不卡日韩av在线观看| 日韩欧美一级黄片亚洲| 天天插天天狠天天操| 青青青青青青青青青国产精品视频| 亚洲图库另类图片区| 日本美女成人在线视频| 亚洲激情av一区二区| 综合页自拍视频在线播放| 五十路人妻熟女av一区二区| 欧美一级色视频美日韩| 日本美女成人在线视频| 欧美精产国品一二三区| 天天操天天爽天天干| 亚洲日本一区二区久久久精品| 亚洲熟色妇av日韩熟色妇在线| 日本黄在免费看视频| 玩弄人妻熟妇性色av少妇| 97少妇精品在线观看| 亚洲2021av天堂| 亚洲av日韩精品久久久| 把腿张开让我插进去视频| 狠狠操狠狠操免费视频| 国产美女一区在线观看| 黑人大几巴狂插日本少妇| 亚洲成人国产综合一区| 夜色17s精品人妻熟女| 大鸡吧插入女阴道黄色片| 日本乱人一区二区三区| 1区2区3区4区视频在线观看| 超碰97人人澡人人| 精品亚洲中文字幕av| 一区二区三区四区视频| 日本乱人一区二区三区| 亚洲欧美一卡二卡三卡| 人妻3p真实偷拍一二区| 亚洲欧美在线视频第一页| sw137 中文字幕 在线| yy96视频在线观看| 阴茎插到阴道里面的视频| 欧洲亚洲欧美日韩综合| 色噜噜噜噜18禁止观看| 操日韩美女视频在线免费看| 亚洲av日韩精品久久久| 888欧美视频在线| 青娱乐在线免费视频盛宴| 久久久久久久久久性潮| 亚洲欧美一区二区三区电影| 美女张开两腿让男人桶av| 色在线观看视频免费的| 91社福利《在线观看| 国产清纯美女al在线| 1024久久国产精品| 欧美精品免费aaaaaa| 91成人在线观看免费视频| 欧美黄色录像免费看的| 青草久久视频在线观看| 亚洲中文精品人人免费| 中文字幕一区二区人妻电影冢本 | 久久精品美女免费视频| 精品一区二区三区欧美| 日本三极片中文字幕| 成人免费做爰高潮视频| 中国老熟女偷拍第一页| 55夜色66夜色国产精品站| 91色秘乱一区二区三区| 久久久久久97三级| 国产刺激激情美女网站| www骚国产精品视频| 色吉吉影音天天干天天操| 91精品高清一区二区三区| 亚洲国产成人最新资源| 免费高清自慰一区二区三区网站| 97人妻无码AV碰碰视频| 香蕉片在线观看av| 亚洲欧美精品综合图片小说| 直接观看免费黄网站| 日韩美女搞黄视频免费| 欧美视频不卡一区四区| mm131美女午夜爽爽爽| av无限看熟女人妻另类av| 少妇露脸深喉口爆吞精| 成年人黄色片免费网站| 大胆亚洲av日韩av| wwwxxx一级黄色片| 亚洲av日韩av网站| 国产性感美女福利视频| 色婷婷六月亚洲综合香蕉| 国语对白xxxx乱大交| 在线制服丝袜中文字幕| 沙月文乃人妻侵犯中文字幕在线| 97精品综合久久在线| 天天操天天干天天艹| 日韩成人综艺在线播放| 色狠狠av线不卡香蕉一区二区| japanese日本熟妇另类| 亚国产成人精品久久久| 亚洲精品ww久久久久久| 日韩欧美一级黄片亚洲| 熟女人妻在线中出观看完整版| 日日爽天天干夜夜操| 亚洲国产免费av一区二区三区| 亚洲综合一区二区精品久久| 欧美精品中文字幕久久二区| 精品一区二区三区午夜| 久久久噜噜噜久久熟女av| 亚洲av日韩av网站| 一区二区三区精品日本| 五月天中文字幕内射| 青青在线视频性感少妇和隔壁黑丝| 免费观看污视频网站| 亚洲精品在线资源站| 午夜国产福利在线观看| 真实国模和老外性视频| av俺也去在线播放| 欧美一区二区三区乱码在线播放| 国产精品精品精品999| 狠狠躁夜夜躁人人爽天天天天97| 天天操天天爽天天干| 亚洲一区二区三区精品视频在线 | 在线国产精品一区二区三区| 97精品视频在线观看| 在线免费观看靠比视频的网站| 自拍 日韩 欧美激情| 色97视频在线播放| 中文字幕在线视频一区二区三区| 欧美日韩精品永久免费网址 | 亚洲人妻av毛片在线| 好了av中文字幕在线| 姐姐的朋友2在线观看中文字幕| 天天色天天操天天透| 美日韩在线视频免费看| 在线网站你懂得老司机| 福利视频广场一区二区| 欧洲黄页网免费观看| 亚洲1069综合男同| 亚洲在线一区二区欧美| 天堂av中文在线最新版| 一二三中文乱码亚洲乱码one | 40道精品招牌菜特色| yy6080国产在线视频| 日韩一区二区电国产精品| 国产一级精品综合av| 亚洲护士一区二区三区| 国产午夜亚洲精品麻豆| 天天躁夜夜躁日日躁a麻豆| 亚洲一区二区三区uij| 久久免费看少妇高潮完整版| 国产男女视频在线播放| 中文字幕在线视频一区二区三区| 99热久久这里只有精品| 国产亚洲视频在线观看| 国产亚州色婷婷久久99精品| 淫秽激情视频免费观看| av俺也去在线播放| 久久美欧人妻少妇一区二区三区| 超碰中文字幕免费观看| 粉嫩av蜜乳av蜜臀| 国产性生活中老年人视频网站| 日韩一个色综合导航| 在线观看亚洲人成免费网址| 特黄老太婆aa毛毛片| 91在线视频在线精品3| 日韩a级黄色小视频| 亚洲av一妻不如妾| 在线观看av2025| 9l人妻人人爽人人爽| 啊啊好大好爽啊啊操我啊啊视频| 亚洲欧美一区二区三区爱爱动图| 午夜青青草原网在线观看| 精品91自产拍在线观看一区| 亚洲av无码成人精品区辽| 亚洲嫩模一区二区三区| 国产亚洲欧美另类在线观看| 在线免费观看av日韩| 激情图片日韩欧美人妻| 国产高清女主播在线| 日视频免费在线观看| 97精品综合久久在线| 欧美伊人久久大香线蕉综合| 乱亲女秽乱长久久久| 91国产在线视频免费观看| 国产精品视频男人的天堂| 伊人开心婷婷国产av| 18禁免费av网站| 久久香蕉国产免费天天| 精品老妇女久久9g国产| 亚洲伊人色一综合网| 黑人大几巴狂插日本少妇| 国产精品久久久久久久久福交| 国产午夜无码福利在线看| 中文字幕在线免费第一页| 天天色天天操天天透| 久草极品美女视频在线观看| 国产精品一二三不卡带免费视频| 日本性感美女三级视频| 国产性感美女福利视频| 绯色av蜜臀vs少妇| 午夜在线精品偷拍一区二| 日日夜夜精品一二三| 亚洲综合一区二区精品久久| 亚洲一区二区人妻av| 久久精品美女免费视频| 中文字幕免费在线免费| wwwxxx一级黄色片| 日本五十路熟新垣里子| 日韩精品激情在线观看| 夜夜操,天天操,狠狠操| 好吊操视频这里只有精品| 亚洲 色图 偷拍 欧美| 狠狠操操操操操操操操操| 换爱交换乱高清大片| 黄色大片男人操女人逼| 国产在线一区二区三区麻酥酥| 91 亚洲视频在线观看| 最新黄色av网站在线观看| 日韩少妇人妻精品无码专区| 少妇系列一区二区三区视频| av手机免费在线观看高潮| 夜鲁夜鲁狠鲁天天在线| 熟女人妻在线中出观看完整版| 51国产偷自视频在线播放| 99精品免费久久久久久久久a| 午夜场射精嗯嗯啊啊视频| 好了av中文字幕在线| 日本美女成人在线视频| 亚洲av香蕉一区区二区三区犇| 综合精品久久久久97| 欧美第一页在线免费观看视频| 99国产精品窥熟女精品| 最新97国产在线视频| 在线国产日韩欧美视频| 自拍偷拍 国产资源| 久久丁香婷婷六月天| 国产精品久久久久国产三级试频| 大肉大捧一进一出好爽在线视频| 午夜精品一区二区三区城中村| mm131美女午夜爽爽爽| 可以在线观看的av中文字幕| 好吊视频—区二区三区| 日韩美女福利视频网| 亚洲女人的天堂av| 日韩欧美国产一区不卡| 51国产成人精品视频| 亚洲精品国产久久久久久| 绝色少妇高潮3在线观看| 在线观看日韩激情视频| 亚洲 欧美 精品 激情 偷拍| 亚洲男人在线天堂网| 亚洲最大免费在线观看| 免费一级特黄特色大片在线观看| 日本性感美女视频网站| 欧美黑人性猛交xxxxⅹooo| 老司机午夜精品视频资源| 绯色av蜜臀vs少妇| 国产一区二区神马久久| 成人国产影院在线观看| 最新激情中文字幕视频| 国产三级片久久久久久久| 国产免费av一区二区凹凸四季| 精品视频一区二区三区四区五区| 精品欧美一区二区vr在线观看| 一色桃子人妻一区二区三区| 成人区人妻精品一区二视频| 久久久极品久久蜜桃| av在线资源中文字幕| 女蜜桃臀紧身瑜伽裤| 激情五月婷婷免费视频| 早川濑里奈av黑人番号| 中国把吊插入阴蒂的视频| 天堂av在线播放免费| 亚洲av第国产精品| 91精品激情五月婷婷在线| 精品国产在线手机在线| 日噜噜噜夜夜噜噜噜天天噜噜噜| 欧美另类一区二区视频| 国产一级精品综合av| 婷婷色国产黑丝少妇勾搭AV| 国产日韩精品一二三区久久久| 中文字幕第三十八页久久| 国产视频一区在线观看| 亚洲成人线上免费视频观看| 五十路熟女人妻一区二| 国产熟妇乱妇熟色T区| 人妻少妇性色欲欧美日韩| 欧美va亚洲va天堂va| 少妇深喉口爆吞精韩国| 好了av中文字幕在线| 中国黄色av一级片| 2012中文字幕在线高清| 日本熟妇喷水xxx| 国产成人午夜精品福利| 福利视频网久久91| 黄片三级三级三级在线观看| 日本少妇人妻xxxxx18| 亚洲福利天堂久久久久久| sspd152中文字幕在线| 日视频免费在线观看| 日本黄色特一级视频| 人人超碰国字幕观看97| 国产精品成人xxxx| 中英文字幕av一区| 国产综合精品久久久久蜜臀| 青青草原网站在线观看| 青青青青青手机视频| av男人天堂狠狠干| av网址国产在线观看| 久久这里只有精品热视频| 91精品视频在线观看免费| 边摸边做超爽毛片18禁色戒| 天天综合天天综合天天网| 偷拍自拍视频图片免费| 男生舔女生逼逼的视频| 91片黄在线观看喷潮| 天天日天天日天天射天天干 | 午夜在线一区二区免费| 老司机免费福利视频网| 亚洲中文字字幕乱码| 嫩草aⅴ一区二区三区| 欧美黄片精彩在线免费观看| 特大黑人巨大xxxx| 国产真实乱子伦a视频| 午夜大尺度无码福利视频 | 中英文字幕av一区| 大香蕉日本伊人中文在线| av线天堂在线观看| 女生自摸在线观看一区二区三区| 91精品国产黑色丝袜| 久久精品国产亚洲精品166m| 超级福利视频在线观看| 免费一级黄色av网站| 丝袜长腿第一页在线| 亚洲成人国产av在线| 国语对白xxxx乱大交| 天天操天天操天天碰| 欧美怡红院视频在线观看| 又大又湿又爽又紧A视频| 日日夜夜大香蕉伊人| 天天日天天操天天摸天天舔| 色噜噜噜噜18禁止观看| 人人妻人人爽人人添夜| 成年人免费看在线视频| 日比视频老公慢点好舒服啊| 国产精品手机在线看片| 欧美中文字幕一区最新网址| 亚洲无线观看国产高清在线| 亚洲激情偷拍一区二区| 岛国免费大片在线观看| 大鸡吧插逼逼视频免费看| 操日韩美女视频在线免费看| 91国内视频在线观看| 一区二区三区美女毛片| 天天躁日日躁狠狠躁躁欧美av| 久久国产精品精品美女| 2020久久躁狠狠躁夜夜躁 | 免费观看理论片完整版| 国产综合高清在线观看| 97精品成人一区二区三区| 非洲黑人一级特黄片| 91精品高清一区二区三区| 久久永久免费精品人妻专区 | 国产美女一区在线观看| 一级黄色片夫妻性生活| 亚洲图片欧美校园春色| av一本二本在线观看| 东游记中文字幕版哪里可以看到| 免费费一级特黄真人片| 中文字幕人妻av在线观看| 18禁无翼鸟成人在线| 国产麻豆剧果冻传媒app| 国产性色生活片毛片春晓精品| 亚洲成人av一区在线| 国产刺激激情美女网站| 亚洲一区二区三区偷拍女厕91 | 四川五十路熟女av| 国产精品久久久久久久精品视频 | 91p0rny九色露脸熟女| 超级碰碰在线视频免费观看| 国产黄色片蝌蚪九色91| 亚洲欧美精品综合图片小说| 三上悠亚和黑人665番号| 男人的天堂av日韩亚洲| 真实国模和老外性视频| 亚洲欧美日韩视频免费观看| 久久国产精品精品美女| 日韩精品中文字幕播放| 中国熟女@视频91| 很黄很污很色的午夜网站在线观看| 久草极品美女视频在线观看| 国产美女午夜福利久久| 亚洲人妻av毛片在线| 色秀欧美视频第一页| 少妇人妻二三区视频| 亚洲一级av无码一级久久精品| 黄网十四区丁香社区激情五月天| 国产日本欧美亚洲精品视| 91欧美在线免费观看| 午夜精彩视频免费一区| 国产V亚洲V天堂无码欠欠| 国产黑丝高跟鞋视频在线播放| 大鸡巴插入美女黑黑的阴毛| 亚洲另类在线免费观看| 中文字幕视频一区二区在线观看 | 粉嫩小穴流水视频在线观看| 成人亚洲精品国产精品| 欧美日韩不卡一区不区二区| 亚洲欧美国产综合777| 亚洲中文字字幕乱码| 伊人综合免费在线视频| 桃色视频在线观看一区二区| 91免费黄片可看视频| 中文字幕成人日韩欧美| 精品国产午夜视频一区二区| 最新中文字幕免费视频| 亚洲男人让女人爽的视频| 亚洲va天堂va国产va久| 天天日天天日天天射天天干| 大肉大捧一进一出好爽在线视频| 免费看国产av网站| 中文字幕国产专区欧美激情| 日日操综合成人av| 97超碰最新免费在线观看| 国产97在线视频观看| 免费观看国产综合视频| 97超碰国语国产97超碰| 午夜精品久久久久麻豆影视| 久久精品亚洲国产av香蕉| 亚洲中文精品字幕在线观看| 国产又色又刺激在线视频| 国产亚洲视频在线二区| 超碰97免费人妻麻豆| 天天操天天插天天色| 91免费放福利在线观看| 国产成人精品福利短视频| 超pen在线观看视频公开97| 九九热99视频在线观看97| 亚洲精品国品乱码久久久久| 含骚鸡巴玩逼逼视频| 日韩美在线观看视频黄| 国产精品中文av在线播放| 97超碰人人搞人人| 91一区精品在线观看| 中文字幕在线永久免费播放| 国产女人露脸高潮对白视频| av网站色偷偷婷婷网男人的天堂| 天天躁日日躁狠狠躁躁欧美av| 国产精品污污污久久| 青娱乐蜜桃臀av色| 中文字日产幕乱六区蜜桃| 乱亲女秽乱长久久久| 好太好爽好想要免费| 97精品人妻一区二区三区精品| 漂亮 人妻被中出中文| 日本乱人一区二区三区| 一区二区三区四区五区性感视频| 97精品成人一区二区三区| 天天日天天干天天爱| 天堂va蜜桃一区入口| 欧美美女人体视频一区| 欧美精品 日韩国产| 午夜婷婷在线观看视频| 国产精品一区二区久久久av| 在线免费观看99视频| 成人动漫大肉棒插进去视频| 在线观看视频污一区| 黄工厂精品视频在线观看| 欧美日韩激情啪啪啪| 五月精品丁香久久久久福利社| 国产麻豆国语对白露脸剧情| www骚国产精品视频| 老熟妇凹凸淫老妇女av在线观看| 91在线视频在线精品3| 欧美精产国品一二三产品区别大吗| 日本熟妇一区二区x x| 五十路熟女人妻一区二区9933| 三级黄色亚洲成人av| 免费黄页网站4188| 色婷婷综合激情五月免费观看| yellow在线播放av啊啊啊| 国产精品3p和黑人大战| 成人精品在线观看视频| 日本在线不卡免费视频| 亚洲中文字幕人妻一区| 国产精品人妻一区二区三区网站| 欧洲黄页网免费观看| 一级a看免费观看网站| yy96视频在线观看| 91天堂天天日天天操| 青青草在观免费国产精品| 97超碰国语国产97超碰| 最近的中文字幕在线mv视频| 天天干天天日天天干天天操| 91福利在线视频免费观看| 欧美精品久久久久久影院| 大香蕉伊人国产在线| 日韩美女精品视频在线观看网站| 在线可以看的视频你懂的| 女蜜桃臀紧身瑜伽裤| av森泽佳奈在线观看| 爱爱免费在线观看视频| 91国产在线视频免费观看| ka0ri在线视频| 91av中文视频在线| 91麻豆精品91久久久久同性| 欧美男人大鸡吧插女人视频| 亚洲 自拍 色综合图| 中文字幕高清在线免费播放| 青青草原色片网站在线观看| 人妻少妇亚洲精品中文字幕| 欧美天堂av无线av欧美| 国产精品福利小视频a| 日视频免费在线观看| 日视频免费在线观看| 亚洲1069综合男同| 日噜噜噜夜夜噜噜噜天天噜噜噜| av线天堂在线观看| 欧美第一页在线免费观看视频| 51精品视频免费在线观看| 亚洲精品三级av在线免费观看| 日本www中文字幕| 一区二区三区在线视频福利| 青青草视频手机免费在线观看| 一级a看免费观看网站| 日本精品一区二区三区在线视频。 | 日本熟妇色熟妇在线观看| 亚洲av无硬久久精品蜜桃| 免费在线观看视频啪啪| 9色在线视频免费观看| av男人天堂狠狠干| av资源中文字幕在线观看| 亚洲国产精品美女在线观看| 亚洲欧美清纯唯美另类| 成年午夜影片国产片| 97色视频在线观看| 日本真人性生活视频免费看| 黄色资源视频网站日韩| 大尺度激情四射网站| 中出中文字幕在线观看| 中国产一级黄片免费视频播放| 中文字幕第一页国产在线| 在线观看av观看av| 精彩视频99免费在线| 天堂v男人视频在线观看| av男人天堂狠狠干| 伊人精品福利综合导航| 一区二区久久成人网| 日辽宁老肥女在线观看视频| 国产视频网站一区二区三区 | 在线观看av亚洲情色| 国产精品国产三级国产午| 亚洲精品精品国产综合| 午夜精品福利一区二区三区p | 日韩近亲视频在线观看| 免费看高清av的网站| 日本人竟这样玩学生妹| 亚洲欧美自拍另类图片| 中文字幕在线乱码一区二区 | 日本真人性生活视频免费看| 午夜福利人人妻人人澡人人爽| 成人高潮aa毛片免费| 少妇人妻真实精品视频| 婷婷激情四射在线观看视频| 黄工厂精品视频在线观看| 蜜臀av久久久久蜜臀av麻豆| 久久久超爽一二三av| 大鸡八强奸视频在线观看| 2o22av在线视频| 亚洲男人在线天堂网| 在线免费观看国产精品黄色| 18禁网站一区二区三区四区| 久草福利电影在线观看| 自拍偷拍,中文字幕| 日本性感美女视频网站| 3337p日本欧洲大胆色噜噜| 欧美成人一二三在线网| gogo国模私拍视频| 日韩影片一区二区三区不卡免费 | 中文字幕av一区在线观看| 天天日天天爽天天爽| 日本熟女50视频免费| 免费69视频在线看| 成人高清在线观看视频| 内射久久久久综合网| 亚洲激情偷拍一区二区| japanese五十路熟女熟妇| 日本少妇人妻xxxxxhd| 在线观看av观看av| 99精品一区二区三区的区| 91桃色成人网络在线观看| 亚洲精品麻豆免费在线观看 | 很黄很污很色的午夜网站在线观看 | 天天操天天干天天日狠狠插| 日本免费午夜视频网站| 日本免费午夜视频网站| 国产av一区2区3区| 四川乱子伦视频国产vip| 四川乱子伦视频国产vip| 国产真实乱子伦a视频| 亚洲一区二区三区av网站| 天天干天天爱天天色| 999久久久久999| 天天干天天操天天爽天天摸| 蜜臀成人av在线播放| 国产精品手机在线看片| 99国内精品永久免费视频| 91国产在线免费播放| 大香蕉福利在线观看| 老司机福利精品视频在线| 婷婷午夜国产精品久久久| 国产高清女主播在线| 欧美一区二区三区四区性视频| 亚洲 国产 成人 在线| 国产在线拍揄自揄视频网站| 成人av免费不卡在线观看| 国产女孩喷水在线观看| 久久久久久cao我的性感人妻| 日本免费午夜视频网站| 国产1区,2区,3区| 亚洲福利天堂久久久久久| 午夜在线观看岛国av,com| 精品久久久久久高潮| 玩弄人妻熟妇性色av少妇| 亚洲国产美女一区二区三区软件| 午夜91一区二区三区| 中文字母永久播放1区2区3区| 91天堂天天日天天操| 五十路av熟女松本翔子| 日本性感美女写真视频| 亚洲蜜臀av一区二区三区九色| 黄片色呦呦视频免费看| 大香蕉伊人中文字幕| 97人妻无码AV碰碰视频| 天天干天天操天天爽天天摸| 农村胖女人操逼视频| 欧美日韩v中文在线| 在线不卡日韩视频播放| 国产视频精品资源网站| 91超碰青青中文字幕| 熟女在线视频一区二区三区| 亚洲精品午夜aaa久久| 免费岛国喷水视频在线观看| 97精品成人一区二区三区| 国产一区二区久久久裸臀| 丰满的子国产在线观看| av老司机精品在线观看| 国产黄色a级三级三级三级| 国产伊人免费在线播放| 蜜桃精品久久久一区二区| 福利午夜视频在线观看| 国产亚洲国产av网站在线| 国产精品久久久久久美女校花| 偷拍3456eee| 亚洲伊人av天堂有码在线| 日本精品美女在线观看| 天天色天天操天天舔| 91啪国自产中文字幕在线| 青青青青爽手机在线| 又色又爽又黄又刺激av网站| av视网站在线观看| asmr福利视频在线观看| 搡老妇人老女人老熟女| 青青伊人一精品视频| 青春草视频在线免费播放| 岛国免费大片在线观看| 欧美日本在线观看一区二区| 青青青青操在线观看免费| 欧美xxx成人在线| 国际av大片在线免费观看| 青青草人人妻人人妻| 色哟哟在线网站入口| 少妇与子乱在线观看| 日韩亚国产欧美三级涩爱| 精品一区二区亚洲欧美| 骚逼被大屌狂草视频免费看| 色花堂在线av中文字幕九九 | 婷婷综合亚洲爱久久| 日本精品美女在线观看| 中文字幕在线永久免费播放| 天美传媒mv视频在线观看| av俺也去在线播放| 99一区二区在线观看| 亚洲精品高清自拍av| 久久丁香花五月天色婷婷| 超级碰碰在线视频免费观看| japanese日本熟妇另类| 91老熟女连续高潮对白| 亚洲精品国产综合久久久久久久久| 日本中文字幕一二区视频| 18禁美女羞羞免费网站| 在线不卡日韩视频播放| 青青青爽视频在线播放| 青青青青青青草国产| 18禁网站一区二区三区四区| 久久久久久九九99精品| 成人福利视频免费在线| 免费在线福利小视频| 中文字幕网站你懂的| 专门看国产熟妇的网站| 激情五月婷婷综合色啪| 亚洲综合在线观看免费| 国产福利小视频二区| 国产普通话插插视频| 在线国产日韩欧美视频| 国产性感美女福利视频| 2020国产在线不卡视频 | 一区二区三区另类在线 | 激情国产小视频在线| 国产精品女邻居小骚货| 日韩美女搞黄视频免费| 免费一级特黄特色大片在线观看| 亚洲天堂成人在线观看视频网站| 中英文字幕av一区| 抽查舔水白紧大视频| 国产片免费观看在线观看| 视频一区二区综合精品| 久久久久久久久久一区二区三区| 亚洲美女高潮喷浆视频| 美女吃鸡巴操逼高潮视频| 亚洲精品麻豆免费在线观看| 中文字幕乱码av资源| 91久久精品色伊人6882| 狠狠鲁狠狠操天天晚上干干| 欧美偷拍亚洲一区二区| av破解版在线观看| 黄片三级三级三级在线观看| 亚洲成人熟妇一区二区三区 | 丰满少妇翘臀后进式| 精产国品久久一二三产区区别| 99久久99一区二区三区| 亚洲精品无码久久久久不卡| 国产精品久久久久久久精品视频| 亚洲熟女女同志女同| 免费黄色成人午夜在线网站| 色综合天天综合网国产成人| 丰满的继坶3中文在线观看| 国产真实灌醉下药美女av福利| 老司机在线精品福利视频| 亚洲伊人色一综合网| 亚洲欧美激情中文字幕| 福利视频网久久91| 欧美专区第八页一区在线播放| 91九色porny国产在线| 最新91精品视频在线| 欲满人妻中文字幕在线| 精品人妻伦一二三区久| 黑人3p华裔熟女普通话| 久草视频首页在线观看| 亚洲av日韩av网站| 99久久久无码国产精品性出奶水| 青青色国产视频在线| 新婚人妻聚会被中出| 亚洲狠狠婷婷综合久久app | 日本精品美女在线观看| 日韩一个色综合导航| 可以在线观看的av中文字幕| 亚洲精品无码久久久久不卡| 在线观看亚洲人成免费网址| 久久美欧人妻少妇一区二区三区| 少妇被强干到高潮视频在线观看| 亚洲蜜臀av一区二区三区九色| 成人av亚洲一区二区| 孕妇奶水仑乱A级毛片免费看| 一个人免费在线观看ww视频| 欧美香蕉人妻精品一区二区| 韩国爱爱视频中文字幕| 人妻另类专区欧美制服| 午夜精品一区二区三区更新| 中国黄色av一级片| japanese日本熟妇另类| 国产在线观看免费人成短视频| 国产福利在线视频一区| 亚洲伊人久久精品影院一美女洗澡| 99精品国产免费久久| 日本在线一区二区不卡视频| 色哟哟在线网站入口| 中字幕人妻熟女人妻a62v网| 一区二区三区另类在线| 91国内精品久久久久精品一| 日韩午夜福利精品试看| 黄色黄色黄片78在线| 国产高清在线在线视频| 亚洲成人激情视频免费观看了| 偷拍自拍福利视频在线观看| 午夜国产免费福利av| 国产美女一区在线观看| 亚洲欧美激情中文字幕| 阴茎插到阴道里面的视频| av黄色成人在线观看| 大香蕉伊人国产在线| 91精品国产麻豆国产| 女同久久精品秋霞网| 99久久超碰人妻国产| 中文字幕日韩精品日本| 大胆亚洲av日韩av| 精品亚洲国产中文自在线| 日本女人一级免费片| 懂色av之国产精品| 欧美精品资源在线观看| av高潮迭起在线观看| 无忧传媒在线观看视频| 国产一区二区三免费视频| 91老熟女连续高潮对白| 成年女人免费播放视频| 桃色视频在线观看一区二区| 亚洲午夜伦理视频在线| 一区二区三区四区中文| 国产精品国产三级国产午| 中文字幕在线免费第一页| 大陆胖女人与丈夫操b国语高清| av在线免费观看亚洲天堂| 精品一区二区三区三区色爱| 在线免费观看日本伦理| 91久久国产成人免费网站| 天天日天天日天天射天天干| av中文字幕福利网| 99精品久久久久久久91蜜桃| 啪啪啪18禁一区二区三区| 亚洲av第国产精品| 亚洲天堂有码中文字幕视频| 亚洲一区二区三区偷拍女厕91| 欧美aa一级一区三区四区| mm131美女午夜爽爽爽| 黄色男人的天堂视频| 亚洲高清视频在线不卡| 亚洲欧美清纯唯美另类| 日韩精品中文字幕播放| 青草亚洲视频在线观看| 午夜的视频在线观看| 国产女人被做到高潮免费视频| 亚洲福利精品福利精品福利| 午夜精彩视频免费一区| 五十路丰满人妻熟妇| 日本后入视频在线观看| 亚洲一区二区三区精品乱码| 亚洲视频在线观看高清| 精彩视频99免费在线| 久草电影免费在线观看| 国产熟妇人妻ⅹxxxx麻豆| 人人妻人人爽人人添夜| 在线 中文字幕 一区| 综合页自拍视频在线播放| 精品91高清在线观看| 人妻丝袜av在线播放网址| 中文字母永久播放1区2区3区| 在线观看欧美黄片一区二区三区| 青青擦在线视频国产在线| 色综合色综合色综合色| 欧美日韩人妻久久精品高清国产 | 91色秘乱一区二区三区| 精品国产亚洲av一淫| 91久久综合男人天堂| 91九色国产熟女一区二区| 在线国产中文字幕视频| 国产中文精品在线观看| 日本女大学生的黄色小视频| 绝色少妇高潮3在线观看| 国产精品国产三级国产精东| 91亚洲手机在线视频播放| 狍和女人的王色毛片| 中国老熟女偷拍第一页| av破解版在线观看| 啪啪啪啪啪啪啪免费视频| 亚洲公开视频在线观看| 啪啪啪啪啪啪啪啪av| 日日爽天天干夜夜操| 天天插天天色天天日| 欧美综合婷婷欧美综合| 国产又粗又猛又爽又黄的视频美国| 一区二区三区四区五区性感视频| 国产大鸡巴大鸡巴操小骚逼小骚逼| 欧美日本在线视频一区| 少妇ww搡性bbb91| 午夜的视频在线观看| 国产午夜激情福利小视频在线| 国产成人无码精品久久久电影| 亚洲天堂第一页中文字幕| 91九色porny蝌蚪国产成人| 极品丝袜一区二区三区| 欧美中国日韩久久精品| 免费一级特黄特色大片在线观看| 国产又粗又黄又硬又爽| 人妻另类专区欧美制服| 在线播放国产黄色av| 亚洲国产欧美国产综合在线 | 直接观看免费黄网站| 在线视频国产欧美日韩| 粉嫩av蜜乳av蜜臀| 久久永久免费精品人妻专区| 亚洲国产精品久久久久久6| 岛国黄色大片在线观看| mm131美女午夜爽爽爽| 日本韩国亚洲综合日韩欧美国产| 一区二区熟女人妻视频| av中文在线天堂精品| 四虎永久在线精品免费区二区| 欧美一区二区三区啪啪同性| 国产九色91在线观看精品| 熟女在线视频一区二区三区| 少妇一区二区三区久久久| 丁香花免费在线观看中文字幕| av天堂资源最新版在线看| 超污视频在线观看污污污| 天天干天天日天天干天天操| 欧美性受xx黑人性猛交| 精品一区二区三区午夜| 91人妻精品久久久久久久网站| av在线资源中文字幕| 天美传媒mv视频在线观看| 久久久久五月天丁香社区| 最后99天全集在线观看| 五十路av熟女松本翔子| 少妇人妻二三区视频| 天天操天天污天天射| 老司机在线精品福利视频| 999热精品视频在线| 精品一区二区三区欧美| 欧美男人大鸡吧插女人视频| 亚洲va国产va欧美精品88| 亚洲高清国产一区二区三区| 孕妇奶水仑乱A级毛片免费看| 在线观看免费岛国av| 中文字幕在线第一页成人| 欧美日韩国产一区二区三区三州| 97超碰最新免费在线观看| 适合午夜一个人看的视频| 18禁污污污app下载| 精品欧美一区二区vr在线观看 | 亚洲欧美清纯唯美另类| 日本三极片中文字幕| 果冻传媒av一区二区三区| 丁香花免费在线观看中文字幕| 欧美亚洲少妇福利视频| 孕妇奶水仑乱A级毛片免费看| 免费黄高清无码国产| 一级黄色av在线观看| 黑人性生活视频免费看| 免费观看污视频网站| 男人天堂色男人av| 中文字幕一区二区亚洲一区| 成年女人免费播放视频| 丝袜亚洲另类欧美变态| 亚洲丝袜老师诱惑在线观看| 亚洲第一黄色在线观看| 人妻少妇亚洲一区二区| 精品国产成人亚洲午夜| 高清一区二区欧美系列| 午夜精品一区二区三区4| 欧美亚洲少妇福利视频| 玩弄人妻熟妇性色av少妇| 99亚洲美女一区二区三区| 欧美精品激情在线最新观看视频| 57pao国产一区二区| 国产午夜福利av导航| 中文字幕在线一区精品| 日韩写真福利视频在线观看| 天天夜天天日天天日| 日韩无码国产精品强奸乱伦| 女同性ⅹxx女同h偷拍| 超级福利视频在线观看| 久久精品国产亚洲精品166m|