一、离散随机变量#
离散随机变量的取值是可数的,每个结果的概率明确。例如骰子的每个面有1/6的概率。
1.1 概率质量函数(PMF)#
PMF满足两个性质:
import numpy as np
import matplotlib.pyplot as plt
class DiscreteUniformRV:
def __init__(self, low, high):
self.low = low
self.high = high
def draw_samples(self, n_samples):
return np.random.randint(self.low, self.high+1, n_samples)
# 骰子示例
die = DiscreteUniformRV(1, 6)
samples = die.draw_samples(1000)
plt.hist(samples, bins=6, density=True, alpha=0.8)
plt.title("Discrete Uniform Distribution (Die Roll)")
plt.show()1.2 二项分布#
描述n次独立伯努利试验的成功次数,PMF为:
-
n:试验次数
-
k:成功次数
-
p:每次成功概率
-
C(n,k):二项分布系数
创建一个二项分布随机变量类并用它模拟股票涨跌情况:
-
BinomialRV类初始化时需要两个参数:-
n: 试验次数 -
p: 单次试验成功的概率
-
-
draw_samples方法生成指定数量的随机样本 -
代码示例中:
-
创建了一个
n=5, p=0.5的二项分布(相当于5天内股票上涨概率为50%) -
生成1000个样本
-
使用直方图可视化了结果分布
-
class BinomialRV:
def __init__(self, n, p):
self.n = n
self.p = p
def draw_samples(self, n_samples):
return np.random.binomial(self.n, self.p, n_samples)
# 股票涨跌示例(假设每日涨的概率0.5)
stock_moves = BinomialRV(n=5, p=0.5)
samples = stock_moves.draw_samples(1000)
plt.hist(samples, bins=6, density=True, alpha=0.8)
plt.title("Binomial Distribution (n=5, p=0.5)")
plt.show()这个例子很好地展示了如何使用二项分布模拟股票市场的简单涨跌模型。在这个模型中,每天股票有50%的概率上涨,我们观察5天内上涨的天数分布。最终的直方图应该呈现对称的钟形,峰值在2-3天处。
这种模型虽然简化了真实市场的复杂性,但对于理解随机事件的累积效应很有帮助。
二、连续随机变量#
连续随机变量取值不可数,用概率密度函数(PDF)描述概率分布。
2.1 概率密度函数(PDF)#
满足:
-
f(x) ≥ 0
-
∫f(x)dx = 1
2.2 正态分布#
最常见的重要分布,PDF为:
这个函数各部分的含义是:
-
:均值参数,决定了分布的中心位置
-
:标准差参数,控制分布的宽度或分散程度
-
:归一化系数,确保概率密度函数的总积分为1
-
:指数部分,决定了钟形曲线的形状
当接近时,指数部分接近1,密度达到最大值;随着远离,概率密度迅速下降。较大的值会使曲线更平坦宽广,较小的值则使曲线更高且集中。
正态分布有"68-95-99.7"规则:约68%的数据在范围内,约95%在范围内,约99.7%在范围内。
这段代码创建了一个正态分布随机变量类并生成样本:
-
NormalRV类初始化需要两个参数:-
mu: 均值(分布的中心) -
sigma: 标准差(分布的宽度)
-
-
draw_samples方法生成指定数量的随机样本 -
代码示例中:
-
创建了一个均值为0,标准差为1的标准正态分布
-
生成1000个样本
-
使用30个柱子的直方图可视化了结果分布
-
添加了"Standard Normal Distribution"标题
-
class NormalRV:
def __init__(self, mu, sigma):
self.mu = mu
self.sigma = sigma
def draw_samples(self, n_samples):
return np.random.normal(self.mu, self.sigma, n_samples)
# 标准正态分布示例
normal = NormalRV(0, 1)
samples = normal.draw_samples(1000)
plt.hist(samples, bins=30, density=True, alpha=0.8)
plt.title("Standard Normal Distribution")
plt.show()正态分布在金融领域极为重要,被广泛用于:
-
资产收益率建模
-
期权定价(如Black-Scholes模型)
-
风险管理和VaR计算
-
投资组合理论
标准正态分布(μ=0, σ=1)是正态分布的标准化形式,呈现典型的钟形曲线,大约68%的数据落在±1标准差范围内,95%落在±2标准差范围内。
实战:用真实数据拟合分布#
获取股票数据#
import yfinance as yf
import pandas as pd
# 获取特斯拉股票数据
tsla = yf.download('TSLA', start='2020-01-01', end='2023-01-01')
returns = tsla['Close'].pct_change().dropna()正态性检验#
Jarque-Bera测试是金融分析中常用的正态性检验方法,通过测量数据的偏度(skewness)和峰度(kurtosis)来判断数据是否符合正态分布:
-
零假设H₀:数据服从正态分布
-
如果 p 值很小(通常<0.05),则拒绝零假设,认为数据不服从正态分布
从打印的 p 值可以判断TSLA(特斯拉)的日收益率是否符合正态分布。实际上,金融资产收益率通常表现出"尖峰厚尾"特征,即中间峰值比正态分布更高,尾部比正态分布更厚,这也是为什么需要进行这种正态性检验。
这种分析对于风险管理和投资组合构建非常重要,因为许多金融模型假设收益率呈正态分布。
from scipy.stats import jarque_bera
jb_test = jarque_bera(returns)
print(f"JB统计量: {jb_test[0]:.2f}, p值: {jb_test[1]:.4f}")
# 绘制收益率分布
plt.hist(returns, bins=50, density=True, alpha=0.8)
plt.title("TSLA Daily Returns Distribution")
plt.show()拟合正态分布#
这个可视化直接对比了实际收益率分布与理论正态分布,允许我们直观地判断:
-
实际分布的中心位置是否与正态分布一致
-
实际分布的尖峰程度是否比正态分布更高(常见于金融数据)
-
实际分布的尾部是否比正态分布更厚(极端收益率事件的频率)
from scipy.stats import norm
mu, std = returns.mean(), returns.std()
x = np.linspace(returns.min(), returns.max(), 100)
pdf = norm.pdf(x, mu, std)
plt.hist(returns, bins=50, density=True, alpha=0.5)
plt.plot(x, pdf, 'r', linewidth=2)
plt.title("Fitted Normal Distribution")
plt.show()这种分析对于风险管理非常重要,因为如果实际分布显著偏离正态假设,那么基于正态分布的风险度量(如标准VaR)可能会低估极端损失的可能性。通常金融收益率会呈现出"尖峰厚尾"特征,即分布中心比正态分布更尖,两侧尾部比正态分布更厚。
小练习#
-
修改二项分布的参数n和p,观察分布形状的变化
-
尝试用不同的股票数据(如AAPL)重复分布拟合过程
-
计算标准正态分布在±1σ范围内的概率(答案:约68.27%)
# 练习3答案示例
prob = norm.cdf(1) - norm.cdf(-1)
print(f"标准正态分布在±1σ范围内的概率: {prob:.4f}")通过这个结构化的教程,新手可以逐步理解随机变量的核心概念,并通过实际代码示例加深对理论的理解。