@@ -3,8 +3,10 @@ jupytext:
3
3
text_representation :
4
4
extension : .md
5
5
format_name : myst
6
+ format_version : 0.13
7
+ jupytext_version : 1.16.7
6
8
kernelspec :
7
- display_name : Python 3
9
+ display_name : Python 3 (ipykernel)
8
10
language : python
9
11
name : python3
10
12
---
@@ -19,31 +21,28 @@ kernelspec:
19
21
20
22
# 库存动态
21
23
22
- ``` {index} single: 马尔可夫过程, 库存
23
- ```
24
-
25
24
``` {contents} 目录
26
25
:depth: 2
27
26
```
28
27
29
28
## 概述
30
29
31
- 在本讲座中,我们将研究遵循所谓s-S库存动态的企业的库存时间路径 。
30
+ 在本讲座中,我们将研究企业的库存时间路径,其遵循所谓的s-S库存动态 。
32
31
33
- 这些企业
32
+ 这些企业遵循以下补货规则:
34
33
35
- 1 . 等待直到库存降至某个水平 $s$以下,然后
36
- 1 . 订购足够数量以将库存补充到容量 $S$。
34
+ 1 . 当库存水平下降至某个临界值 $s$以下时,
35
+ 2 . 企业会订购足够数量的产品,将库存补充到目标水平 $S$。
37
36
38
- 这类政策在实践中很常见 ,并且在某些情况下也是最优的。
37
+ 这种管理库存的方式在实践中很常见 ,并且在某些情况下也是最优的。
39
38
40
- 早期文献综述和一些宏观经济含义可以在 {cite}` caplin1985variability ` 中找到。
39
+ 早期文献和其对宏观经济的影响可以在 {cite}` caplin1985variability ` 中找到。
41
40
42
- 我们的主要目标是学习更多关于模拟 、时间序列和马尔可夫动态的知识。
41
+ 我们的本节的目标是学习更多关于模拟 、时间序列和马尔可夫动态的知识。
43
42
44
- 虽然我们的马尔可夫环境和许多我们考虑的概念与 {doc}` 有限马尔可夫链讲座 <finite_markov> ` 中的概念相关 ,但在当前应用中状态空间是连续的。
43
+ 尽管我们的马尔可夫环境和涉及的概念与 {doc}` 有限马尔可夫链讲座 <finite_markov> ` 的概念是相关的 ,但在当前应用中状态空间是连续的。
45
44
46
- 让我们从一些导入开始
45
+ 让我们从导入一些库开始
47
46
48
47
``` {code-cell} ipython3
49
48
import matplotlib.pyplot as plt
@@ -60,7 +59,7 @@ from numba.experimental import jitclass
60
59
61
60
## 样本路径
62
61
63
- 考虑一个拥有库存 $X_t$ 的公司 。
62
+ 假设有一个公司,拥有库存 $X_t$。
64
63
65
64
当库存 $X_t \leq s$ 时,公司会补货至 $S$ 单位。
66
65
84
83
85
84
其中 $\mu$ 和 $\sigma$ 是参数,$\{ Z_t\} $ 是独立同分布的标准正态分布。
86
85
87
- 这里有一个类,用于存储参数并生成库存的时间路径 。
86
+ 下面是一个类,它用于存储参数并生成库存的时间路径 。
88
87
89
88
``` {code-cell} ipython3
90
89
firm_data = [
91
- ('s', float64), # 补货触发水平
92
- ('S', float64), # 容量
90
+ ('s', float64), # 触发补货水平
91
+ ('S', float64), # 库存总容量
93
92
('mu', float64), # 冲击位置参数
94
93
('sigma', float64) # 冲击规模参数
95
94
]
@@ -150,7 +149,7 @@ ax.legend(**legend_args)
150
149
plt.show()
151
150
```
152
151
153
- 现在让我们模拟多条路径,以便更全面地了解不同结果的概率 :
152
+ 现在让我们模拟多条路径,这样可以更好地了解库存动态的整体行为和可能的库存分布 :
154
153
155
154
``` {code-cell} ipython3
156
155
sim_length=200
@@ -170,13 +169,13 @@ plt.show()
170
169
171
170
## 边际分布
172
171
173
- 现在让我们来看看某个固定时间点 $T$ 时 $X_T$ 的边际分布 $\psi_T$。
172
+ 现在让我们来看看某一固定时间点 $T$ 时 $X_T$ 的边际分布 $\psi_T$。
174
173
175
- 我们将通过在给定初始条件 $X_0$ 的情况下生成多个 $X_T$ 的样本来实现这一点 。
174
+ 我们将通过在给定初始条件 $X_0$ 的情况下,生成多个 $X_T$ 的样本来实现 。
176
175
177
176
通过这些 $X_T$ 的样本,我们可以构建其分布 $\psi_T$ 的图像。
178
177
179
- 这里是一个可视化示例,其中 $T=50$。
178
+ 下面是 $T=50$的情况下的一个可视化示例 。
180
179
181
180
``` {code-cell} ipython3
182
181
T = 50
@@ -217,7 +216,7 @@ axes[1].hist(sample,
217
216
plt.show()
218
217
```
219
218
220
- 通过绘制更多样本 ,我们可以得到一个更清晰的图像
219
+ 通过抽取更多样本 ,我们可以得到一个更清晰的图像
221
220
222
221
``` {code-cell} ipython3
223
222
T = 50
@@ -239,18 +238,18 @@ ax.hist(sample,
239
238
plt.show()
240
239
```
241
240
242
- 请注意分布呈双峰
241
+ 注意到分布呈双峰
243
242
244
- * 大多数公司已经补货两次,但少数公司只补货一次 (见上图路径)。
245
- * 第二类公司的库存较低 。
243
+ * 大多数公司已经补了两次货,但也有少部分公司只补货一次 (见上图路径)。
244
+ * 第二种公司的库存较少 。
246
245
247
- 我们也可以使用 [ 核密度估计] ( https://en.wikipedia.org/wiki/Kernel_density_estimation ) 来近似这个分布。
246
+ 我们还可以使用 [ 核密度估计] ( https://baike.baidu.com/item/核密度估计/10349033 ) 来近似这个分布。
248
247
249
248
核密度估计可以被理解为平滑的直方图。
250
249
251
- 当被估计的分布可能是平滑的时候,核密度估计比直方图更可取 。
250
+ 当我们认为底层分布是平滑的时候,核密度估计通常比直方图提供更准确的图像 。
252
251
253
- 我们将使用[ scikit-learn] ( https://scikit-learn.org/stable/ ) 中的核密度估计器
252
+ 我们将使用[ scikit-learn] ( https://scikit-learn.org/stable/ ) 中的核密度估计量
254
253
255
254
``` {code-cell} ipython3
256
255
from sklearn.neighbors import KernelDensity
@@ -271,7 +270,7 @@ plot_kde(sample, ax)
271
270
plt.show()
272
271
```
273
272
274
- 概率质量的分配与上面直方图所显示的类似 。
273
+ 概率密度的分配与上面直方图所显示的类似 。
275
274
276
275
## 练习
277
276
@@ -280,30 +279,30 @@ plt.show()
280
279
281
280
这个模型是渐近平稳的,具有唯一的平稳分布。
282
281
283
- (有关平稳性的背景讨论 ,请参见{doc}`我们关于AR(1)过程的讲座 <intro:ar1_processes>`——基本概念是相同的。)
282
+ (作为背景知识,有关平稳性的讨论 ,请参见{doc}`我们关于AR(1)过程的讲座 <intro:ar1_processes>`——基本概念是相同的。)
284
283
285
- 特别是,边际分布序列$\{\psi_t\}$正在收敛到一个唯一的极限分布,该分布不依赖于初始条件 。
284
+ 特别是,边际分布序列$\{\psi_t\}$正在收敛到一个唯一的极限分布,且该分布不依赖于初始条件 。
286
285
287
- 虽然我们在这里不会证明这一点,但我们可以通过模拟来研究它 。
286
+ 虽然我们不会在此证明这一点,但我们可以通过模拟来研究这一性质 。
288
287
289
- 你的任务是根据上述讨论 ,在时间点$t = 10, 50, 250, 500, 750$生成并绘制序列$\{\psi_t\}$。
288
+ 你的任务是,根据上述讨论 ,在时间点$t = 10, 50, 250, 500, 750$生成并绘制序列$\{\psi_t\}$。
290
289
291
- (核密度估计器可能是呈现每个分布的最佳方式 。)
290
+ (核密度估计量可能是呈现每个分布最佳的方式 。)
292
291
293
- 你应该能看到收敛性,体现在连续分布之间的差异越来越小 。
292
+ 你应该能看到收敛性,体现在两个连续分布之间的差异越来越小 。
294
293
295
- 尝试不同的初始条件来验证,从长远来看,分布在不同初始条件下是不变的 。
294
+ 尝试使用不同的初始条件来验证,无论从哪个初始状态开始,长期分布都会收敛到相同的平稳分布 。
296
295
```
297
296
298
297
``` {solution-start} id_ex1
299
298
:class: dropdown
300
299
```
301
300
302
- 以下是一个可能的解决方案 :
301
+ 以下是其中一种解法 :
303
302
304
- 这些计算涉及大量的CPU周期,所以我们试图高效地编写代码 。
303
+ 由于这个计算需要大量的计算资源,我们需要编写更高效的代码 。
305
304
306
- 这意味着编写一个专门的函数,而不是使用上面的类 。
305
+ 为此,我们将创建一个专门的函数来替代之前使用的类,以提高计算效率 。
307
306
308
307
``` {code-cell} ipython3
309
308
s, S, mu, sigma = firm.s, firm.S, firm.mu, firm.sigma
@@ -352,34 +351,34 @@ ax.legend()
352
351
plt.show()
353
352
```
354
353
355
- 注意到在 $t=500$ 或 $t=750$ 时密度几乎不再变化 。
354
+ 从图中可以看出,随着时间的推移,分布逐渐收敛到一个稳定状态 。
356
355
357
- 我们已经得到了平稳密度的合理近似 。
356
+ 在 t=500 和 t=750 时的分布几乎完全重合,表明我们已经得到了平稳密度的良好近似 。
358
357
359
- 你可以通过测试几个不同的初始条件来确信初始条件并不重要 。
358
+ 你可以通过测试多个不同的初始条件,来确定初始条件确实不重要 。
360
359
361
- 例如,尝试用所有公司从 $X_0 = 20$ 或 $X_0 = 80$ 开始重新运行上面的代码 。
360
+ 例如,你可以尝试将所有公司的初始库存设置为 $X_0 = 20$ 或 $X_0 = 80$,然后重新运行上面的代码,观察分布最终是否收敛到相同的稳态分布 。
362
361
363
362
``` {solution-end}
364
363
```
365
364
366
365
``` {exercise}
367
366
:label: id_ex2
368
367
369
- 使用模拟计算从 $X_0 = 70$ 开始的公司在前50个周期内需要订货两次或更多次的概率 。
368
+ 使用模拟的方法,估计一家初始库存为 $X_0 = 70$ 的公司在前50个时期内至少需要补充库存两次的概率 。
370
369
371
- 你需要一个较大的样本量来获得准确的结果 。
370
+ 为了获得统计上可靠的结果,请确保使用足够大的样本量 。
372
371
```
373
372
374
373
``` {solution-start} id_ex2
375
374
:class: dropdown
376
375
```
377
376
378
- 这是一个解决方案 。
377
+ 这里是一种解法 。
379
378
380
- 同样 ,由于计算量相对较大,我们编写了一个专门的函数而不是使用上面的类。
379
+ 同样地 ,由于计算量相对较大,我们编写了一个专门的函数而不是使用上面的类。
381
380
382
- 我们还将使用跨公司的并行化处理 。
381
+ 我们将利用并行计算来同时处理多家公司的模拟,以提高计算效率 。
383
382
384
383
``` {code-cell} ipython3
385
384
@jit(parallel=True)
@@ -405,7 +404,6 @@ def compute_freq(sim_length=50, x_init=70, num_firms=1_000_000):
405
404
return firm_counter / num_firms
406
405
```
407
406
408
-
409
407
记录程序运行所需的时间和输出结果。
410
408
411
409
``` {code-cell} ipython3
@@ -415,12 +413,11 @@ freq = compute_freq()
415
413
print(f"至少发生两次缺货的频率 = {freq}")
416
414
```
417
415
418
- 尝试将上面jitted函数中的 ` parallel ` 标志改为 ` False ` 。
416
+ 尝试将上面 ` @jit ` [ 装饰器 ] ( https://zhuanlan.zhihu.com/p/53666925 ) 中的 ` parallel ` 参数改为 ` False ` 。
419
417
420
418
根据你的系统配置,运行速度的差异可能会很大。
421
419
422
- (在我们的台式机上,速度提升了5倍。 )
420
+ (在我们的系统上运行速度提升了5倍! )
423
421
424
422
``` {solution-end}
425
423
```
426
-
0 commit comments