Projekt 2

Opis projektu

Zadanie

Zadanie dotyczy prostej analizy finansowych szeregów czasowych. W zadaniu należy ściągnąć szereg cen akcji dla wybranej firmy i dla takiego szeregu cen należy wykonać następującą prostą analizę. Oznaczmy szereg cen jako \( P = \{p_t\} \), gdzie \( t \) to kolejne dni. Poniższy przykład wykorzystuje funkcję getSymbols() z pakietu quantmod, przy pomocy której ściągniemy szeregi czasowe dla firmy Apple (ticker AAPL) i zapiszemy w postaci tibble'a.

library(quantmod)
library(dplyr)

d <- as_tibble(getSymbols(Symbols = "AAPL",
			  src = "yahoo",
			  auto.assign = FALSE,
			  from = "2010-01-01",
			  to = "2020-12-31"))

plot(d$AAPL.Adjusted, type = "l")
grid()
dev.copy(device = png, "./fig1.png")
dev.off()

Uzyskany ceny wyglądają w następujący sposób.

fig1.png

Figure 1: Przykładowy szereg cen

W powyższym przykładzie wykorzystaliśmy przykładowe zakres czasu i przykładową firmę, każdy z Państwa może wybrać sobie dowlną firmę i dowolny (sensowny) zakres czasu oraz typ cen. Podobnie jak w innych projektach należy w rozwiązaniu pominąć fragmenty zapisujące uzyskany wykres do pliku.

W następnej kolejności chemy przekodować ściągnięty szereg cen \( P \). Kodowanie to ma wyglądać w następujący sposób:

  • jeżeli nastąpił wzrost cen, tj \( p_t > p_{t-1} \), to w chwili \( t \) wstawiamy \( 1 \);
  • jeżeli nie nastąpił wzrost cen a więc albo ceny są identyczne albo nastąpił spadek cen, tj. \( p_t \leq p_{t-1} \), to w chwili \( t \) wstawiamy \( 0 \).

Funkcjonalność tę chcemy zapisać w funkcji binaryEncode(), która jako argument przyjmuje wektor cen. Przykładowe wykorzystanie takiej funkcji jest pokazane poniżej.

### Przykład na danych generowanych
s <- 1:5
binaryEncode(s)

[1] 1 1 1 1
### Przykład na danych generowanych
s <- 5:1
binaryEncode(s)

[1] 0 0 0 0
### Przykład na danych generowanych
s <- cumsum(rnorm(10))
s
binaryEncode(s)

 [1] -0.7342972 -0.9401232 -0.5752513 -1.1964847 -0.3440002 -2.4820412
 [7] -0.8903753  0.1949293 -1.4033978 -0.9746965
[1] 0 1 0 1 0 1 1 0 1
### Przykład na pozyskanym szeregu czasowym
dd <- binaryEncode(d$AAPL.Adjusted)
d$AAPL.Adjusted[1:11]
dd[1:10]

[1] 6.583586 6.594968 6.490066 6.478067 6.521136 6.463610 6.390087 6.480221
[9] 6.442690 6.335020 6.615271
[1] 1 0 0 1 0 0 1 0 0 1

Zaimplementowanie funkcji binaryEncode() jest pierwszą częścią zadania. Następnie, chcemy pociąć pozyskany szereg zer i jedynek na fragmenty o długości \( n \). Jeżeli przez \( C = \{c_t\} \) oznaczymy ciąg zer i jedynek to cięcie polega na przesuwaniu okna o długości \( n \). Przykładowo, jeżeli mamy ciąg \( (c_0, c_1, c_2, c_3, c_4) \) i \( n = 3 \) to chcemy uzyskać następujące podciągi \( (c_0, c_1, c_2) \), \( (c_1, c_2, c_3) \) i \( (c_2, c_3, c_4) \). Funkcjonalność tę chemy zaimplementować w funkcji cutIntoSequences(). Funkcja ta jako argumenty przyjmuje dowolny wektor oraz długość przesuwanego okna i zwraca macierz, gdzie w wierszach są uzyskane cięcia. Typowe zastosowania są pokazane poniżej.

cutIntoSequences(1:5, 3)

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    3    4
[3,]    3    4    5
cutIntoSequences(5:1, 2)

     [,1] [,2]
[1,]    5    4
[2,]    4    3
[3,]    3    2
[4,]    2    1
### Przykładowe zastosowanie dla pozyskanego szeregu
ddd <- cutIntoSequences(dd, 3)
head( ddd)

     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    0    1
[3,]    0    1    0
[4,]    1    0    0
[5,]    0    0    1
[6,]    0    1    0

Ostatecznie chcemy zmienić format pozyskanych danych tak aby każdy wiersz zapisać jako string. Przykładowo jeżeli w macierzy mamy wiersz postaci \( (1, 0, 1, 0, 0) \) to chcemy zapisać go jako string postaci "10100". Fukcjonalność tę chcemy zaimplementować w funkcji encodeAsCharacter(), która jako arguemnt bierze wyznaczoną macierz i zwraca wektor stringów. Typowe zastosowanie jest pokazane poniżej.

### Przykład na generowanych danych
s <- matrix( rbinom( 5 * 3, 7, 0.5), 5, 3)
s
encodeAsCharacter(s)

     [,1] [,2] [,3]
[1,]    2    5    2
[2,]    3    2    5
[3,]    6    4    3
[4,]    2    5    3
[5,]    2    2    5
[1] "252" "325" "643" "253" "225"
### Przykład na pozyskanym szeregu czasowym
head(ddd)
dddd <- encodeAsCharacter(ddd)
dddd[1:6]

     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    0    1
[3,]    0    1    0
[4,]    1    0    0
[5,]    0    0    1
[6,]    0    1    0
[1] "100" "001" "010" "100" "001" "010"

Ostatecznie chcemy wyznaczyć prawdopodobieństwa "patternów" wzrostów i spadków. To jest proste z wykorzystaniem funkcji table(). Poniżej kontynuacja przykładu dla pozyskanych danych.

ddddd <- table( dddd) / length(dddd)
ddddd
barplot(height = ddddd, horiz = TRUE, las = 1)
dev.copy(device = png, "./fig2.png")
dev.off()

dddd
       000        001        010        011        100        101        110 
0.09584087 0.12188065 0.12368897 0.12694394 0.12224231 0.12875226 0.12694394 
       111 
0.15370705
png 
  3
X11cairo 
       2

Uzyskane wyniki są pokazane poniżej.

fig2.png

Figure 2: Prawdopodobieństwa wzrostów i spadków cen

Poniżej jest jeszcze jeden kompletny przykład dla tego samego szeregu cen ale przyjmując \( n = 2 \).

dd <- encodeAsCharacter(cutIntoSequences(series = binaryEncode(prices = d$AAPL.Adjusted), len = 2))
barplot(height = table(dd) / length(dd), horiz = TRUE, las = 1)
dev.copy(device = png, "./fig3.png")
dev.off()

png 
  3
X11cairo 
       2

Uzyskany wynik jest poniżej.

fig3.png

Figure 3: Prawdopodobieństwa wzrostów i spadków cen

Ciekawe w powyższej analizie jest to, że ciągi wzrostów są zawsze bardziej prawdopodobne niż ciągi spadków. Sugeruje to, że generalnie ceny rosną a spadki są raczej izolownymi zdarzeniami (co nie odnosi się do skali tych spadków!).

Podsumowując zadanie polega na zaimplementowaniu trzech powyższych funkcji i oraz wykonaniu przykładów z ich wykorzystaniem.

Techniczne warunki zaliczenie

Zadanie powinno być rozwiązane w pojedynczym skrypcie w pliku R. Rozwiązanie powinno zawierać definicje wszystkich omówionych powyżej funkcji a następnie przykładowe wykorzystanie zaproponowanych funkcji. Rozwiązania bez przykładów nie będą zaliczane. W rozwiązaniu nie wolno wykorzystywać dodatkowych pakietów poza pakietami quantmod i dplyr. Jedynie dozwolone symbole to ASCII.

Data: 2021-04-06 Tue 00:00

Autor: Michał Ramsza

Created: 2021-04-08 Thu 12:55

Validate