log returns(几乎)与百分比变化相同
log returns (almost) same as percent change
我有这个函数来计算 returns 的对数。它按预期工作。
def log_returns(prices):
return np.log(prices / prices.shift(1))
data.apply(lambda x: log_returns(x))
返回的值非常接近 pct_change 方法。这是预期的吗?
data.pct_change()
是的,这确实没有那么奇怪。对于小的 y,它认为 y ≈ log (1+y)。有关详细信息,请参阅 this Mathematics Exchange post。
百分比变化计算为 xi+1/xi-1 ,而你计算 log(xi+1/xi)。如果我们因此用 y 代替 y = xi+1/xi -1,我们看到近似值弹出。
是的,因为自然对数中的微小变化几乎等于百分比变化,所以这不是代码问题。
从 :
log(A/B) = log(A) - log(B)
在你的情况下,A 等于 B 的一些小变化 e
。
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
有关更数学的解释,请参阅 this SO post。
使用此代码亲自查看:
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
我有这个函数来计算 returns 的对数。它按预期工作。
def log_returns(prices):
return np.log(prices / prices.shift(1))
data.apply(lambda x: log_returns(x))
返回的值非常接近 pct_change 方法。这是预期的吗?
data.pct_change()
是的,这确实没有那么奇怪。对于小的 y,它认为 y ≈ log (1+y)。有关详细信息,请参阅 this Mathematics Exchange post。
百分比变化计算为 xi+1/xi-1 ,而你计算 log(xi+1/xi)。如果我们因此用 y 代替 y = xi+1/xi -1,我们看到近似值弹出。
是的,因为自然对数中的微小变化几乎等于百分比变化,所以这不是代码问题。
从 :
log(A/B) = log(A) - log(B)
在你的情况下,A 等于 B 的一些小变化 e
。
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
有关更数学的解释,请参阅 this SO post。
使用此代码亲自查看:
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