파이썬 작업을 시작하기 - 시계열 분석

시계열 (또는 동적 시리즈) 열의 수 배열 된 순서의 발생의 통계적 지표 동시에 수있다. 시계열 분석의 주요 목적은 기존 기록 데이터를 기반으로 미래를 예측하는 것입니다. 이 문서에서 우리는 (이하 타이밍 분석이라한다)의 기본 시계열 분석을 수행하는 방법을 공유 역사적 재고 데이터를 사용합니다. 먼저 우리는 모델의 유효성을 테스트, 정적 예측 모델을 생성합니다 다음 타이밍 분석을위한 몇 가지 중요한 도구를 공유 할 수 있습니다.

당신이 모델을 생성하기 전에, 간단히 등등 이동 평균, 추세, 계절과 시간 시리즈의 기본 매개 변수 중 일부를 간략하게 설명 할 수 있습니다.

데이터 가져 오기

본 논문에서는 5 년 과거 MRF를 사용합니다 "가격 조정은"당신은 pandas_datareader 야후 금융에서 데이터를 얻을 수 있습니다. 우리가 먼저 라이브러리를 가져와야합니다 :

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

이제 12 월 (21), 2017에 데이터 DataReader를 년 1 ​​월 1 일, 2012 주로 주식 데이터를 얻을. 그것은 가장 관련성 가격, 재무 분석에서 모든 응용 프로그램이기 때문에 물론, 당신은 또한 단지, ​​종가를 조정할 수 있습니다.

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

우리는 () 함수는 머리와 데이터를 확인 할 수 있습니다.

stock.head()

의 image.png

우리는 다시 가격 조정 기간을지도하기 위해 수입하기 matplotlib 라이브러리를 사용할 수 있습니다.

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

계산하고 매일 수익을 플롯

시계열을 사용하여, 우리는 시간에 매일 소득 변화를 계산하고, 소득 차트를 그릴 수 있습니다. 우리는 동일한 데이터 프레임 "재고"에 저장된 열 이름 "RET"에 대한 주식의 종가를 계산 매일 수입을 조정합니다.

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

이동 평균

그리고 같은 소득은, 우리가 계산하고 이동 평균의 종가 조정을 플롯 할 수 있습니다. 평균 라인을 이동하는 것은 널리 기술적 분석의 매우 중요한 지표로 사용된다. 간단한 설명의 목적을 위해, 여기에 우리 20 일 예로 평균 계산을 이동.

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

모델 예측을 구축하기 전에, 우리는 시계열 및 계절 경향에서 잠깐 살펴.

의 image.png

동향 및 계절성

간단히 말하면, 경향은 일정 기간 동안의 총 발전 방향 시계열을 나타낸다. 동향 및 추세 분석은 널리 기술적 분석에 사용됩니다. 패턴의 일부는 시계열에 정기적으로 표시되면, 우리는 데이터가 계절 말한다. 계절 시계열 예측 모델 결과에 영향을 미칠 수 있으므로 가볍게 할 수 없습니다.

예상

우리는 시간이 시리즈는 정적이라고 가정하고, 간단한 선형 모델을 논의 할 것이다, 어떤 계절이 없다. 우리는 시계열의 선형 추세를 가정 곳이다. 모델은 다음과 같이 표현 될 수있다 :

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值的不同之处

学习Python中的小伙伴,需要学习资料的话,可以到我们的python学习交流q–u–n【 784758214 】

这里有大牛整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。送给正在学习python的小伙伴!这里是python学习者聚集地,欢迎初学和进阶中的小伙伴!
*
字符串和 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

总结

이 논문에서 우리는 잠시 시간 시리즈, 어떻게 파이썬을 계산하는 방법의 속성 중 일부에 대해 설명합니다. 또한 간단한 선형 모델 예측 시간 시리즈. 마지막으로, 우리는 또 다른 형식으로 한 형식의 변환의 날짜로 시계열의 분석에 사용되는 몇 가지 기본 기능을 공유 할 수 있습니다.

추천

출처blog.csdn.net/kkk123789/article/details/92004712