高级模型
高级模型能以自定义函数、两种以上的商品,或劣等品与吉芬商品,扩展内置的效用模型。
可扩展模型
预先定义的两商品模型不足以描述偏好时,可以使用这组模型。
CustomUtility 能把任何向量化的 Python 可调用函数包装成 econ-viz 模型。
\[
U(x,y)=\ln x+\ln y
\]
上式只是其中一个示例。函数必须接受两个 NumPy 数组,并返回形状相同的数组。
参数
| 参数 | 含义 |
|---|---|
func |
以 \(x\) 与 \(y\) 为变量的向量化效用函数 |
name |
自定义模型的显示名称 |
代码
import numpy as np
from econ_viz import Canvas, levels, solve
from econ_viz.models import CustomUtility
model = CustomUtility(
func=lambda x, y: np.log(x) + np.log(y),
name="log+log",
)
eq = solve(model, px=2.0, py=3.0, income=30.0)
(
Canvas(x_max=20, y_max=15, title="Custom Utility")
.add_utility(model, levels=levels.around(eq.utility, n=5))
.add_budget(2.0, 3.0, 30.0)
.add_equilibrium(eq)
.save("custom.png")
)

MultiGoodCD 描述 \(N\) 种商品的 Cobb-Douglas 偏好。
\[
U(x_1,\ldots,x_N)=\prod_{i=1}^{N}x_i^{\alpha_i}
\]
freeze() 会固定 \(x\) 与 \(y\) 以外的商品,再返回能画在二维画布上的
CustomUtility。
参数
| 参数 | 含义 |
|---|---|
shares |
商品名称与指数 \(\alpha_i\) 的对应 |
freeze(...) |
\(x\)、\(y\) 以外商品的固定数量 |
代码
from econ_viz import Canvas, levels, solve
from econ_viz.models import MultiGoodCD
model = MultiGoodCD({"x": 0.3, "y": 0.3, "z": 0.4})
two_good_model = model.freeze(z=10.0)
eq = solve(two_good_model, px=2.0, py=3.0, income=30.0)
(
Canvas(x_max=20, y_max=15, title="Multi-Good Cobb-Douglas")
.add_utility(
two_good_model,
levels=levels.around(eq.utility, n=5),
)
.add_budget(2.0, 3.0, 30.0, fill=True)
.add_equilibrium(eq)
.save("multigood.png")
)

劣等品与吉芬商品
Haagsma 实现 Haagsma(2012) 提出的效用函数。在这个函数中,商品 \(x\) 一定是劣等品,收入足够高时更会成为吉芬商品。
\[
U(x,y)=\alpha_x\ln(x-\gamma_x)-\alpha_y\ln(\gamma_y-y),
\qquad 0<\alpha_x<\alpha_y,\quad x>\gamma_x,\quad 0\le y<\gamma_y
\]
在内部解时,\(x\) 的马歇尔需求有闭式解:
\[
x^*=\frac{\alpha_x(\gamma_y p_y-I)}{(\alpha_y-\alpha_x)\,p_x}+\frac{\alpha_y\gamma_x}{\alpha_y-\alpha_x}
\]
因此不论价格与收入为何,\(\partial x^*/\partial I<0\)。\(\partial x^*/\partial p_x\) 的正负则取决于收入:
| 收入 | 商品 \(x\) |
|---|---|
| \(I<\gamma_y p_y\) | 劣等品;\(p_x\) 上升时需求仍会减少 |
| \(I=\gamma_y p_y\) | 劣等品;替代效应与收入效应刚好抵消 |
| \(\gamma_y p_y<I<\gamma_y p_y+\gamma_x p_x\) | 吉芬商品;需求随 \(p_x\) 上升而增加 |
当 \(I\ge\gamma_y p_y+\gamma_x p_x\) 时,消费者能让 \(y\) 无限逼近 \(\gamma_y\),效用没有上界,因此不存在最优解,solve() 会抛出错误。
参数
| 参数 | 含义 |
|---|---|
alpha_x |
商品 \(x\) 的权重 \(\alpha_x\),须小于 alpha_y |
alpha_y |
商品 \(y\) 的权重 \(\alpha_y\) |
gamma_x |
商品 \(x\) 的下限 \(\gamma_x\) |
gamma_y |
商品 \(y\) 的上限 \(\gamma_y\) |
demand(px, py, income) 返回闭式解的消费组合,is_giffen(px, py, income) 判断 \(x\) 是否为吉芬商品。
示例
from econ_viz import Canvas, Effect
from econ_viz.models import Haagsma
from econ_viz.optimizer import decompose_price_effect
model = Haagsma(alpha_x=1.0, alpha_y=2.0, gamma_x=2.0, gamma_y=27.0)
model.is_giffen(px=2.0, py=1.0, income=28.0) # True
result = decompose_price_effect(model, px=(2.0, 1.0), py=1.0, income=28.0, method="hicks")
(
Canvas(x_max=16, y_max=32, title="Haagsma: Giffen good")
.add_decomposition(
result,
show_x_projections=True,
substitution=Effect(label="SE"),
income=Effect(label="IE"),
)
.save("haagsma.png")
)
\(p_x\) 从 2 降到 1 时,替代效应使 \(x\) 增加 4.5,收入效应却使 \(x\) 减少 5,所以 \(x\) 的需求反而下降。
