журнал возвращает (почти) такой же, как процентное изменение - PullRequest
0 голосов
/ 06 января 2020

У меня есть эта функция для расчета журнала возвратов. Он работает как положено.

def log_returns(prices):
    return np.log(prices / prices.shift(1))

data.apply(lambda x: log_returns(x))

Возвращенные значения очень близки к методу pct_change. Ожидается ли это?

data.pct_change ()

Ответы [ 2 ]

2 голосов
/ 06 января 2020

Да , это действительно не так странно. Для малого y он гласит, что y ≈ log (1 + y) . Для получения дополнительной информации см. this Математический обмен post .

Процентное изменение рассчитывается как x i + 1 / x i -1 , тогда как вычисляется лог ( x i + 1 / x i ). Если мы заменим y на y = x i + 1 / x i -1 , мы увидим всплывающее приближение.

1 голос
/ 06 января 2020

То есть, поскольку небольшие вариации в натуральном логе почти равны процентному изменению, это не проблема кода.

Так как:

log(A/B) = log(A) - log(B)

, а в вашем случае A - это равно небольшому изменению e B.

log(A/B) = log(A) - log(B) =  log(B(1+e)) - log(B)
log(A/B) = log(B) + log((1+e)) - log(B) = log(1+e)

Для малых значений e, что означает, что log - хорошее прибл. около 1

log(1+e) ≈ e

Более математическое объяснение см. в этом посте .

Убедитесь сами с этим кодом:

import pandas as pd
import numpy as np

small = np.linspace(0.01, 0.1, 100)

df = pd.DataFrame({"vals" : small})

df["changes"] = df["vals"].pct_change()

df["log div"] = np.log(df["vals"]/df["vals"].shift())

diff_log = np.log(df["vals"]) - np.log(df["vals"].shift())

df["diff log"] = diff_log

diff_log = diff_log[~np.isnan(diff_log)]

log_div  = df["log div"].dropna().values

assert(np.allclose(log_div, diff_log))

и df.head(10):

     values   changes   log div  diff log                                                                               
0  0.010000       NaN       NaN       NaN                                                                               
1  0.010909  0.090909  0.087011  0.087011                                                                               
2  0.011818  0.083333  0.080043  0.080043                                                                               
3  0.012727  0.076923  0.074108  0.074108                                                                               
4  0.013636  0.071429  0.068993  0.068993                                                                               
5  0.014545  0.066667  0.064539  0.064539                                                                               
6  0.015455  0.062500  0.060625  0.060625                                                                               
7  0.016364  0.058824  0.057158  0.057158                                                                                  
8  0.017273  0.055556  0.054067  0.054067                                                                                    
9  0.018182  0.052632  0.051293  0.051293 
...