Skip to content

[Inventory_dynamics] Update Translation #24

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Apr 28, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 49 additions & 52 deletions lectures/inventory_dynamics.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ jupytext:
text_representation:
extension: .md
format_name: myst
format_version: 0.13
jupytext_version: 1.16.7
kernelspec:
display_name: Python 3
display_name: Python 3 (ipykernel)
language: python
name: python3
---
Expand All @@ -19,31 +21,28 @@ kernelspec:

# 库存动态

```{index} single: 马尔可夫过程, 库存
```

```{contents} 目录
:depth: 2
```

## 概述

在本讲座中,我们将研究遵循所谓s-S库存动态的企业的库存时间路径
在本讲座中,我们将研究企业的库存时间路径,其遵循所谓的s-S库存动态

这些企业
这些企业遵循以下补货规则:

1. 等待直到库存降至某个水平$s$以下,然后
1. 订购足够数量以将库存补充到容量$S$。
1. 当库存水平下降至某个临界值$s$以下时,
2. 企业会订购足够数量的产品,将库存补充到目标水平$S$。

这类政策在实践中很常见,并且在某些情况下也是最优的。
这种管理库存的方式在实践中很常见,并且在某些情况下也是最优的。

早期文献综述和一些宏观经济含义可以在{cite}`caplin1985variability`中找到。
早期文献和其对宏观经济的影响可以在{cite}`caplin1985variability`中找到。

我们的主要目标是学习更多关于模拟、时间序列和马尔可夫动态的知识。
我们的本节的目标是学习更多关于模拟、时间序列和马尔可夫动态的知识。

虽然我们的马尔可夫环境和许多我们考虑的概念与{doc}`有限马尔可夫链讲座 <finite_markov>`中的概念相关,但在当前应用中状态空间是连续的。
尽管我们的马尔可夫环境和涉及的概念与{doc}`有限马尔可夫链讲座 <finite_markov>`的概念是相关的,但在当前应用中状态空间是连续的。

让我们从一些导入开始
让我们从导入一些库开始

```{code-cell} ipython3
import matplotlib.pyplot as plt
Expand All @@ -60,7 +59,7 @@ from numba.experimental import jitclass

## 样本路径

考虑一个拥有库存 $X_t$ 的公司
假设有一个公司,拥有库存 $X_t$。

当库存 $X_t \leq s$ 时,公司会补货至 $S$ 单位。

Expand All @@ -84,12 +83,12 @@ $$

其中 $\mu$ 和 $\sigma$ 是参数,$\{Z_t\}$ 是独立同分布的标准正态分布。

这里有一个类,用于存储参数并生成库存的时间路径
下面是一个类,它用于存储参数并生成库存的时间路径

```{code-cell} ipython3
firm_data = [
('s', float64), # 补货触发水平
('S', float64), # 容量
('s', float64), # 触发补货水平
('S', float64), # 库存总容量
('mu', float64), # 冲击位置参数
('sigma', float64) # 冲击规模参数
]
Expand Down Expand Up @@ -150,7 +149,7 @@ ax.legend(**legend_args)
plt.show()
```

现在让我们模拟多条路径,以便更全面地了解不同结果的概率
现在让我们模拟多条路径,这样可以更好地了解库存动态的整体行为和可能的库存分布

```{code-cell} ipython3
sim_length=200
Expand All @@ -170,13 +169,13 @@ plt.show()

## 边际分布

现在让我们来看看某个固定时间点 $T$ 时 $X_T$ 的边际分布 $\psi_T$。
现在让我们来看看某一固定时间点 $T$ 时 $X_T$ 的边际分布 $\psi_T$。

我们将通过在给定初始条件 $X_0$ 的情况下生成多个 $X_T$ 的样本来实现这一点
我们将通过在给定初始条件 $X_0$ 的情况下,生成多个 $X_T$ 的样本来实现

通过这些 $X_T$ 的样本,我们可以构建其分布 $\psi_T$ 的图像。

这里是一个可视化示例,其中 $T=50$。
下面是$T=50$的情况下的一个可视化示例

```{code-cell} ipython3
T = 50
Expand Down Expand Up @@ -217,7 +216,7 @@ axes[1].hist(sample,
plt.show()
```

通过绘制更多样本,我们可以得到一个更清晰的图像
通过抽取更多样本,我们可以得到一个更清晰的图像

```{code-cell} ipython3
T = 50
Expand All @@ -239,18 +238,18 @@ ax.hist(sample,
plt.show()
```

请注意分布呈双峰
注意到分布呈双峰

* 大多数公司已经补货两次,但少数公司只补货一次(见上图路径)。
* 第二类公司的库存较低
* 大多数公司已经补了两次货,但也有少部分公司只补货一次(见上图路径)。
* 第二种公司的库存较少

我们也可以使用[核密度估计](https://en.wikipedia.org/wiki/Kernel_density_estimation)来近似这个分布。
我们还可以使用[核密度估计](https://baike.baidu.com/item/核密度估计/10349033)来近似这个分布。

核密度估计可以被理解为平滑的直方图。

当被估计的分布可能是平滑的时候,核密度估计比直方图更可取
当我们认为底层分布是平滑的时候,核密度估计通常比直方图提供更准确的图像

我们将使用[scikit-learn](https://scikit-learn.org/stable/)中的核密度估计器
我们将使用[scikit-learn](https://scikit-learn.org/stable/)中的核密度估计量

```{code-cell} ipython3
from sklearn.neighbors import KernelDensity
Expand All @@ -271,7 +270,7 @@ plot_kde(sample, ax)
plt.show()
```

概率质量的分配与上面直方图所显示的类似
概率密度的分配与上面直方图所显示的类似

## 练习

Expand All @@ -280,30 +279,30 @@ plt.show()

这个模型是渐近平稳的,具有唯一的平稳分布。

有关平稳性的背景讨论,请参见{doc}`我们关于AR(1)过程的讲座 <intro:ar1_processes>`——基本概念是相同的。)
作为背景知识,有关平稳性的讨论,请参见{doc}`我们关于AR(1)过程的讲座 <intro:ar1_processes>`——基本概念是相同的。)

特别是,边际分布序列$\{\psi_t\}$正在收敛到一个唯一的极限分布,该分布不依赖于初始条件
特别是,边际分布序列$\{\psi_t\}$正在收敛到一个唯一的极限分布,且该分布不依赖于初始条件

虽然我们在这里不会证明这一点,但我们可以通过模拟来研究它
虽然我们不会在此证明这一点,但我们可以通过模拟来研究这一性质

你的任务是根据上述讨论,在时间点$t = 10, 50, 250, 500, 750$生成并绘制序列$\{\psi_t\}$。
你的任务是,根据上述讨论,在时间点$t = 10, 50, 250, 500, 750$生成并绘制序列$\{\psi_t\}$。

核密度估计器可能是呈现每个分布的最佳方式。)
核密度估计量可能是呈现每个分布最佳的方式。)

你应该能看到收敛性,体现在连续分布之间的差异越来越小
你应该能看到收敛性,体现在两个连续分布之间的差异越来越小

尝试不同的初始条件来验证,从长远来看,分布在不同初始条件下是不变的
尝试使用不同的初始条件来验证,无论从哪个初始状态开始,长期分布都会收敛到相同的平稳分布
```

```{solution-start} id_ex1
:class: dropdown
```

以下是一个可能的解决方案
以下是其中一种解法

这些计算涉及大量的CPU周期,所以我们试图高效地编写代码
由于这个计算需要大量的计算资源,我们需要编写更高效的代码

这意味着编写一个专门的函数,而不是使用上面的类
为此,我们将创建一个专门的函数来替代之前使用的类,以提高计算效率

```{code-cell} ipython3
s, S, mu, sigma = firm.s, firm.S, firm.mu, firm.sigma
Expand Down Expand Up @@ -352,34 +351,34 @@ ax.legend()
plt.show()
```

注意到在 $t=500$ 或 $t=750$ 时密度几乎不再变化
从图中可以看出,随着时间的推移,分布逐渐收敛到一个稳定状态

我们已经得到了平稳密度的合理近似
在 t=500 和 t=750 时的分布几乎完全重合,表明我们已经得到了平稳密度的良好近似

你可以通过测试几个不同的初始条件来确信初始条件并不重要
你可以通过测试多个不同的初始条件,来确定初始条件确实不重要

例如,尝试用所有公司从 $X_0 = 20$ 或 $X_0 = 80$ 开始重新运行上面的代码
例如,你可以尝试将所有公司的初始库存设置为 $X_0 = 20$ 或 $X_0 = 80$,然后重新运行上面的代码,观察分布最终是否收敛到相同的稳态分布

```{solution-end}
```

```{exercise}
:label: id_ex2

使用模拟计算从 $X_0 = 70$ 开始的公司在前50个周期内需要订货两次或更多次的概率
使用模拟的方法,估计一家初始库存为 $X_0 = 70$ 的公司在前50个时期内至少需要补充库存两次的概率

你需要一个较大的样本量来获得准确的结果
为了获得统计上可靠的结果,请确保使用足够大的样本量
```

```{solution-start} id_ex2
:class: dropdown
```

这是一个解决方案
这里是一种解法

同样,由于计算量相对较大,我们编写了一个专门的函数而不是使用上面的类。
同样地,由于计算量相对较大,我们编写了一个专门的函数而不是使用上面的类。

我们还将使用跨公司的并行化处理
我们将利用并行计算来同时处理多家公司的模拟,以提高计算效率

```{code-cell} ipython3
@jit(parallel=True)
Expand All @@ -405,7 +404,6 @@ def compute_freq(sim_length=50, x_init=70, num_firms=1_000_000):
return firm_counter / num_firms
```


记录程序运行所需的时间和输出结果。

```{code-cell} ipython3
Expand All @@ -415,12 +413,11 @@ freq = compute_freq()
print(f"至少发生两次缺货的频率 = {freq}")
```

尝试将上面jitted函数中的`parallel`标志改为`False`。
尝试将上面`@jit`[装饰器](https://zhuanlan.zhihu.com/p/53666925)中的`parallel`参数改为`False`。

根据你的系统配置,运行速度的差异可能会很大。

在我们的台式机上,速度提升了5倍。
在我们的系统上运行速度提升了5倍!

```{solution-end}
```

Loading