Python | 算法 | 模型 | 消费 | 贴现 | 公用 | 风险 | 单期 | 贷款 | 完全市场 | 不完全市场 | 债务 | 马尔可夫 | 有限状态 | 税收 | 累积回报 | 和平 | 战争 | 预算 | 借贷 | 创新 | 矩阵 | 状态
🏈 指点迷津 | Brief 🎯要点
🎯居民消费,财政用途:🖊贴现未来单期公用事业 | 🖊无风险单期贷款毛利率 | 🎯完全和不完全市场中居民消费:🖊计算完全市场、不完全市场中消费和债务发展趋势 | 🖊有限状态马尔可夫模拟费用收入 | 🎯完全和不完全市场税收:🖊有限状态马尔可夫模拟完全市场,政府单期支出和累积回报 | 🖊马尔可夫模拟:和平时期政府预算,战争时期政府预算 | 🖊马尔可夫跳跃于和平期和战争期,模拟政府预算 | 🎯马尔可夫跳跃过程:🖊计算单期收益 | 🖊李嘉图-巴罗效应模型(也称为李嘉图等价):计算政府税收和借贷 | 🎯最优财政政策规划:🖊拉姆齐定价规划税率、税收收入、政府债务的动态 | 🎯全球化两国创新周期轨迹模拟。
🎯资产价格:Python和MATLAB及C++资产价格看涨看跌对冲模型和微积分
🎯风险获利:Python流动性做市风险获利 | 信息不对称买卖数学模型
🎯市场流动性:Python | C++ | MATLAB | Julia | R 市场流动性数学预先评估量
🎯市场机制:Python牛市熊市横盘机制 | 缺口分析 | 头寸调整算法
🎯金融数学:C++和Python计算金融数学方程算法模型
🍇Python宏观经济学矩估计
矩估计就是模拟模型数据S S S 次,并使用模拟数据中矩的平均值作为模型矩的估计量。令 x ~ = { x ~ 1 , x ~ 2 , … x ~ s , … x ~ S } \tilde{x}=\left\{\tilde{x}_1, \tilde{x}_2, \ldots \tilde{x}_s, \ldots \tilde{x}_S\right\} x ~ = { x ~ 1 , x ~ 2 , … x ~ s , … x ~ S } 为模型数据的S S S 模拟。
m ^ ( x ~ ∣ θ ) = 1 S ∑ s = 1 S m ( x ~ s ∣ θ ) \hat{m}(\tilde{x} \mid \theta)=\frac{1}{S} \sum_{s=1}^S m\left(\tilde{x}_s \mid \theta\right) m ^ ( x ~ ∣ θ ) = S 1 s = 1 ∑ S m ( x ~ s ∣ θ ) 一旦我们从 S 模拟中估计出模型矩 m ^ ( x ~ ∣ θ ) \hat{m}(\tilde{x} \mid \theta) m ^ ( x ~ ∣ θ ) ,矩估计就与我们对广义矩法的介绍非常相似。估计参数向量 θ ^ S M M \hat{\theta}_{S M M} θ ^ SMM 的矩估计法是选择 θ \theta θ 来最小化数据矩m ( x ) m(x) m ( x ) 与模拟模型矩的距离度量m ^ ( x ~ ∣ θ ) \hat{m}(\tilde{x} \mid \theta) m ^ ( x ~ ∣ θ ) 。
θ ^ S M M = θ : min θ ∣ ∣ m ^ ( x ~ ∣ θ ) − m ( x ) ∣ ∣ \hat{\theta}_{S M M}=\theta: \quad \min _\theta|| \hat{m}(\tilde{x} \mid \theta)-m(x)|| θ ^ SMM = θ : θ min ∣∣ m ^ ( x ~ ∣ θ ) − m ( x ) ∣∣ 在此,矩估计量如下:
θ ^ S M M = θ : min θ e ( x ~ , x ∣ θ ) T W e ( x ~ , x ∣ θ ) \hat{\theta}_{S M M}=\theta: \quad \min _\theta e(\tilde{x}, x \mid \theta)^T W e(\tilde{x}, x \mid \theta) θ ^ SMM = θ : θ min e ( x ~ , x ∣ θ ) T W e ( x ~ , x ∣ θ ) 其中 W 是准则函数中的 R × R R \times R R × R 权重矩阵。现在,将此加权矩阵视为单位矩阵。我们将二次形式表达式 e ( x ~ , x ∣ θ ) T W e ( x ~ , x ∣ θ ) e(\tilde{x}, x \mid \theta)^T W e(\tilde{x}, x \mid \theta) e ( x ~ , x ∣ θ ) T W e ( x ~ , x ∣ θ ) 称为准则函数,因为它是严格正标量,即矩估计问题陈述中最小化的对象。准则函数中的R × R R \times R R × R 加权矩阵W W W 允许计量经济学家控制最小化问题中每个时刻的加权方式。例如,W W W 的 R × R R \times R R × R 单位矩阵将为每个时刻赋予相等的权重,而标准函数将是偏差百分比(误差)的简单平方和。其他加权策略可以由问题或模型的性质决定。
矩估计需要强调的最后一项是,为模型的 S S S 模拟绘制的误差必须仅绘制一次,以便最小化问题θ ^ S M M \hat{ \theta}_{S M M} θ ^ SMM 不会因 θ \theta θ 值的每次猜测而改变底层采样。更简单地说,您希望所有模拟的随机抽取保持不变,以便最小化问题中唯一改变的是参数向量 θ \theta θ 的值。
💦正态分布拟合到中等宏观经济学测试分数
数据位于文本文件 tpts.txt 中。回想一下,这些测试分数在 0 到 450 之间。下图显示了数据的直方图,以及三个截断的正常概率密度函数。黑线是截断的正态概率密度函数的 μ \mu μ 和 σ \sigma σ 的机器学习估计。红线和绿线只是截断法线参数 μ \mu μ 和σ \sigma σ 的两个“任意”选择的组合的概率密度函数。
Copy import requests
from IPython . display import Image
url = ( 'https://raw.githubusercontent.com/Notebooks/' +
'master/DMM/images/Mplots.png' )
image_file = requests . get (url, allow_redirects = True )
open ( 'Mplots.png' , 'wb' ). write (image_file.content)
Image ( "Mplots.png" )
让我们尝试根据矩估计的截断正态分布来估计参数 μ \mu μ 和 σ \sigma σ 。我们应该利用哪些时刻?让我们尝试一下数据的均值和方差。这两个数据统计定义为:
mean ( scores i ) = 1 N ∑ i = 1 N scores i var ( scores i ) = 1 N − 1 ∑ i = 1 N ( scores i − mean ( scores i ) ) 2 \begin{gathered} \text { mean }\left(\operatorname{scores}_i\right)=\frac{1}{N} \sum_{i=1}^N \operatorname{scores}_i \\ \operatorname{var}\left(\operatorname{scores}_i\right)=\frac{1}{N-1} \sum_{i=1}^N\left(\operatorname{scores}_i-\operatorname{mean}\left(\operatorname{scores}_i\right)\right)^2 \end{gathered} mean ( scores i ) = N 1 i = 1 ∑ N scores i var ( scores i ) = N − 1 1 i = 1 ∑ N ( scores i − mean ( scores i ) ) 2 因此,矩估计的数据矩向量 m ( x ) m(x) m ( x ) 如下
m ( scores i ) ≡ [ mean ( scores i ) var ( scores i ) ] m\left(\operatorname{scores}_i\right) \equiv\left[\begin{array}{c} \operatorname{mean}\left(\operatorname{scores}_i\right) \\ \operatorname{var}\left(\operatorname{scores}_i\right) \end{array}\right] m ( scores i ) ≡ [ mean ( scores i ) var ( scores i ) ] 测试分数的一次模拟(某次模拟)会是什么样子?数据文件 tpts.txt 中有 161 个测试分数观测值。因此,一次模拟(某次模拟)将是从参数 μ 、 σ \mu、\sigma μ 、 σ 和截断值 =450 的截断正态分布中抽取 161 个测试分数。
Copy import numpy as np
import numpy . random as rnd
import numpy . linalg as lin
import scipy . stats as sts
import scipy . integrate as intgr
import scipy . optimize as opt
import matplotlib
import matplotlib . pyplot as plt
from mpl_toolkits . mplot3d import Axes3D
from matplotlib import cm
cmap1 = matplotlib . cm . get_cmap ( 'summer' )
% matplotlib notebook
Copy url = ( 'https://raw.githubusercontent.com/Notebooks/' +
'master/DMM/data/tpts.txt' )
data_file = requests . get (url, allow_redirects = True )
open ( 'tpts.txt' , 'wb' ). write (data_file.content)
pts = np . loadtxt ( 'tpts.txt' )
令随机变量 y ∼ N ( μ , σ ) y \sim N(\mu, \sigma) y ∼ N ( μ , σ ) 服从均值 μ \mu μ 和标准差 σ \sigma σ 的正态分布,概率密度函数为 ϕ ( y ∣ μ , σ ) \phi(y \mid \mu, \sigma) ϕ ( y ∣ μ , σ ) 和累积密度函数由Φ ( y ∣ μ , σ ) \Phi(y \mid \mu, \sigma) Φ ( y ∣ μ , σ ) 给出。随机变量 x ∈ ( a , b ) x \in(a, b) x ∈ ( a , b ) 的截断正态分布基于 y,但截止值为 a ≥ − ∞ a \geq-\infty a ≥ − ∞ 作为下限,a < b ≤ ∞ a<b \leq \infty a < b ≤ ∞ 为上限具有以下概率密度函数。
f ( x ∣ μ , σ , a , b ) = { 0 if x ≤ a ϕ ( x ∣ μ , σ ) Φ ( b ∣ μ , σ ) − Φ ( a ∣ μ , σ ) 0 if x ≥ b if a < x < b f(x \mid \mu, \sigma, a, b)=\left\{\begin{array}{l} 0 \text { if } \quad x \leq a \\ \frac{\phi(x \mid \mu, \sigma)}{\Phi(b \mid \mu, \sigma)-\Phi(a \mid \mu, \sigma)} \\ 0 \quad \text { if } \quad x \geq b \end{array} \quad \text { if } a<x<b\right. f ( x ∣ μ , σ , a , b ) = ⎩ ⎨ ⎧ 0 if x ≤ a Φ ( b ∣ μ , σ ) − Φ ( a ∣ μ , σ ) ϕ ( x ∣ μ , σ ) 0 if x ≥ b if a < x < b 截断法线的累计密度函数可以表示为:
F ( x ∣ μ , σ , a , b ) = { 0 if x ≤ a Φ ( x ∣ μ , σ ) − Φ ( a ∣ μ , σ ) Φ ( b ∣ μ , σ ) − Φ ( a ∣ μ , σ ) 0 if x ≥ b if a < x < b F(x \mid \mu, \sigma, a, b)=\left\{\begin{array}{l} 0 \quad \text { if } \quad x \leq a \\ \frac{\Phi(x \mid \mu, \sigma)-\Phi(a \mid \mu, \sigma)}{\Phi(b \mid \mu, \sigma)-\Phi(a \mid \mu, \sigma)} \\ 0 \quad \text { if } \quad x \geq b \end{array} \quad \text { if } a<x<b\right. F ( x ∣ μ , σ , a , b ) = ⎩ ⎨ ⎧ 0 if x ≤ a Φ ( b ∣ μ , σ ) − Φ ( a ∣ μ , σ ) Φ ( x ∣ μ , σ ) − Φ ( a ∣ μ , σ ) 0 if x ≥ b if a < x < b 请注意,z 只是 p 的变换,使得z ∼ U ( Φ − 1 ( a ∣ μ , σ ) , Φ − 1 ( b ∣ μ , σ ) ) z \sim U\left(\Phi^{-1}(a \mid \mu, \sigma), \Phi^{-1}(b \mid \mu, \sigma)\right) z ∼ U ( Φ − 1 ( a ∣ μ , σ ) , Φ − 1 ( b ∣ μ , σ ) ) 。
定义函数,根据截断正态分布给出概率密度函数值
Copy def trunc_norm_pdf ( xvals , mu , sigma , cut_lb , cut_ub ):
if (cut_lb == None ) & (cut_ub == None ) :
cut_ub_cdf = 1.0
cut_lb_cdf = 0.0
elif (cut_lb != None ) & (cut_ub == None ) :
cut_ub_cdf = 1.0
cut_lb_cdf = sts . norm . cdf (cut_lb, loc = mu, scale = sigma)
elif (cut_lb == None ) & (cut_ub != None ) :
cut_ub_cdf = sts . norm . cdf (cut_ub, loc = mu, scale = sigma)
cut_lb_cdf = 0.0
elif (cut_lb != None ) & (cut_ub != None ) :
cut_ub_cdf = sts . norm . cdf (cut_ub, loc = mu, scale = sigma)
cut_lb_cdf = sts . norm . cdf (cut_lb, loc = mu, scale = sigma)
pdf_vals = (sts . norm . pdf (xvals, loc = mu, scale = sigma) /
(cut_ub_cdf - cut_lb_cdf))
return pdf_vals
定义从截断的结果中提取 N x S 测试分数值的函数
Copy def trunc_norm_draws ( unif_vals , mu , sigma , cut_lb , cut_ub ):
if (cut_lb == None ) & (cut_ub == None ) :
cut_ub_cdf = 1.0
cut_lb_cdf = 0.0
elif (cut_lb != None ) & (cut_ub == None ) :
cut_ub_cdf = 1.0
cut_lb_cdf = sts . norm . cdf (cut_lb, loc = mu, scale = sigma)
elif (cut_lb == None ) & (cut_ub != None ) :
cut_ub_cdf = sts . norm . cdf (cut_ub, loc = mu, scale = sigma)
cut_lb_cdf = 0.0
elif (cut_lb != None ) & (cut_ub != None ) :
cut_ub_cdf = sts . norm . cdf (cut_ub, loc = mu, scale = sigma)
cut_lb_cdf = sts . norm . cdf (cut_lb, loc = mu, scale = sigma)
unif2_vals = unif_vals * (cut_ub_cdf - cut_lb_cdf) + cut_lb_cdf
tnorm_draws = sts . norm . ppf (unif2_vals, loc = mu, scale = sigma)
return tnorm_draws
从平均值 μ = 300 , σ = 30 \mu=300, \sigma=30 μ = 300 , σ = 30 的截断正态分布中模拟 161 个测试分数会是什么样子?
Copy mu_1 = 300.0
sig_1 = 30.0
cut_lb_1 = 0.0
cut_ub_1 = 450.0
unif_vals_1 = sts . uniform . rvs ( 0 , 1 , size = 161 )
draws_1 = trunc_norm_draws (unif_vals_1, mu_1, sig_1,
cut_lb_1, cut_ub_1)
print ( 'Mean score =' , draws_1. mean ())
print ( 'Variance of scores =' , draws_1. var ())
print ( 'Standard deviation of scores =' , draws_1. std ())
count_d , bins_d , ignored_d = \
plt . hist (pts, 30 , density = True , color = 'b' , edgecolor = 'black' ,
linewidth = 0.8 , label = 'Data' )
count_m , bins_m , ignored_m = \
plt . hist (draws_1, 30 , density = True , color = 'r' , edgecolor = 'black' ,
linewidth = 0.8 , label = 'Simulated data' )
xvals = np . linspace ( 0 , 450 , 500 )
plt . plot (xvals, trunc_norm_pdf (xvals, mu_1, sig_1, cut_lb_1, cut_ub_1),
linewidth = 2 , color = 'k' , label = 'PDF' )
plt . title ( 'Econ 381 scores: 2011-2012' , fontsize = 20 )
plt . xlabel ( 'Total points' )
plt . ylabel ( 'Percent of scores' )
plt . xlim ([ 0 , 550 ])
plt . legend (loc = 'upper left' )
通过该模拟,我们可以根据模拟数据计算矩,就像根据实际数据计算矩一样。