مسیر Quant Developer · بخش ۳: مدلهای ریاضی و Quantitative Finance · درس ۹
مبانی آمار برای Quant Developer
بازده ساده و لگاریتمی، میانگین و نوسان، قاعده جذر زمان و فرضهای پشت آن، دمهای پهن توزیع بازده، و اینکه به هر تخمین آماری چقدر میشود اعتماد کرد.
۱. از شهود به عدد
در بخش دوم با شهود جلو رفتیم: موجودی ریسک دارد (درس ۶)، کارمزد و Spread روی PnL اثر میگذارند (درس ۷) و بعضی معاملهها با طرف مطلعتر انجام میشوند (درس ۸). از این درس وارد بخش سوم میشویم و این شهودها را به مدل کمی تبدیل میکنیم.
مدلهایی که در درس ۱۱ و ۱۲ میبینیم ورودیهایی مثل نوسان (σ) میخواهند. هیچکس σ را روی صفحه صرافی نشانت نمیدهد؛ باید آن را از داده تخمین بزنی. این درس درباره همین است: چه چیزی را اندازه میگیریم، با چه فرمولی، و به عدد بهدستآمده چقدر میشود اعتماد کرد.
۲. بازده: ساده یا لگاریتمی؟
قیمت BTC امروز 100,000 و سال بعد شاید 60,000 یا 150,000 باشد؛ سطح قیمت در طول زمان ثابت نمیماند و مقایسه مستقیمش سخت است. به همین دلیل آمار را روی بازده (Return) حساب میکنیم، نه روی خود قیمت. دو تعریف رایج داریم:
فرض کن قیمت BTC یک روز از 100,000 به 110,000 برود و روز بعد به 99,000 برگردد. بازده ساده روز اول 10% و روز دوم 10% منفی است. جمعشان صفر میشود، ولی تو 1% ضرر کردهای. بازده لگاریتمی این مشکل را ندارد:
و این دقیقاً همان ln(99,000 / 100,000) است. پس:
- بازده لگاریتمی در طول زمان جمعپذیر است: بازده کل یک دوره، جمع بازدههای لگاریتمی زیردورههاست. این برای مقیاس کردن نوسان (بخش ۴) خیلی کار را ساده میکند.
- بازده ساده بین داراییها جمعپذیر است: بازده یک سبد، میانگین وزنی بازده ساده داراییهاست.
برای حرکتهای کوچک این دو تقریباً یکیاند (r ≈ R − R²/2). در مقیاس ثانیه، جایی که بازارساز معمولاً کار میکند، تفاوتشان ناچیز است؛ ولی در بازده روزانه رمزارزها که حرکت 10 درصدی کم پیش نمیآید، تفاوت جدی است.
۳. میانگین، واریانس و انحراف معیار
برای n بازده r1 تا rn:
- میانگین (Mean) مرکز توزیع بازده است.
- واریانس (Variance) میانگین مجذور فاصله از میانگین است. چون واحدش «درصد به توان دو» است، تفسیرش سخت است.
- انحراف معیار (Standard Deviation) جذر واریانس است و واحدش همان واحد بازده. در مالی به انحراف معیار بازده نوسان (Volatility) میگویند.
تقسیم بر n − 1 بهجای n به این دلیل است که μ را از همان داده تخمین زدهایم و یک درجه آزادی مصرف شده است. برای n بزرگ فرقی نمیکند.
۴. قاعده جذر زمان
اگر بازدههای روزانه مستقل از هم باشند و واریانس یکسان داشته باشند، واریانس بازده n روزه (که جمع n بازده لگاریتمی است) n برابر واریانس روزانه میشود. پس انحراف معیار با جذر زمان رشد میکند:
با نوسان روزانه فرضی 2.5%، و چون بازار رمزارز ۳۶۵ روز سال باز است:
همین قاعده برعکس هم کار میکند. نوسان 2.5% روزانه روی قیمت 100,000 یعنی 2,500 دلار در روز. یک روز 86,400 ثانیه است، پس:
یعنی در این فرضها، Mid Price در هر ثانیه بهطور معمول حدود 8.5 دلار جابهجا میشود. این عددی است که بازارساز با Spread بیستدلاری درس ۱ باید جدی بگیرد.
ولی این قاعده سه فرض دارد و هر سه در بازار واقعی ترک برمیدارند:
- استقلال: اگر بازدهها به هم وابسته باشند (Autocorrelation)، جذر زمان غلط میشود. وابستگی مثبت (روند) نوسان بلندمدت را بیشتر از پیشبینی جذر زمان میکند و وابستگی منفی کمتر. یک نمونه مهم در داده با فرکانس بالا پرش بین Bid و Ask (Bid-Ask Bounce) است: اگر قیمت آخرین معامله را بهجای Mid استفاده کنی، معاملهها بین Bid و Ask رفتوبرگشت میکنند، بازدههای پشت سر هم وابستگی منفی پیدا میکنند و نوسان کوتاهمدت بیش از واقع تخمین زده میشود. این یکی از دلایلی است که در درس ۵ گفتیم آخرین قیمت معامله لزوماً قیمت منصفانه نیست.
- واریانس ثابت: نوسان در بازار واقعی خوشهای است (Volatility Clustering)؛ دورههای آرام و پرتلاطم پشت سر هم میآیند. نوسان دیروز با نوسان هفته بعد یکی نیست.
- میانگین ناچیز: میانگین با n رشد میکند و انحراف معیار با √n. در افقهای کوتاه میانگین قابلچشمپوشی است، در افقهای بلند نه.
دقت کن که نرمال بودن توزیع جزو این فرضها نیست. جذر زمان فقط استقلال و واریانس ثابت لازم دارد. نرمال بودن موضوع بخش بعد است.
۵. توزیع بازده و دمهای پهن
راحتترین فرض این است که بازدهها از توزیع نرمال (Normal Distribution) پیروی میکنند. در این فرض، حرکت بزرگتر از ۴ انحراف معیار تقریباً هرگز رخ نمیدهد: احتمالش حدود 0.0063% است، یعنی در داده روزانه یک بار در حدود ۴۳ سال.
داده واقعی بازارها، بهخصوص رمزارزها، اینطور نیست. حرکتهای بزرگ خیلی بیشتر از پیشبینی توزیع نرمال اتفاق میافتند. به این ویژگی دم پهن (Fat Tails) میگویند. یکی از سنجههایش کشیدگی اضافه (Excess Kurtosis) است که برای توزیع نرمال صفر است:
بیا دو سری بازده مصنوعی بسازیم: یکی نرمال و یکی با توزیع t استیودنت (Student-t) با ۳ درجه آزادی که دم پهن دارد. هر دو را طوری مقیاس میکنیم که انحراف معیار واقعیشان دقیقاً 2.5% باشد:
import numpy as np
rng = np.random.default_rng(42)
n = 365 * 4 # four years of daily returns
vol = 0.025 # target daily std: 2.5%
# Normal returns vs Student-t returns (df=3), both scaled to the same std
r_norm = rng.normal(0, vol, n)
df = 3
r_t = rng.standard_t(df, n) * vol / np.sqrt(df / (df - 2))
def describe(name, r):
mu, sd = r.mean(), r.std(ddof=1)
z = (r - mu) / sd
kurt = (z ** 4).mean() - 3 # excess kurtosis (0 for normal)
big = (np.abs(z) > 4).sum() # moves larger than 4 std
se = sd / np.sqrt(len(r)) # standard error of the mean
print(f"{name:8s} mean={mu:+.4%} std={sd:.3%} "
f"ann_vol={sd*np.sqrt(365):.1%} kurt={kurt:5.1f} "
f">4sd={big:3d} worst={r.min():.1%} SE(mean)={se:.3%}")
describe("normal", r_norm)
describe("t(df=3)", r_t)
# Expected count of >4 std moves under a true normal distribution
p4 = 6.334e-5 # P(|Z| > 4) for a standard normal
print(f"expected >4sd under normal: {n * p4:.2f}")
# How stable is the volatility estimate? One estimate per year.
for name, r in [("normal", r_norm), ("t(df=3)", r_t)]:
yearly = r.reshape(4, 365).std(axis=1, ddof=1)
print(name, " ".join(f"{s:.2%}" for s in yearly))
خروجی:
normal mean=-0.0390% std=2.500% ann_vol=47.8% kurt= 0.0 >4sd= 0 worst=-9.1% SE(mean)=0.065%
t(df=3) mean=-0.0292% std=2.192% ann_vol=41.9% kurt= 4.1 >4sd= 8 worst=-12.5% SE(mean)=0.057%
expected >4sd under normal: 0.09
normal 2.35% 2.56% 2.45% 2.64%
t(df=3) 2.34% 2.06% 2.20% 2.16%
چند نکته از همین خروجی:
- حرکتهای بزرگ: در سری نرمال هیچ روزی بیش از ۴ انحراف معیار حرکت نکرده، که با انتظار 0.09 بار جور است. در سری t، هشت روز اینطور بوده و بدترین روز 12.5% ریزش داشته است. اگر مدل ریسکت نرمال باشد، این روزها را «غیرممکن» میبیند.
- انحراف معیار کمتر از واقعیت: انحراف معیار واقعی هر دو سری 2.5% است، ولی تخمین سری t شده 2.19% و تخمین هر چهار سالش هم زیر 2.5% است. در توزیع دمپهن، بخش بزرگی از واریانس از چند روز نادر میآید. اگر پنجره دادهات آن روزها را نداشته باشد، ریسک را کمتر از واقع میبینی؛ و پنجرههای آرام دقیقاً همانهایی هستند که این روزها را ندارند.
- کشیدگی هم ناپایدار است: کشیدگی نظری t با ۳ درجه آزادی بینهایت است، ولی نمونه ما عدد 4.1 داده است. سنجههایی که به توانهای بالای بازده وابستهاند، در داده دمپهن بهشدت به چند نقطه بزرگ حساساند.
۶. هر تخمین خطا دارد: Standard Error
عدد mean در خروجی بالا 0.039% منفی است. یعنی BTC مصنوعی ما روند نزولی دارد؟ نه؛ میانگین واقعی را صفر گذاشته بودیم. این عدد فقط نویز نمونه است.
برای اینکه بفهمی یک تخمین چقدر دقیق است، خطای استاندارد (Standard Error) را حساب کن؛ یعنی اگر همین آزمایش را با داده تازه تکرار کنی، تخمین بهطور معمول چقدر جابهجا میشود:
با σ برابر 2.5% و n برابر 1,460 روز، خطای استاندارد میانگین 0.065% است. قاعده سرانگشتی: اگر تخمین کمتر از حدود دو برابر SE از صفر فاصله دارد، دادهات نمیتواند آن را از صفر تشخیص دهد. 0.039% خیلی کمتر از 0.13% است، پس هیچ نتیجهای درباره روند نمیشود گرفت.
حالا سؤال برعکس: اگر میانگین واقعی بازده روزانه 0.05% باشد، چند روز داده لازم است تا با فاصله دو SE از صفر دیده شود؟ باید σ / √n به 0.025% برسد:
تخمین میانگین بازده تقریباً ناامیدکننده است. تخمین نوسان خیلی بهتر است: برای داده نرمال، خطای نسبی تخمین σ حدود 1 / √(2n) است که برای چهار سال داده حدود 1.9% میشود. (برای داده دمپهن، همانطور که دیدیم، بدتر.) به همین دلیل مدلهای بازارسازی روی نوسان ساخته میشوند و نه روی پیشبینی جهت بلندمدت قیمت.
۷. تمرین این درس
درس بعدی
در درس دهم سراغ Regression و Time Series میرویم: با رگرسیون خطی بررسی میکنیم آیا عدمتوازن دفتر سفارش حرکت بعدی Mid Price را پیشبینی میکند، R² و p-value را به زبان ساده تفسیر میکنیم، و میبینیم وابستگی زمانی و ایستایی چطور میتوانند نتیجه یک رگرسیون را کاملاً گمراهکننده کنند.
این مطلب صرفاً آموزشی است و توصیه خرید، فروش یا سرمایهگذاری نیست.