Analiza Szeregów Czasowych/Wstęp

Z Skrypty dla studentów Ekonofizyki UPGOW

Analiza Szeregów Czasowych

Spis treści


Definicja szeregu czasowego

Możemy spotkać różne definicje szeregu czasowego.

Szereg czasowy to

  • ciąg obserwacji pokazujący kształtowanie się badanego zjawiska w kolejnych okresach czasu (sekundach, dniach, latach, itp.).
  • realizacja procesu stochastycznego, którego dziedziną jest czas; to ciąg informacji uporządkowanych w czasie, których pomiary wykonywane są z dokładnym krokiem czasowym.
  • ciąg obserwacji xt zapisywanych w ściśle określonym czasie.

Wśród składników szeregu czasowego możemy wyróżnić:

  • trend (tendencję rozwojową),
  • wahania sezonowe,
  • wahania cykliczne (koniunkturalne),
  • wahania przypadkowe.

W jakim celu badamy szeregi czasowe?

Analiza tego typu zagadnień ma generalnie dwa podstawowe cele:

  1. odgadnięcie natury danego zjawiska losowego, tj. badanie własności szeregu i znalezienie modelu najlepiej opisującego zjawisko,
  2. prognozowanie (predykcja), tj. przewidywanie kolejnych wartości szeregu czasowego na podstawie znalezionego modelu.

Przykłady szeregów czasowych

Przykład 1
Prąd płynący przez opornik.
Rysunek 1. 100 kolejnych punktów czasowych dla szeregu czasowego z przykładu 1 dla dwóch wartości oporu r.

Jeżeli do opornika charakteryzującego się oporem \(r\) przyłożymy zmienne napięcie

\( U(t) = a \cos (\omega t), \! \)

gdzie \(a\) to amplituda zmiennego napięcia przyłożonego do opornika, a okres zmienności to \(T = 2 \pi / \omega\). Wtedy natężenie prądu elektrycznego płynącego przez opornik można wyrazić wzorem

\( I(t) = \frac{a \cos (\omega t)}{r}. \! \)

Jest to oczywiście ciągła funkcja czasu, jednak, kiedy będziemy rejestrować wartości natężenia \(I(t)\) w kolejnych chwilach czasu (np. co \(0.1 T\), 1 milisekundę czy 1 godzinę), dostaniemy dyskretny szereg czasowy \(I_i\) indeksowany kolejnymi pomiarami \( i = 0, 1, 2, \dots \). Przykładowe szeregi czasowe opisane powyższym wzorem można znaleźć na rysunku 1.

Ćwiczenie W1.1
Wygeneruj w programie Matlab/Octave rysunek 1 (legenda jest opcjonalna).
  1. Zbierz do tablic indeksy \(i\) oraz wartości natężenia prądu w punktach \(t_i = i \cdot ( 6 \pi / 100 ), i \in [0,100]\).
  2. Wyplotuj do pliku (np: rysW11.png) wykres \(I_i = a \cos(\omega t_i + \phi) / r \).
Rozwiązanie w języku Matlab / Octave Rozwiązanie w języku python z bibliotekami numpy oraz matplotlib
close all
 
x = -pi:7*pi/100:6*pi;
i = 0:1:100;
 
xlabel('i');
ylabel('I_i');
title('I_i = a cos (\omega t_i + \phi) /r,  a = 1V, \omega = 1Hz');
 
y = sin(x)/0.8;
plot (i,y ,"+^; r = 0.9 {/Symbol o}, {/Symbol f} = 0;")
 
hold on
 
y = sin(x + pi/3)/1.5;
plot(i,y,"-or; r = 1.5{/Symbol O}, {/Symbol f}= {/Symbol p}/3;");
 
grid on
 
print('example01m.eps','-deps','-FTimes-Roman:24');
%print('example01m.svg','-dsvg');
%print('example01m.png','-dpng');
%system('convert -density 100 example01m.eps example01m.png')
import matplotlib.pyplot as plt
import numpy as np
 
plt.figure(1, figsize=(8,6), dpi=600)
i = np.arange(100)
x = np.arange(-np.pi, 6.0*np.pi, 7.0*np.pi/100)
 
kolor  = ['b','r']
lines  = ['v','-p']
lw = 1
 
j=0
a, o, r, phi   = 1, 1, 0.8, 0
labels = r'$r = %.1f\Omega, \quad \phi = %.1f$' % (r,phi)
y = a * cos(o*x + phi) / r
plt.plot(i, y, lines[j], color=kolor[j], label=labels, linewidth=lw)
 
j=1
a, o, r, phi   = 1, 1, 1.5, np.pi/3.
labels = r'$r = %.1f\Omega, \quad \phi = \pi/3$' % (r)
y = a * cos(o*x + phi) / r
plt.plot(i, y, lines[j], color=kolor[j], label=labels, linewidth=lw)
 
plt.xlabel(r'$i$')
plt.ylabel(r'$I_i$')
plt.grid(True)
 
leg = plt.legend(shadow=True,
    fancybox=True,
    mode='expand',
    ncol=2,
    loc=(0.025,0.96),
    handletextpad=0.1, 
    title=r'$I_t = a \cos (\omega t + \phi) / r \qquad a = 1V, \quad\omega = 1 Hz$')
plt.savefig('example01.png')
Przykład 2
Proces dwustanowy (proces dychotomiczny, binarny, zerojedynkowy).
Rysunek 2. 100 kolejnych punktów czasowych dla rzutu monetą (przykład 2). Dane użyte do wygenerowania wykresu: 1 1 1 0 0 0 0 1 1 0 0 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 0 0 0 1 0 0 1 1 0 1 0 1 1 0 1 0 0 0 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1 0 1 1.

Niech \(\{X_t, t = 1,2,3,\dots\}\) będzie uporządkowanym zbiorem niezależnych zmiennych losowych (sekwencją losową), dla których prawdopodobieństwo

\( P (X_t = 0) = P (X_t = 1) = 1/2. \)

(dowód istnienia potrzebnej przestrzeni probabilistycznej na razie sobie darujemy). Seria pomiarowa składać się będzie z losowo ułożonych w czasie zer i jedynek {0,0,0,1,0,1,1,1,1,0,...}. Przykładem jest rzut monetą.


Ćwiczenie W1.2
Każda osoba ma za zadanie wykonać N (w zależności od liczebności grupy, w sumie około 100 na wszystkich studentów) rzutów monetą. W arkuszu kalkulacyjnym na [docs.google.com] wpisujemy wartości:
  • 0 jeżeli wyrzuciliśmy Orła
  • 1 jeżeli wyrzuciliśmy Reszkę

każdy w oddzielnej kolumnie. Stwórz prosty wykres danych w arkuszu kalkulacyjnym Google. Następnie za pomocą programu Matlab/Octave stwórz rysunek przedstawiający tak utworzony szereg czasowy. Szereg ma uwzględniać pomiary wszystkich.

  • wyeksportuj dane z arkusza Google do pliku CSV
  • zaimportuj dane do tabeli w Matlab'ie
  • Wyplotuj do pliku (np: rysW12.png) wykres \(X_t\).
Rozwiązanie w języku Matlab / Octave Rozwiązanie w języku python z bibliotekami numpy oraz matplotlib
%
% Octave > 3.2 !!!
%
 
close all
 
N = 100;
i = 0:N;
 
%
% eksperyment studentów (symulcja rzutu monetą)
% odkomentowac jezeli nie mamy danych
%
y = int32(rand(N+1,1));
csvwrite('dataW12.csv',y);
%
 
y = csvread('dataW12.csv');
plot (i,y ,"-^; Orzeł czy Reszka?;")
axis([0,N,-0.5,1.5]);
xlabel('t');
ylabel('X_t');
grid on
 
print('example02m.eps','-deps','-FTimes-Roman:24');
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
from random import randint
 
plt.figure(1, figsize=(8,6), dpi=600)
i = np.array([s for s in np.arange(100)])
y = np.array([randint(0,1) for s in np.arange(100)])
 
plt.plot(i, y, 'v', color='b', label=u"Orzeł czy Reszka?", linewidth=1)
plt.axis([0, len(y), -0.5, 1.5])
plt.xlabel(r'$t$')
plt.ylabel(r'$X_t$')
plt.grid(True)
 
leg = plt.legend(shadow=True
    ,fancybox=True
    ,ncol=1
    ,loc=(0.025,0.96)
    )
plt.savefig('example02.png')
Przykład 3
Populacja Polski
Przykład 4
Liczba wypadków samochodowych
Przykład 5
Giełda 1
Przykład 6
Giełda 2
Przykład 7
Giełda 3