2011-08-21 10 views
5

Muszę obliczyć zwrot wektora, który daje historyczną serię cen akcji. Wektor jest postaci:Jak obliczyć zwroty z wektora cen?

a <- c(10.25, 11.26, 14, 13.56) 

muszę obliczyć dzienny zysk/strata (%) - czyli to, co jest zysk ma od 10.25 do 11.26, a następnie od 11.26 do 14 itd.

tam jest funkcja do obliczenia tego automatycznie?

Odpowiedz

17

Twoje dane przykładowe, myślę, że masz na myśli następujące:

a <- c(10.25, 11.26, 14, 13.56) 
> diff(a)/a[-length(a)] 
[1] 0.09853659 0.24333925 -0.03142857 

diff zwraca wektor opóźnione różnic i a[-length(a)] spadnie ostatni element.

+0

Hmm powinienem dostać: 9.853659% (z 10,25 do 11,26) 24,33393% (od 11,26 do 14) -3,142857% (od 14 do 13,56) – blakc05

+0

Tak, to jest to samo co mój wynik. – Andrie

+0

, więc muszę pomnożyć przez 100 – blakc05

18

można znaleźć funkcji w quantmod istotne dla swojej pracy:

> require(quantmod) 
> Delt(a) 
    Delt.1.arithmetic 
[1,]    NA 
[2,]  0.09853659 
[3,]  0.24333925 
[4,]  -0.03142857 
1
ret<-diff(log(a)) 

to daje geometryczne powroty - powrót do obserwacji rozkład logarytmicznie normalny (dolna granica wynosi -100% od ceny są zawsze nieujemny), więc ln(prices) podąża za rozkładem normalnym (dlatego możesz zobaczyć powrót mniejszy niż -1 lub -100%).

Dla "normalnego" zakresu zwrotów różnica między wartościami [P(t+1)-P(t)]/P(t) i LN(P(t+1)/P(t)) powinna być nieistotna. Mam nadzieję, że to pomoże.

+0

Tak, ale po co używać relacji przybliżonej, gdy nie jest trudno obliczyć dokładną , jak w udzielonej odpowiedzi? –

+0

Ponadto, jeśli używasz miesięcznych, rocznych, itp. Zwraca (to będzie większe niż, np.codzienne powroty) błędy w tej metodzie spowodują szybkie problemy. –

1

Możesz również użyć dokładnej relacji, która zwraca, równa się wykładnikowi zwracanych logów minus jeden. Tak więc, jeśli Prices zawiera swoje ceny, co następuje daje swoje zyski:

Returns = exp(diff(log(Prices))) - 1 

Należy pamiętać, że jest to dokładny związek, zamiast przybliżona zależność podana w odpowiedzi przez @PBS.

0

Aby odpowiedzieć na odpowiedź PBS, nieco skomplikowanym sposobem generowania log return byłby ret<-c(NA,log(a[-1])-log(a[-length(a)])).

+0

Zobacz najpierw [jak-odpowiedź-odpowiedź] (https://stackoverflow.com/help/how-to-answer) Na to pytanie udzielono już odpowiedzi, oczywiście możesz tutaj dodać swoją odpowiedź. Ale zanim odpowiesz, musisz zrozumieć pewne kwestie. Po pierwsze, nie dodawaj odpowiedzi, która została poprzednio dodana z tym samym kodem lub sugestią. Po drugie, nie dodawaj zbyt skomplikowanej odpowiedzi, jeśli użytkownik bardzo dokładnie zapytał o problem i to, czego potrzebuje, aby rozwiązać ten problem. Po trzecie, możesz dodać komentarz, jeśli chcesz zasugerować cokolwiek odnośnie do odpowiedzi lub pytania. –

0

Inną możliwością jest funkcja ROC pakietu TTR:

library(TTR) 
a <- c(10.25, 11.26, 14, 13.56) 
ROC(a, type = "discrete") 
## [1]   NA 0.09853659 0.24333925 -0.03142857 

type = continuous (który jest również domyślnie) daje Zaloguj Powroty:

ROC(a) 
## [1]   NA 0.09397892 0.21780071 -0.03193305