什么是概率?
概率衡量某件事发生的可能性。理解概率是所有统计推断和量化建模的基础。
概率的含义
当我说”明天有60%的降雨概率”,我们真正想表达的是什么?这取决于提问者的角度。概率主要有两种解释方式,它们在不同情境下各有用途。
频率解释认为,概率是如果你无限次重复某个实验,事件发生的比例极限。抛一枚公平的硬币10000次,你会看到大约5000次正面,频率约为0.5。重复实验的次数越多,观察到的频率就越接近真实概率。这种解释对机会博弈和可重复的金融事件(如每日股票收益)建模非常有效。
主观解释将概率视为一种信念程度。一位量化分析师可能会说”我给这笔交易盈利的概率赋值为30%“——这不是因为他做了实验,而是基于分析、经验和现有信息形成的信念。主观概率是贝叶斯统计的基础,在贝叶斯框架中,你的信念会随着新证据的到来而更新。
两种观点都是有效的,在量化金融中你都会遇到。概率的数学规则——定理、公式和定律——无论你选择哪种解释都是一样的。
样本空间与事件
在讨论概率之前,我们需要先明确我们在测量什么。
样本空间 是随机实验所有可能结果的集合。如果你掷一枚六面骰子,样本空间是 。如果你观察一只股票的日收益率,样本空间是所有实数(实际上,你可能会限制在某个范围内,如 作为单日波动范围)。
事件是样本空间的子集。“掷出偶数”是事件 。一个事件可以包含一个结果、多个结果,或者不包含任何结果(空集 )。
概率公理
Kolmogorov 公理由俄罗斯数学家 Andrey Kolmogorov 于 1933 年提出,是现代概率论的基础。它们出奇地简单。
第一,概率总是在0和1之间:
第二,某个事情发生——即你落在样本空间中的概率为1:
第三,对于任何不能同时发生的两个事件(称为互斥事件),其中一个发生的概率等于它们各自概率之和:
从这三个公理出发,几乎概率论的所有内容都可以推导出来。例如,如果 和 ( 的补集,即”非 “)是互补事件,那么 。这很直观:要么 发生,要么不发生——这是仅有的两种可能,它们的概率之和必须为1。
互补事件
补规则是概率中最实用的捷径之一。如果你知道某年发生市场崩盘的概率是5%,那么不崩盘的概率就是95%。与其枚举所有不发生崩盘的方式,不如找到补集的概率,然后用1减去它。
加法规则与乘法规则
对于非互斥事件——即可以同时发生的事件——加法规则需要一个修正:
这一项减去了被重复计算的重叠部分。想象一下统计选修数学或经济学的学生人数:如果你把学数学的学生数加上学经济学的学生数,两个都学的学生就被计算了两次,所以你需要减掉一次。
乘法规则给出两个事件同时发生的概率:
这里 是在 已经发生的条件下 的条件概率——我们接下来会详细讨论。
如果 和 是独立的(也就是说,知道 是否发生并不能告诉你任何关于 是否发生的信息),那么 ,乘法规则简化为:
条件概率
很多时候我们想知道在已知其他事件发生的前提下,某事件发生的概率。这就是条件概率:
读作”在 发生的条件下 的概率”。例如,如果你从一副标准扑克牌中抽出一张,想知道它是红桃且已知它是红色牌的概率,你求的就是 。
维恩图在这里是一个很有用的可视化工具。想象一个代表样本空间的矩形,其中两个重叠的圆代表事件 和 。重叠部分——交集——就是 。条件概率 问的是:在我们已知处于圆 内部的前提下,圆 中同时也在圆 内部的比例是多少?这个比例正好是 。
独立性
如果知道一个事件不能改变另一个事件的概率,这两个事件就是独立的:
由此可以直接推出独立事件的乘法规则:
一个经典例子:如果你抛一枚公平的硬币两次,第一次的结果不会影响第二次。。
用 Python 模拟概率
Python 是通过模拟来建立概率直觉的优秀工具。大数定律(我们后面会学到)指出,你重复实验的次数越多,观察到的频率就越接近真实概率。让我们来演示一下。
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
n_flips = 10_000
flips = np.random.choice([0, 1], size=n_flips) # 0 = 背面, 1 = 正面
# 计算正面的累积比例
running_prop = np.cumsum(flips) / np.arange(1, n_flips + 1)
plt.figure(figsize=(10, 5))
plt.plot(np.arange(1, n_flips + 1), running_prop, alpha=0.7)
plt.axhline(y=0.5, color='red', linestyle='--', label='真实概率 = 0.5')
plt.xlabel('抛掷次数')
plt.ylabel('正面比例')
plt.title('大数定律:硬币抛掷模拟')
plt.legend()
plt.grid(alpha=0.3)
plt.show()
# 模拟掷10000次公平六面骰子
n_rolls = 10_000
rolls = np.random.choice([1, 2, 3, 4, 5, 6], size=n_rolls)
print(f"观察到的频率:")
for face in range(1, 7):
freq = np.mean(rolls == face)
print(f" 面 {face}: {freq:.4f} (真实概率: {1/6:.4f})")
提示词
用 numpy 写一段概率直觉演示:模拟 1 万次抛硬币画正面累积比例的收敛曲线;再模拟 1 万次掷骰子,统计每个面出现的频率。
这段代码表明,随着试验次数的增加,观察到的比例会收敛到真实概率。试着改变 n_flips 的值,看看不同样本量下收敛行为是如何变化的。
参考文献
Ross, S. M. A First Course in Probability, Chapter 1. Pearson. Grimmett, G. R. and Welsh, D. Probability, Chapter 1. Oxford University Press.