使用两种不同的方法估计几何布朗运动随机过程的参数
文章目录
- 一、说明
- 二. 随机过程
- 三、马尔可夫过程
- 3.1. 维纳进程
- 3.2. 广义维纳过程
- 3.3. 伊藤进程
- 四、几何布朗运动 (GBM)
- 五、用于估计GBM工艺参数的MLE方法
- 5.1. 最大似然估计如何工作?
- 5.2、将模型拟合到一组历史数据
- 六、估算GBM工艺参数的财务方法
- 七、结论
一、说明
称为几何布朗运动(又名随机游走)的随机过程是最常见和最普遍使用的过程,因为它简单且应用广泛。在本文中,我将展示如何使用两种不同的方法估计几何布朗运动过程的参数。
第一种方法是将随机过程(即几何布朗运动模型)拟合到一组历史数据中。第二种方法是简单地计算预期回报和历史数据的波动性。在第一种方法中,我们需要对参数的初始值做出假设。
二. 随机过程
随机过程只不过是一个数学定义的方程式,随着时间的推移可以产生一系列结果,这些结果本质上不是确定性的;也就是说,一个不遵循任何简单可辨别规则的方程式或过程(例如价格)将每年增加 X 个百分点,或者收入将增加 X 加 Y 个百分点的系数。
根据定义,随机过程是不确定的,可以将数字代入随机过程方程中,每次都获得不同的结果。例如,股票价格的路径本质上是随机的,人们无法可靠地预测确切的股票价格路径。
然而,价格随时间的演变被包裹在产生这些价格的过程中。这个过程是固定的和预先确定的,但结果不是。
因此,通过随机模拟,我们创建了多种价格路径,获得这些模拟的统计抽样,并根据用于生成时间序列的随机过程的性质和参数,对实际价格可能采取的潜在路径进行推断。
三、马尔可夫过程
在有效市场中,金融价格应呈现随机游走模式。更准确地说,假设价格遵循马尔可夫过程,这是一个独立于其历史的特定随机过程——未来价格的整个分布仅依赖于当前价格。过去是无关紧要的。
这些过程由以下组件构建,按复杂性递增的顺序进行描述。
3.1. 维纳进程
维纳过程描述了一个变量 Δz,其变化在区间 t 上测量,使其平均变化为零,方差与 Δt 成正比:
如果是一个标准的正态变量 N(0, 1),则可以写成
此外,增量 z 随时间变化是独立的。
3.2. 广义维纳过程
广义维纳过程描述了由维纳过程建立的变量 Δx,此外还有每单位时间的恒定趋势 a 和波动率 b:
一个特殊情况是马丁格尔,这是一个零漂移随机过程,a = 0,导致 E(Δx) = 0。这具有方便的属性,即对未来值的期望是当前值
3.3. 伊藤进程
伊藤过程描述了一个广义的维纳过程,其趋势和波动性取决于基础变量的当前值和时间:
这是一个马尔可夫过程,因为分布仅取决于随机变量 x 的当前值以及时间。此外,这一过程中的创新具有正态分布。
四、几何布朗运动 (GBM)
伊藤过程的一个特殊例子是几何布朗运动 (GBM),对于变量 S 来说,它被描述为
该过程是几何的,因为趋势和波动率项与 S 的当前值成正比。股票价格通常就是这种情况,股票价格的回报率似乎比原始美元回报率更稳定。它也用于货币。
由于 ΔS/S 仅代表资本增值,从股息支付中抽象出来,μ年化增长率或漂移率,它代表资产的预期总回报率减去收入支付率,或股票的股息收益率。σ是年化波动率或冲击率,它代表资产所有回报的标准差。
这个模型特别重要,因为它是布莱克-斯科尔斯公式的基础过程。这种分布的关键特征是波动率与 S 成正比。
这确保了股价将保持正值。事实上,随着股价下跌,其方差减小,这使得它不太可能经历大幅下跌,从而将价格推至负值。
由于该模型的极限是
S 服从对数正态分布。这个过程意味着,在区间 T − t = τ 上,期末价格的对数分布为
其中 ε 是标准化正态变量。
对数正态分布是否比正态分布好得多取决于所考虑的跨度。如果地平线只有一天,那么对数正态与正态假设的选择并不重要。
鉴于典型的波动性,股价在一天内跌破零的可能性极小。另一方面,如果以年为单位来衡量地平线,则这两个假设确实会导致不同的结果。
对数正态分布更现实,因为它可以防止价格转为负值。在模拟中,该过程通过具有正态分布的小步长近似,均值和方差由下式给出
只需一个步骤 n = 1,分布必须是正态的。随着步长 n 的增加,分布趋向于对数正态分布。
虽然该模型对股票价格建模非常有用,但也有缺点。假定价格增量具有正态分布。在实践中,我们观察到价格变化的尾巴比正态分布更肥。
退货也可能出现变化差异。此外,随着时间间隔 Δt 的缩小,波动性也会缩小。这意味着在短时间间隔内不会发生大的不连续性。
实际上,一些资产会经历离散的跳跃,例如大宗商品。因此,可能必须改变随机过程以适应这些观察结果。
3.1. 股票价格遵循几何布朗运动过程的示例
考虑一只不支付股息、预期年回报率为 10% 、年波动率为 20% 的股票。如果当前价格为 100 美元,那么下周股价的变化过程是什么?如果当前价格为 10 美元怎么办?
股价的过程是
其中是从标准正态分布中随机抽取。如果间隔为一周,则 Δt = 1/52 = 0.01923。
趋势为 μΔt = 0.10 × 0.01923 = 0.001923,波动率为 σ√Δt = 0.20 × √0.01923 = 0.027735。
几何布朗运动过程为 S = $100(0.001923 + 0.027735× ε)
初始股价为 100 美元,这给出 S = 0.1923 + 2.7735。
初始股价为 10 美元,这给出 S = 0.01923 + 0.27735。趋势和波动性缩小了十倍。
现在,假设一周内的价格由 S = $100exp(R) 给出,其中 R 的年度期望值为 10%,波动率为 20%。为 S 构建 95% 置信区间。
对应于 95% 置信区间的标准正态偏差为 α_MIN = −1.96 和 α_MAX = 1.96。换句话说,我们在每条尾巴上有 2.5%。
R 的 95% 置信带的下限称为 R_MIN:
R_最小值 = μΔt − 1.96σ√Δt = 0.001923 − 1.96 × 0.027735 = −0.0524
R 的 95% 置信带的上限称为 R_MAX:
R_MAX = μΔt + 1.96σ√Δt = 0.001923 + 1.96 × 0.027735 = 0.0563。
这给出S_MIN = $100exp(−0.0524) = $94.89,S_MAX = $100exp(0.0563) = $105.79。
五、用于估计GBM工艺参数的MLE方法
最大似然估计,简称 MLE,是一种传统的概率方法,可以应用于属于任何分布的数据,即正态分布、泊松分布、伯努利分布等。有了关于数据分布的先验假设或知识,最大似然估计有助于找到最有可能发生的分布参数。
例如,假设我们有假设呈正态分布的数据,但我们不知道其均值和标准差参数。最大似然估计以迭代方式搜索可能生成分布的最可能的均值和标准差。
此外,最大似然估计可以应用于回归和分类问题。因此,最大似然估计只是一种搜索最合适参数的优化算法。
由于我们先验地知道数据分布,因此算法会迭代尝试找到其模式。这种方法非常通用,因此设计一个用户定义的 Python 函数来解决特定的机器学习问题非常重要。
5.1. 最大似然估计如何工作?
术语“可能性”可以定义为所考虑的参数可能生成数据的可能性。似然函数只是数据分布的联合概率函数。
最大似然函数是与最可能参数一起使用的优化似然函数。函数最大化是通过对似然函数相对于分布参数进行微分并单独设置为零来执行的。
如果我们回顾概率的基础知识,我们可以理解联合概率函数只是单个数据点的概率函数的乘积。对于大型数据集,实际上很难制定联合概率函数并根据参数对其进行微分。
因此,MLE引入了对数似然函数。最大化严格递增函数与最大化其对数形式相同。
通过似然函数或对数似然函数获得的参数是相同的。对数形式使大乘积函数能够转换为求和函数。
对各个似然函数求和并对其进行微分是很容易的。由于数学工作的这种简单性,最大似然估计可以解决具有数百万个数据点的庞大数据集!
对于每个问题,用户都需要制定模型和分布函数以得出对数似然函数。优化是使用 SciPy 库的“优化”模块执行的。
该模块有一个名为“最小化”的方法,可以最小化与输入参数相关的任何输入函数。在我们的例子中,MLE寻找最大化对数似然函数。
因此,我们将负对数似然作为“最小化”方法的输入函数提供。它根据每个输入参数对用户定义的负对数似然函数进行微分,并以迭代方式得出最佳参数。
通过 MLE 方法找到的参数称为最大似然估计。在续集中,我们通过一个示例讨论了最大似然估计的 Python 实现。
5.2、将模型拟合到一组历史数据
我们的估计日期是 2023 年 12 月 31 日。为了预测 2024 年的以色列通货膨胀率,我选择了来自以色列银行的消费者价格指数 (CPI) 数据集。该数据集基于 2018 年 12 月 31 日至 2023 年 12 月 31 日的消费者价格指数。
5 年的时间窗口通常是金融精算师的规范性、代表性和公认的时间窗口。
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from numpy import random as rn
from scipy import stats
import scipy.stats as si
import seaborn as sns
from scipy.stats import normimport pandas as pd
cpi = pd.read_csv('CPI_Total.csv')
cpi.head()
cpi.tail()
让我们选择μ的初始值,即年化增长率或漂移率,并σ年化波动率或冲击率
μ = a = 0.015
σ = b = 0.001
让我们重命名 CPI 列
df = cpi.copy()
df = df.rename(columns={"CPI": "S"})
df
现在,让我们为 ΔS 创建一个新列
df["S(t+1)-S(t)"] = 0.00
for i in range(0,len(df["DATE"])-1):df["S(t+1)-S(t)"][i] = df["S"][i+1]-df["S"][i]
df
现在,让我们为 μS 创建一个新列
df[“μS(t)”] = 0.00
for i in range(0,len(df[“DATE”])-1):
df[“μS(t)”][i] = μ*df[“S”][i]
df
现在,让我们为 ΔS - μS 创建一个新列
df[“S(t+1)-S(t)-μS(t)”] = 0.00
for i in range(0,len(df[“DATE”])-1):
df[“S(t+1)-S(t)-μS(t)”][i] = df[“S(t+1)-S(t)”][i]-df[“μS(t)”][i]
df
让我们创建一个名为 NORMDIST 的函数,该函数返回指定均值和标准差的正态概率密度函数(又称“概率质量函数”)。此函数在统计学中具有非常广泛的应用,包括假设检验。
def NORMDIST(x):
z = si.norm.pdf(x,mu,sigma)
return (z)
现在,让我们为似然函数创建一个新列
df[“pdf”] = 0.00
for i in range(0,len(df[“DATE”])-1):
mu = 0.00
sigma = σ*df[“S”][i]
x = df[“S(t+1)-S(t)-μS(t)”][i]
df[“pdf”][i] = si.norm.pdf(x,mu,sigma)
df
现在,让我们为对数似然函数创建一个新列
df[“ln(pdf)”] = 0.00
for i in range(0,len(df[“DATE”])-1):
df[“ln(pdf)”][i] = np.log(df[“pdf”][i])
df
现在,让我们总结一下对数似然列
df[“ln(pdf)”].sum()
-5498.5108982847005
现在,让我们找到使所有对数似然值之和最大化的μ和σ
from scipy.optimize import fmindef ImpliedBrownianMotion(c):df = cpi.copy()df = df.rename(columns={"CPI": "S"})df["S(t+1)-S(t)"] = 0.00df["μS(t)"] = 0.00df["S(t+1)-S(t)-μS(t)"] = 0.00df["pdf"] = 0.00df["ln(pdf)"] = 0.00for i in range(0,len(df["DATE"])-1):df["S(t+1)-S(t)"][i] = df["S"][i+1]-df["S"][i]df["μS(t)"][i] = c[0]*df["S"][i]df["S(t+1)-S(t)-μS(t)"][i] = df["S(t+1)-S(t)"][i]-df["μS(t)"][i]mu = 0.00sigma = c[1]*df["S"][i]x = df["S(t+1)-S(t)-μS(t)"][i]df["pdf"][i] = si.norm.pdf(x,mu,sigma)df["ln(pdf)"][i] = np.log(df["pdf"][i])f1 = df["ln(pdf)"].sum()val = -f1print("[μ, σ]=",c,", Object Function Value:", val)return(val)c = fmin(ImpliedBrownianMotion, [0.015,0.001])
μ = c[0]
σ = c[1]
print("The monthly drift rate obtained via the MLE approach is:", "{:.4%}".format(μ))
print("The monthly volatility rate obtained via the MLE approach is:", "
{:.4%}".format(σ))
通过MLE方法获得的月度波动率为:0.1792%
通过MLE方法获得的月度波动率为:0.3420%
六、估算GBM工艺参数的财务方法
我们的估计日期是 2023 年 12 月 31 日。为了预测 2024 年的以色列通货膨胀率,我选择了来自以色列银行的消费者价格指数 (CPI) 数据集。该数据集基于 2018 年 12 月 31 日至 2023 年 12 月 31 日的消费者价格指数。
5 年的时间窗口通常是金融精算师的规范性、代表性和公认的时间窗口。
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from numpy import random as rn
from scipy import stats
import scipy.stats as si
import seaborn as sns
from scipy.stats import normimport pandas as pd
cpi = pd.read_csv('CPI_Total.csv')
cpi.head()
cpi.tail()
让我们重命名 CPI 列
df1 = cpi.copy()
df1 = df1.rename(columns={"CPI": "Price"})
df1
现在,让我们为相对回报创建一个新列
df1["Return"] = 0.00
for i in range(0,len(df1["DATE"])-1):df1["Return"][i] = df1["Price"][i+1]/df1["Price"][i]-1
df1
要从一组时间序列数据中估计μ参数,可以通过将漂移率和设置为相对回报的平均值来找到 μ
mu = df1["Return"].mean()
print("The monthly drift rate as the average of all the relative returns is:", "{:.4%}".format(mu))
所有相对回报的平均月漂移率为:0.1764%
要从一组时间序列数据中估计σ参数,可以通过将漂移率和设置为所有相对回报的标准差来找到σ
sigma = df1["Return"].std()
print("The monthly volatility rate as the standard deviation of all the relative returns is:", "{:.4%}".format(sigma))
月波动率是所有相对回报的标准差为:0.3424%
七、结论
models = ['MLE','Finance','Initial Values']
drift_rate = [μ, mu, a]
volatility_rate = [σ, sigma, b]
compare_models = pd.DataFrame({ "Approaches": models, "drift rate": drift_rate, "volatility rate": volatility_rate })
compare_models
正如我在本文中所展示的,有几种方法可以估计 GBM 过程的参数。为了估计这些参数,可以将模型拟合到一组历史数据中,或者计算预期回报和历史数据的波动性,或者更确切地说,对这些值做出假设。