11. 现值#
11.1. 概述#
本讲座描述了现值模型,这是许多资产定价理论的起点。
资产定价理论是许多经济决策理论的组成部分,包括
消费
劳动力供给
教育选择
货币需求
在资产定价理论以及更广泛的经济动态研究中,一个基本主题是不同时间序列之间的关系。
时间序列是按时间索引的序列。
在本讲座中,我们将把序列表示为向量。
因此,我们的分析通常归结为研究向量之间的关系。
本讲座中的主要工具将是
矩阵乘法,和
矩阵求逆。
我们将在后续的许多讲座中使用这些工具,包括消费平滑,均衡差异模型,和货币主义价格水平理论。
让我们开始吧。
11.2. 分析#
设
\(\{d_t\}_{t=0}^T \) 是一系列股息或“支付”
\(\{p_t\}_{t=0}^T \) 是从时间\(t\)开始的延续性的资产支付价格序列,即\(\{d_s\}_{s=t}^T \)
\( \delta \in (0,1) \) 是一个周期的“折现因子”
\(p_{T+1}^*\) 是\(T+1\)时资产的终端价格
我们假设股息序列\(\{d_t\}_{t=0}^T \)和终端价格\(p_{T+1}^*\)都是外生的。
这意味着它们是在模型之外确定的。
假设资产定价方程序列
我们称其为方程序列,因为有\(T+1\)个方程,每个\(t =0, 1, \ldots, T\)都有一个。
方程(11.1)告诉我们在时间\(t\)购买资产所支付的价格等于支付\(d_t\)加上时间\(t+1\)的价格乘以时间折现因子\(\delta\)。
通过将明天的价格乘以\(\delta\)来折现,考虑了“等待一个周期的价值”。
我们想要解\(T+1\)个方程(11.1)的系统,以资产价格序列\(\{p_t\}_{t=0}^T \)作为股息序列\(\{d_t\}_{t=0}^T \)和外生终端价格\(p_{T+1}^*\)的函数。
像(11.1)这样的方程系统是线性差分方程的一个例子。
有许多强大的数学方法可以用来解决这样的系统,这些方法本身就很值得研究,因为它们是分析许多经济模型的基础。
例如,参见Samuelson乘数-加速器
在本讲座中,我们将使用矩阵乘法和矩阵求逆来解决系统(11.1),这是线性代数中的基本工具,在线性方程和矩阵代数中有介绍。
我们将导入以下的库
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager
fontP = font_manager.FontProperties()
fontP.set_family('SimHei')
fontP.set_size(14)
import matplotlib as mpl
FONTPATH = "fonts/SourceHanSerifSC-SemiBold.otf"
mpl.font_manager.fontManager.addfont(FONTPATH)
plt.rcParams['font.family'] = ['Source Han Serif SC', 'DejaVu Sans']
11.3. 将序列表示为向量#
系统(11.1)中的方程可以如下排列:
将\(T+1\)个资产定价方程的系统(11.2)写成单个矩阵方程
Solution to Exercise 11.1
将矩阵的第\(t\)行(第\(t\)列为\(1\),第\(t+1\)列为\(-\delta\))与价格向量相乘,得到\(p_t - \delta p_{t+1}\)。
最后一行只有第\(T\)列为\(1\),得到\(p_T\)。
令这些结果等于右边,就恰好得到了(11.2)中的方程。
我们可以用数值方法验证这个结果。
T = 6
δ = 0.99
p_star = 10.0
d = np.array([1.0 * 1.05**t for t in range(T+1)])
# 构建 A
A = np.zeros((T+1, T+1))
for i in range(T+1):
A[i, i] = 1
if i < T:
A[i, i+1] = -δ
b = np.zeros(T+1)
b[-1] = δ * p_star
# 求解 p
p = np.linalg.solve(A, d + b)
# 检验 A @ p == d + b(残差应为零)
residual = A @ p - (d + b)
print("最大残差 |A p - (d + b)|:", np.max(np.abs(residual)))
最大残差 |A p - (d + b)|: 1.1102230246251565e-15
用向量-矩阵表示法,我们可以将系统(11.3)写成
这里\(A\)是方程(11.3)左侧的矩阵,而
价格向量的解是
例如,假设股息流是
让我们编写Python代码来计算和绘制股息流。
T = 6
current_d = 1.0
d = []
for t in range(T+1):
d.append(current_d)
current_d = current_d * 1.05
fig, ax = plt.subplots()
ax.plot(d, 'o', label='股息')
ax.legend()
ax.set_xlabel('时间')
plt.show()
现在让我们来计算和绘制资产价格。
我们将 \(\delta\) 和 \(p_{T+1}^*\) 设定为
δ = 0.99
p_star = 10.0
现在我们建立矩阵 \(A\)
A = np.zeros((T+1, T+1))
for i in range(T+1):
for j in range(T+1):
if i == j:
A[i, j] = 1
if j < T:
A[i, j+1] = -δ
让我们将矩阵 \(A\) 打印出来:
A
array([[ 1. , -0.99, 0. , 0. , 0. , 0. , 0. ],
[ 0. , 1. , -0.99, 0. , 0. , 0. , 0. ],
[ 0. , 0. , 1. , -0.99, 0. , 0. , 0. ],
[ 0. , 0. , 0. , 1. , -0.99, 0. , 0. ],
[ 0. , 0. , 0. , 0. , 1. , -0.99, 0. ],
[ 0. , 0. , 0. , 0. , 0. , 1. , -0.99],
[ 0. , 0. , 0. , 0. , 0. , 0. , 1. ]])
现在用 (11.5)来求解价格。
b = np.zeros(T+1)
b[-1] = δ * p_star
p = np.linalg.solve(A, d + b)
fig, ax = plt.subplots()
ax.plot(p, 'o', label='资产价格')
ax.legend()
ax.set_xlabel('时间')
plt.show()
现在让我们考虑一个周期性增长的股息序列:
T = 100
current_d = 1.0
d = []
for t in range(T+1):
d.append(current_d)
current_d = current_d * 1.01 + 0.1 * np.sin(t)
fig, ax = plt.subplots()
ax.plot(d, 'o-', ms=4, alpha=0.8, label='股息')
ax.legend()
ax.set_xlabel('时间')
plt.show()
Exercise 11.2
当\(p^*_{T+1} = 0\) 和 \(\delta = 0.98\) 时,计算相对应的资产价格序列。
Solution to Exercise 11.2
我们改变之前的参数以及相应的矩阵\(A\),然后按上面的方法继续计算。
δ = 0.98
p_star = 0.0
A = np.zeros((T+1, T+1))
for i in range(T+1):
for j in range(T+1):
if i == j:
A[i, j] = 1
if j < T:
A[i, j+1] = -δ
b = np.zeros(T+1)
b[-1] = δ * p_star
p = np.linalg.solve(A, d + b)
fig, ax = plt.subplots()
ax.plot(p, 'o-', ms=4, alpha=0.8, label='资产价格')
ax.legend()
ax.set_xlabel('时间')
plt.show()
与现值计算相关的加权平均在很大程度上消除了周期。
11.4. 解析表达式#
根据逆矩阵定理,当\(A B\)是单位矩阵时,矩阵\(B\)是\(A\)的逆矩阵。
可以验证,(11.3)中的矩阵\(A\)的逆矩阵是
Exercise 11.3
通过证明\(AA^{-1}\)为单位矩阵来验证这一点。
Solution to Exercise 11.3
T = 6
δ = 0.99
# 构建 A
A = np.zeros((T+1, T+1))
for i in range(T+1):
A[i, i] = 1
if i < T:
A[i, i+1] = -δ
# 根据 eq:Ainv 构建解析逆矩阵:当 j >= i 时 A_inv[i,j] = δ^(j-i),否则为 0
A_inv = np.zeros((T+1, T+1))
for i in range(T+1):
for j in range(i, T+1):
A_inv[i, j] = δ**(j - i)
# 验证
print("A @ A_inv(应为单位矩阵):")
print(np.round(A @ A_inv, 10))
print("是否为单位矩阵:", np.allclose(A @ A_inv, np.eye(T+1)))
A @ A_inv(应为单位矩阵):
[[ 1. 0. 0. 0. -0. 0. 0.]
[ 0. 1. 0. 0. 0. -0. 0.]
[ 0. 0. 1. 0. 0. 0. -0.]
[ 0. 0. 0. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 1. 0. 0.]
[ 0. 0. 0. 0. 0. 1. 0.]
[ 0. 0. 0. 0. 0. 0. 1.]]
是否为单位矩阵: True
如果我们在 (11.5) 中使用表达式 (11.6) 并执行所指示的矩阵乘法,我们将发现
定价公式 (11.7) 表明资产价格 \(p_t\) 由两个组成部分相加得到:
基本面部分 \(\sum_{s=t}^T \delta^{s-t} d_s\),它等于预期股息的贴现现值
泡沫组成部分 \(\delta^{T+1-t} p_{T+1}^*\)
基本组成部分由贴现因子 \(\delta\) 和资产的支付(在这种情况下为股息)确定。
泡沫组成部分是其中不由基本面决定的价格部分。
有时将泡沫组成部分重写为
更为方便,其中
11.5. 关于泡沫的更多内容#
让我们暂时考虑一个从不支付股息的资产这个特殊情况,在这种情况下
在这种情况下,我们的 \(T+1\) 资产定价方程系统 (11.1) 采用以下单一矩阵方程的形式:
显然,如果 \(p_{T+1}^* = 0\),一个所有元素为零的价格向量 \(p\) 可以解这个方程,此时我们定价公式 (11.7) 中只有基本面成分存在。
但让我们通过设置以下条件来激活泡沫成分:
其中 \(c\) 为某个正数。
在这种情况下,当我们用方程 (11.6) 中的矩阵 \(A^{-1}\) 乘以 (11.8) 的两边时,我们发现:
11.6. 总回报率#
定义从 \(t\) 期到 \(t+1\) 期持有资产的总回报率为:
将方程 (11.10) 代入方程 (11.11) 可以确认,一个价值完全来源于泡沫的资产的总回报率为:
11.7. 练习#
Exercise 11.4
假设\(g >1\)且\(\delta g \in (0,1)\)。给出以下 \(d\) 和 \(p_{T+1}^*\) 设置下资产价格 \(p_t\) 的解析表达式:
\(p_{T+1}^* = 0, d_t = g^t d_0\)(戈登增长公式的修改版)
\(p_{T+1}^* = \frac{g^{T+1} d_0}{1- \delta g}, d_t = g^t d_0\)(普通的戈登增长公式)
\(p_{T+1}^* = 0, d_t = 0\)(一个无价值股票的价格)
\(p_{T+1}^* = c \delta^{-(T+1)}, d_t = 0\)(一个纯泡沫股票的价格)
Solution to Exercise 11.4
将上述每对 \(p_{T+1}^*, d_t\) 代入方程 (11.7) 得到:
\(p_t = \sum^T_{s=t} \delta^{s-t} g^s d_0 = d_t \frac{1 - (\delta g)^{T+1-t}}{1 - \delta g}\)
\(p_t = \sum^T_{s=t} \delta^{s-t} g^s d_0 + \frac{\delta^{T+1-t} g^{T+1} d_0}{1 - \delta g} = \frac{d_t}{1 - \delta g}\)
\(p_t = 0\)
\(p_t = c \delta^{-t}\)
Exercise 11.5
针对讲座中股息增长的例子(\(d_{t+1} = 1.05 d_t\),\(d_0 = 1\),\(T = 6\),\(\delta = 0.99\), \(p_{T+1}^* = 10\)),用数值方法验证定价公式 (11.7)。
对于每个 \(t = 0, 1, \ldots, T\),用以下两种方法计算 \(p_t\):
求解线性方程组 \(Ap = d + b\)(如讲座中所示),以及
直接计算求和 \(\sum_{s=t}^T \delta^{s-t} d_s + \delta^{T+1-t} p_{T+1}^*\)。
将两种结果并排打印出来,确认它们是否一致。
Solution to Exercise 11.5
T = 6
δ = 0.99
p_star = 10.0
d = np.array([1.0 * 1.05**t for t in range(T+1)])
A = np.zeros((T+1, T+1))
for i in range(T+1):
A[i, i] = 1
if i < T:
A[i, i+1] = -δ
b = np.zeros(T+1)
b[-1] = δ * p_star
p_matrix = np.linalg.solve(A, d + b)
p_formula = np.array([
sum(δ**(s-t) * d[s] for s in range(t, T+1)) + δ**(T+1-t) * p_star
for t in range(T+1)
])
print(f"{'t':>3} | {'矩阵解':>12} | {'公式解':>12} | {'|差值|':>10}")
print('-' * 44)
for t in range(T+1):
diff = abs(p_matrix[t] - p_formula[t])
print(f'{t:>3} | {p_matrix[t]:>12.6f} | {p_formula[t]:>12.6f} | {diff:>10.2e}')
t | 矩阵解 | 公式解 | |差值|
--------------------------------------------
0 | 17.206971 | 17.206971 | 3.55e-15
1 | 16.370678 | 16.370678 | 0.00e+00
2 | 15.475432 | 15.475432 | 3.55e-15
3 | 14.518113 | 14.518113 | 1.78e-15
4 | 13.495443 | 13.495443 | 1.78e-15
5 | 12.403976 | 12.403976 | 1.78e-15
6 | 11.240096 | 11.240096 | 0.00e+00
Exercise 11.6
假设股息为常数:对所有 \(t = 0, \ldots, T\),\(d_t = d = 1\)。
将终端价格设为永续年金价值 \(p_{T+1}^* = d / (1-\delta)\)。
a. 计算 \(T = 100\)、\(\delta = 0.99\) 时的资产价格序列,并将 \(p_t\) 与永续年金价值 \(d/(1-\delta)\)(用虚线表示)一起绘图。
b. 用解析方法(利用公式 (11.7))验证对所有 \(t\) 都有 \(p_t = d / (1-\delta)\)。
Solution to Exercise 11.6
T = 100
δ = 0.99
d_const = 1.0
p_star_perp = d_const / (1 - δ)
d = d_const * np.ones(T+1)
A = np.zeros((T+1, T+1))
for i in range(T+1):
A[i, i] = 1
if i < T:
A[i, i+1] = -δ
b = np.zeros(T+1)
b[-1] = δ * p_star_perp
p = np.linalg.solve(A, d + b)
fig, ax = plt.subplots()
ax.plot(p, 'o-', ms=3, label='资产价格 $p_t$')
ax.axhline(p_star_perp, linestyle='--', color='red',
label=f'永续年金价值 $d/(1 - δ) = {p_star_perp:.2f}$')
ax.set_xlabel('时间')
ax.set_title('常数股息:资产价格等于永续年金价值')
ax.legend()
plt.show()
print(f'与 d/(1 - δ) 的最大偏差:{np.max(np.abs(p - p_star_perp)):.2e}')
对于b部分,将\(d_s = d\)和\(p_{T+1}^* = d/(1-\delta)\)代入(11.7)得到
Exercise 11.7
对于增长的股息流(\(d_{t+1} = 1.05 d_t\),\(d_0 = 1\),\(T = 6\), \(p_{T+1}^* = 10\)),将\(t = 0\)时的资产价格绘制为折现因子 \(\delta \in [0.90,\, 0.99]\)的函数。
验证\(p_0\)在\(\delta\)上严格递增,并根据公式(11.7)解释原因。
Solution to Exercise 11.7
T = 6
p_star = 10.0
d = np.array([1.0 * 1.05**t for t in range(T+1)])
δ_vals = np.linspace(0.90, 0.99, 200)
p0_vals = []
for δ in δ_vals:
A = np.zeros((T+1, T+1))
for i in range(T+1):
A[i, i] = 1
if i < T:
A[i, i+1] = -δ
b = np.zeros(T+1)
b[-1] = δ * p_star
p = np.linalg.solve(A, d + b)
p0_vals.append(p[0])
fig, ax = plt.subplots()
ax.plot(δ_vals, p0_vals)
ax.set_xlabel(r'$\delta$')
ax.set_ylabel(r'$p_0$')
ax.set_title('$t=0$时的资产价格作为$\\delta$的函数')
plt.show()
基本面部分中的每一项 \(\delta^{s-t} d_s\) 以及泡沫项 \(\delta^{T+1-t} p_{T+1}^*\) 都随 \(\delta\) 递增。
因此,较高的折现因子会提高每一笔未来现金流的现值,从而推高 \(p_0\)。