亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python入門操作-時間序列分析的重要性

系統 2164 0

時間序列(或稱動態數列)是指將同一統計指標的數值按其發生的時間先后順序排列而成的數列。時間序列分析的主要目的是根據已有的歷史數據對未來進行預測。本文我們會分享如何用歷史股票數據進行基本的時間序列分析(以下簡稱時序分析)。首先我們會創建一個靜態預測模型,檢測模型的效度,然后分享一些用于時序分析的重要工具。

在創建模型之前,我們先簡要了解時間序列的一些基本參數,比如移動平均線、趨勢、季節性等。

獲取數據

我們本文會用到 MRF 過去五年的“調整價格”,用 pandas_datareader 可以從 Yahoo財經上獲取所需的數據。我們首先導入需要的庫:

            
              import pandas as pd
import pandas_datareader as web
import matplotlib.pyplot as plt
import numpy as np


            
          

現在我們用 datareader 獲取數據,主要是自 2012 年 1 月 1 日至 2017 年 12 月 21 日的股票數據。當然也可以只用調整收盤價,因為這是最相關的價格,應用在所有的金融分析中。

            
              stock = web.DataReader('MRF.BO','yahoo', start = "01-01-2012", end="31-12-2017")
stock = stock.dropna(how=’any’)


            
          

我們可以用 head() 函數檢查數據。

            
              stock.head()


            
          

Python入門操作-時間序列分析的重要性_第1張圖片

我們可以用導入的 matplotlib 庫再次繪制出時間段內的調整價格。

            
              stock[‘Adj Close’].plot(grid = True)


            
          

Python入門操作-時間序列分析的重要性_第2張圖片

計算和繪制每日收益

利用時間序列,我們可以計算出隨著時間變化的每日收益,并繪制出收益變化圖。我們將從股票的調整收盤價中計算出每日收益,以列名“ret”儲存在同一數據幀“stock”中。

            
              stock['ret'] = stock['Adj Close'].pct_change()
stock['ret'].plot(grid=True)


            
          

Python入門操作-時間序列分析的重要性_第3張圖片

移動平均數

和收益相同,我們可以計算和繪制出調整收盤價格的移動平均線。移動平均線是廣泛應用于技術分析中的一個非常重要的指標。出于簡要說明的目的,這里我們只計算 20 天移動平均線作為示例。

            
              stock['20d'] = stock['Adj Close'].rolling(window=20, center=False).mean()
stock['20d'].plot(grid=True)


            
          

在搭建模型預測前,我們先快速看看時間序列中的趨勢和季節性。

Python入門操作-時間序列分析的重要性_第4張圖片

趨勢和季節性

簡單來說,趨勢表示時間序列在一段時間內的整體發展方向。趨勢和趨勢分析同樣廣泛應用于技術分析中。如果在時間序列中定期出現一些模式,我們就說數據具有季節性。時間序列中的季節性會影響預測模型的結果,因此對它不能掉以輕心。

如果你依然在編程的世界里迷茫,可以加入我們的Python學習扣qun:784758214,看看前輩們是如何學習的。交流經驗。從基礎的python腳本到web開發、爬蟲、django、數據挖掘等,零基礎到項目實戰的資料都有整理。送給每一位python的小伙伴!分享一些學習的方法和需要注意的小細節,點擊加入我們的 python學習者聚集地

預測

我們會討論一個簡單的線性分析模型,假設時間序列呈靜態,且沒有季節性。也就是這里我們假設時間序列呈線性趨勢。模型可以表示為:

            
              Forecast (t) = a + b X t


            
          

這里的“a”為時間序列在Y軸上的截距,“b”為斜率。我們現在看看 a 和 b 的計算。我們考慮時間序列在時間段“t”內的值D(t)。

在這個方程式中,“n”是樣本大小。我們可以通過用上面的模型計算 D(t)的預測值,并將值和實際觀測值比較,進而驗證我們的模型。我們可以計算出平均誤差,即預測 D(t)值和實際 D(t)值之間的差距的平均值。

在我們的股票數據中,D(t)是 MRF 的調整收盤價。我們現在用 Python 計算 a,b,預測值和它們的誤差值。

            
              #Populates the time period number in stock under head t
stock['t'] = range (1,len(stock)+1)

#Computes t squared, tXD(t) and n
stock['sqr t']=stock['t']**2
stock['tXD']=stock['t']*stock['Adj Close']
n=len(stock)

#Computes slope and intercept
slope = (n*stock['tXD'].sum() - stock['t'].sum()*stock['Adj Close'].sum())/(n*stock['sqr t'].sum() - (stock['t'].sum())**2)
intercept = (stock['Adj Close'].sum()*stock['sqr t'].sum() - stock['t'].sum()*stock['tXD'].sum())/(n*stock['sqr t'].sum() - (stock['t'].sum())**2)
print ('The slope of the linear trend (b) is: ', slope)
print ('The intercept (a) is: ', intercept)


            
          

上面的代碼會給出如下輸出:

            
              The slope of the linear trend (b) is: 41.2816591061

The intercept (a) is: 1272.6557803


            
          

我們現在可以通過計算預測值和平均誤差來驗證模型的效度。

            
              #Computes the forecasted values
stock['forecast'] = intercept + slope*stock['t']

#Computes the error
stock['error'] = stock['Adj Close'] - stock['forecast']
mean_error=stock['error'].mean()
print ('The mean error is: ', mean_error)


            
          

輸出的平均誤差如下所示:

            
              The mean error is: 1.0813935108094419e-10


            
          

從平均誤差值可以看出,我們的模型給出的值非常接近實際值。因此數據沒有受到任何季節性方面的影響。

下面我們討論一些用于分析時序數據的很實用的工具,它們對于金融交易員在設計和預先測試交易策略時非常有幫助。

交易員們常常要處理大量的歷史數據,并且根據這些時間序列進行數據分析。我們這里重點分享一下如何應對時間序列中的日期和頻率,以及索引、切片等操作。主要會用到 datetime庫。

我們首先將 datetime 庫導入到程序中。

            
              #Importing the required modules

from datetime import datetime
from datetime import timedelta


            
          

處理日期和時間的基本工具

先將當前日期和時間保存在變量“current_time”中,執行代碼如下:

            
              #Printing the current date and time

current_time = datetime.now()
current_time
Output: datetime.datetime(2018, 2, 14, 9, 52, 20, 625404)


            
          

我們可以用 datetime 計算兩個日期的不同之處。

            
              #Calculating the difference between two dates (14/02/2018 and 01/01/2018 09:15AM)

delta = datetime(2018,2,14)-datetime(2018,1,1,9,15)
delta
Output: datetime.timedelta(43, 53100)


            
          

使用如下代碼將輸出轉換為用“天”或“秒”表達:

            
              #Converting the output to days

delta.days
Output: 43

#Converting the output to seconds

delta.seconds
Output: 53100


            
          

如果我們想變換日期,可以用前面導入的 timedelta 模塊。

            
              #Shift a date using timedelta

my_date = datetime(2018,2,10)

#Shift the date by 10 days

my_date + timedelta(10)
Output: datetime.datetime(2018, 2, 20, 0, 0)


            
          

我們也可以用 timedelta 函數的乘法。

            
              #Using multiples of timedelta function

my_date - 2*timedelta(10)
Output: datetime.datetime(2018, 1, 21, 0, 0)


            
          

我們前面看過了 datetime 模塊的“datetime”和“timedelta”數據類型。我們簡要說明一下在分析時間序列時用到的主要數據類型:

數據類型

描述

Date

用公歷保存日歷上的日期(年,月,日)

Time

將時間保存為小時、分鐘、秒和微秒

Datetime

保存date和time兩種數據類型

Timedelta

保存兩個datetime值的不同之處

字符串和 datetime 之間的轉換

我們可以將 datetime 格式轉換為字符串,并以字符串變量進行保存。也可以反過來,將表示日期的字符串轉換為 datetime 數據類型。

            
              #Converting datetime to string

my_date1 = datetime(2018,2,14)
str(my_date1)
Output: '2018-02-14 00:00:00'


            
          

我們可以用 strptime 函數將字符串轉換為 datetime。

            
              #Converting a string to datetime

datestr = '2018-02-14'
datetime.strptime(datestr, '%Y-%m-%d')
Output: datetime.datetime(2018, 2, 14, 0, 0)


            
          

也可以用 Pandas 處理日期。我們先導入 Pandas。

            
              #Importing pandas

import pandas as pd


            
          

在 Pandas 中用“to_datetime”將日期字符串轉換為 date 數據類型。

            
              #Using pandas to parse dates

datestrs = ['1/14/2018', '2/14/2018']
pd.to_datetime(datestrs)
Output: DatetimeIndex(['2018-01-14', '2018-02-14'], dtype='datetime64[ns]', freq=None)


            
          

在 Pandas 中,將缺失的時間或時間中的 NA 值表示為 NaT。

時間序列的索引和切片

為了更好的理解時間序列中的多種操作,我們用隨機數字創建一個時間序列。

            
              #Creating a time series with random numbers

import numpy as np
from random import random
dates = [datetime(2011, 1, 2), datetime(2011, 1, 5), datetime(2011, 1, 7), datetime(2011, 1, 8), datetime(2011, 1, 10), datetime(2011, 1, 12)]
ts = pd.Series(np.random.randn(6), index=dates)
ts

Output:
2011-01-02   0.888329
2011-01-05  -0.152267
2011-01-07   0.854689
2011-01-08   0.680432
2011-01-10   0.123229
2011-01-12  -1.503613
dtype: float64


            
          

用我們展示的索引,可以將該時間序列的元素調用為任何其它 Pandas 序列。

ts[’01/02/2011′] 或 ts[‘20110102’]會給出同樣的輸出0.888329

切片操作和我們對其它 Pandas 序列的切片操作相同。

時間序列中的重復索引

有時你的時間序列會包含重復索引。看一下如下時間序列:

            
              #Slicing the time series

ts[datetime(2011,1,7):]
Output:
2011-01-07 0.854689
2011-01-08 0.680432
2011-01-10 0.123229
2011-01-12 -1.503613
dtype: float64


            
          

在上面的時間序列中,我們可以看到“2018-01-02”重復出現了 3 次。我們可以用 index 函數的“is_unique”屬性檢查這一點。

            
              dup_ts.index.is_unique
Output: False


            
          

可以用 groupby 功能集合有相同索引的記錄。

            
              grouped=dup_ts.groupby(level=0)


            
          

我們現在可以根據自己的需求,使用這些記錄的平均值、計數、總和等等。

            
              grouped.mean()
Output:
2018-01-01 -0.471411
2018-01-02 -0.013973
2018-01-03 -0.611886
dtype: float64

grouped.count()
Output:
2018-01-01 1
2018-01-02 3
2018-01-03 1
dtype: int64

grouped.sum()
Output:
2018-01-01 -0.471411
2018-01-02 -0.041920
2018-01-03 -0.611886
dtype: float64


            
          

數據位移

我們可以用 shift 函數轉移時間序列的索引。

            
              #Shifting the time series
ts.shift(2)
Output:
2011-01-02 NaN
2011-01-05 NaN
2011-01-07 0.888329
2011-01-08 -0.152267
2011-01-10 0.854689
2011-01-12 0.680432
dtype: float64
在學習過程中有什么不懂得可以加我的
python學習交流扣扣qun,784758214
群里有不錯的學習視頻教程、開發工具與電子書籍。
與你分享python企業當下人才需求及怎么從零基礎學習好python,和學習什么內容

            
          

總結

本文我們簡要討論了時間序列的一些屬性,以及如何用 Python 計算它們。同時也用一個簡單的線性模型預測時間序列。最后分享了分析時間序列時用到的一些基本功能,比如將日期從一種格式轉換為另一種格式。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产免费私人影院永久免费 | 亚洲综合色视频在线观看 | 亚洲艹逼 | 日韩欧美视频免费观看 | 国产精品日韩欧美一区二区 | 欧美 日韩 成人 | 高清一级毛片一本到免费观看 | 亚洲欧美中文字幕在线网站 | 最新中文字幕在线播放 | 欧美人一级淫片a免费播放 欧美人与zoxxxx另类9 | 国产一区二区高清 | 天天综合天天干 | 日韩欧美在 | 99视频在线看| 久久影院一区二区三区 | 日本毛片在线观看 | 曰曰鲁夜夜免费播放视频 | 91亚洲影院 | 久久国产视频精品 | 尤物福利视频 | 天天色天天草 | 国产久爱青草视频在线观看 | 欧美乱插 | 99re6这里只有精品视频 | 亚洲欧美高清 | 国产亚洲精品国产福利在线观看 | 国产精品久久久久桃色tv | 牛牛影院成人网 | 爱色aⅴ| 橘梨纱视频一区二区在线观看 | 免费在线一级毛片 | 8050午夜一级全黄毛片 | 欧美日韩中文国产一区二区三区 | xxx中国bbbwww| 久热首页 | 亚洲精品国产手机 | 久久一二 | 第九色激情 | 六月丁香深爱六月综合激情 | 天天插天天射天天干 | 黄色毛片毛茸茸 |