رقم لم تُعرف قيمته بعد
المتغير العشوائي كمية تعتمد قيمتها على الصدفة: رمية نرد أو عائد الغد أو سعر سهم عند الاستحقاق. ويأخذ المتغير العشوائي المتقطع قائمة قيم ممكنة لكل منها احتمال. وتشكل القيم والاحتمالات معًا توزيعه. والاحتمالات لا تكون سالبة أبدًا ومجموعها 1. وفي بايثون هما قائمتان بالطول نفسه values وprobs. والنرد العادل هو values = [1, 2, 3, 4, 5, 6] مع probs = [1/6] * 6.
import math
values = [1, 2, 3, 4, 5, 6]
probs = [1 / 6] * 6
# A valid distribution: no negatives, and the probabilities add up to 1
print(all(p >= 0 for p in probs)) # True
print(math.isclose(sum(probs), 1.0)) # True (compare floats with isclose)
# A stock tomorrow: down 5%, up 2% or up 8%
returns = [-0.05, 0.02, 0.08]
chances = [0.2, 0.5, 0.3]
print(math.isclose(sum(chances), 1.0)) # Trueالتوقّع: المتوسط الموزون بالاحتمالات
القيمة المتوقعة E[X] هي المتوسط الذي تحصل عليه بعد تكرارات كثيرة: اضرب كل قيمة في احتمالها ثم اجمع sum(v * p). للنرد E[X] = 3.5 وهو رقم لا يظهر أبدًا، ولا بأس: فهو متوسط طويل الأمد لا تنبؤ بنتيجة بعينها. والتوقّع خطي: E[a*X + b] = a*E[X] + b. وتوقّع دالة E[g(X)] يطبّق g على كل قيمة أولًا: sum(g(v) * p). انتبه: في العموم E[g(X)] ليس g(E[X]). وعائد الخيار max(S - K, 0) هو الحالة الكلاسيكية.
def expected_value(values, probs):
return sum(v * p for v, p in zip(values, probs))
die = [1, 2, 3, 4, 5, 6]
fair = [1 / 6] * 6
print(round(expected_value(die, fair), 4)) # 3.5
# E[g(X)]: apply g to each value first. Call payoff with strike 100:
prices = [90, 100, 110, 120]
chances = [0.1, 0.4, 0.3, 0.2]
mean_price = expected_value(prices, chances)
print(mean_price) # 106.0
print(expected_value([max(s - 100, 0) for s in prices], chances)) # 7.0 = E[max(S - K, 0)]
print(max(mean_price - 100, 0)) # 6.0 = max(E[S] - K, 0), not the sameالتباين: ما مدى تشتّتها؟
قد يكون لاستثمارين العائد المتوقع نفسه ومخاطر مختلفة جدًا. يقيس التباين التشتت حول المتوسط: Var(X) = E[(X - mu)^2] ويمكن حسابه أيضًا بـE[X^2] - E[X]^2. والانحراف المعياري جذره التربيعي وبوحدات X نفسها؛ وهو للعوائد التقلّب. وللنرد Var = 35/12 = 2.9167. وكلاهما يُبنى من توقعات دوال في X، فتعطيك دالة expected_of(g, values, probs) مكتوبة جيدًا المتوسط والعزم الثاني وكل ما يليه.
def expected_value(values, probs):
return sum(v * p for v, p in zip(values, probs))
def expected_of(g, values, probs):
return expected_value([g(v) for v in values], probs)
def variance(values, probs):
mean = expected_of(lambda v: v, values, probs)
return expected_of(lambda v: v * v, values, probs) - mean ** 2
die, fair = [1, 2, 3, 4, 5, 6], [1 / 6] * 6
print(round(variance(die, fair), 4)) # 2.9167
returns, chances = [-0.05, 0.02, 0.08], [0.2, 0.5, 0.3]
print(round(expected_value(returns, chances), 4)) # 0.024
print(round(variance(returns, chances), 6)) # 0.002044المحاكاة وقانون الأعداد الكبيرة
يمكنك أيضًا تقدير توقّع بسحب عيّنات. تُرجع rng.choices(values, weights=probs, k=n) عدد n من السحوبات، ويقترب متوسطها من E[X] كلما كبر n: وهذا قانون الأعداد الكبيرة. وهو لبّ التسعير بمونتي كارلو. استخدم random.Random(seed) الخاص بك ليكون التشغيل قابلًا للتكرار ولا يربك كودًا آخر. ومع سحوب قليلة يكون المتوسط مشوّشًا؛ والخطأ يتناقص فقط كمقلوب الجذر التربيعي لـn، فمئة ضعف السحوب تمنح عشرة أضعاف الدقة فقط.
import random
die, fair = [1, 2, 3, 4, 5, 6], [1 / 6] * 6
def sample_mean(values, probs, n, seed):
rng = random.Random(seed) # private, repeatable generator
draws = rng.choices(values, weights=probs, k=n)
return sum(draws) / n
for n in (10, 1000, 100000):
print(n, round(sample_mean(die, fair, n, 1), 4))
# 10 3.1
# 1000 3.598
# 100000 3.5017 (closing in on 3.5)
print(sample_mean(die, fair, 1000, 1) == sample_mean(die, fair, 1000, 1)) # True: same seed, same answermath.isclose(sum(probs), 1.0). وارفع ValueError في ما عدا ذلك. وتذكّر أيضًا أن التوقّع متوسط طويل الأمد: فاستراتيجية ذات توقّع موجب قد تخسر مالًا في أي يوم بعينه.- التوزيع هو
valuesمعprobs(بلا سالب ومجموعها 1)؛ وE[X] = sum(v * p). E[g(X)] = sum(g(v) * p)وهو ليسg(E[X])؛ وVar = E[X^2] - E[X]^2.- متوسطات العيّنات تتقارب من
E[X](قانون الأعداد الكبيرة)؛ واستخدمrandom.Random(seed)الخاص بك.
التالي: مصفوفات NumPy وأنواع البيانات dtypes، المصفوفات السريعة المُنمَّطة التي يُبنى عليها بقية المقرر.
المختبر: ما الذي يُقيَّم
- احسب متوسط النتائج موزونًا باحتمالاتها باستخدام
expected_value25 نقطة - احسب توقّع عائد باستخدام
expected_of25 نقطة - قِس التشتت باستخدام
variance25 نقطة - قدّر التوقّع بالمحاكاة باستخدام
sample_mean25 نقطة