© Bản quyền thuộc về Quantopian Inc.
© Bản quyền sửa đổi thuộc về AI Cafe¹
Giấy phép Creative Commons Attribution 4.0.
Khuyến cáo
¶
Biến ngẫu nhiên rời rạc và liên tục¶
by Maxwell Margenot, revisions by Delaney Granizo Mackenzie
Edited by AI Cafe¹
Biến ngẫu nhiên là biến có giá trị phụ thuộc vào xác suất. Khi thảo luận về biến ngẫu nhiên, chúng ta thường mô tả chúng theo các phân phối xác suất. Điều này có nghĩa là xác suất mà mỗi giá trị có thể xuất hiện từ biến ngẫu nhiên. Ví dụ cổ điển của điều này là xúc xắc, có thể tạo ra các giá trị từ 1 đến 6 với xác suất đồng đều.
Chúng ta thường phân loại biến ngẫu nhiên thành hai loại khác nhau:
- Biến ngẫu nhiên rời rạc
- Biến ngẫu nhiên liên tục
Cách xử lý mỗi loại này khác nhau, nhưng các nguyên tắc cơ bản vẫn giữ nguyên. Chúng ta có thể dễ dàng thấy cách mô hình hóa biến ngẫu nhiên có thể hữu ích khi xử lý tài chính; tài sản tài chính thường được biểu diễn là chuyển động theo các mẫu xác định và ngẫu nhiên, với các mẫu ngẫu nhiên được biểu diễn bằng biến ngẫu nhiên. Để làm điều này, chúng ta sẽ "lấy mẫu" từ biến ngẫu nhiên tại mỗi bước thời gian, sau đó di chuyển công cụ tài chính theo mức đó. Phân tích này được sử dụng vì nhiều chuyển động trong tài sản không thể giải thích bằng các mô hình xác định.
Mỗi biến ngẫu nhiên theo một phân phối xác suất, là một hàm mô tả nó. Phân phối xác suất gán xác suất cho tất cả các giá trị có thể của một biến ngẫu nhiên. Đối với một biến ngẫu nhiên $X$, chúng ta biểu diễn xác suất rằng $X$ bằng một giá trị $x$ là $P(X = x)$. Đối với các biến ngẫu nhiên rời rạc, chúng ta có thể biểu diễn $p(x) = P(X = x)$ một cách ngắn gọn. Điều này cũng được biết đến là hàm khối xác suất (PMF). Đối với các biến ngẫu nhiên liên tục, chúng ta không thể sử dụng PMF, như sẽ đề cập sau, vì vậy chúng ta phải sử dụng một hàm mật độ xác suất (PDF). Các phân phối xác suất tạo thành cơ sở cho các mô hình định giá Black-Scholes và nhị phân cũng như CAPM. Sự hiểu biết về chúng cũng cần thiết để thực hiện các mô phỏng Monte Carlo.
Đối với mỗi hàm phân phối xác suất, chúng ta cũng có một hàm phân phối tích lũy (CDF). Điều này được định nghĩa là $P(X \leq x)$, xác suất rằng biến ngẫu nhiên nhỏ hơn hoặc bằng một giá trị cụ thể. Cách viết tắt cho CDF là $F(x) = P(X \leq x)$. Để tìm $F(x)$ trong trường hợp rời rạc, chúng ta cộng tổng các giá trị của PMF cho tất cả các kết quả nhỏ hơn hoặc bằng $x$. Trong trường hợp liên tục, chúng ta sử dụng phép tính để tích phân PDF qua tất cả các giá trị đến $x$.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.stats as stats
from statsmodels.stats import stattools
Biến Ngẫu Nhiên Rời Rạc¶
Một biến ngẫu nhiên rời rạc là một biến có số kết quả có thể đếm được. Mỗi kết quả này có một xác suất riêng liên quan đến nó. Xem xét việc tung đồng xu hoặc lăn xúc xắc, một trong những biến ngẫu nhiên phân phối đều cơ bản nhất. Đối với việc tung đồng xu, có hai kết quả có thể xảy ra, hoặc là mặt sấp hoặc mặt ngửa, mỗi mặt có xác suất là $1/2$. Các biến ngẫu nhiên rời rạc không phải lúc nào cũng có trọng số bằng nhau cho tất cả các kết quả. Đơn vị cơ bản của một biến ngẫu nhiên rời rạc là hàm khối xác suất (PMF), một tên khác cho hàm xác suất $p(x)$. PMF, hay hàm xác suất, cung cấp một xác suất, một khối lượng, cho mỗi điểm trong miền của phân phối xác suất. Một hàm xác suất có hai thuộc tính chính:
- $0 \leq p(x) \leq 1$ vì tất cả các xác suất nằm trong khoảng $[0, 1]$
- Tổng của tất cả các xác suất $p(x)$ trên tất cả các giá trị của X phải bằng $1$. Tổng trọng số cho tất cả các giá trị của biến ngẫu nhiên phải cộng lại thành $1$.
Ở đây, chúng ta sẽ xem xét một số ví dụ về các phân phối xác suất rời rạc phổ biến nhất.
class DiscreteRandomVariable:
def __init__(self, a=0, b=1):
self.variableType = ""
self.low = a
self.high = b
return
def draw(self, numberOfSamples):
samples = np.random.randint(self.low, self.high, numberOfSamples)
return samples
Phân phối Đồng đều¶
Loại phân phối xác suất cơ bản nhất là phân phối đồng đều. Với phân phối đồng đều rời rạc, tất cả các kết quả đều được gán trọng số như nhau. Lấy ví dụ về việc tung một con xúc xắc. Nó có sáu mặt, được đánh số từ $1$ đến $6$, mỗi mặt đều có xác suất xảy ra là $1/6$. Với điều này, chúng ta biết rằng hàm phân phối xác suất (PMF) phải là $p(x) = 1/6$ cho tất cả các giá trị của biến ngẫu nhiên đồng đều $X$.
DieRolls = DiscreteRandomVariable(1, 6)
plt.hist(DieRolls.draw(10), bins=[1,2,3,4,5,6,7], align='mid')
plt.xlabel('Value')
plt.ylabel('Occurences')
plt.legend(['Die Rolls']);
Mỗi lần chúng ta tung xúc xắc, chúng ta có cơ hội bằng nhau để nhận được mỗi mặt. Trong ngắn hạn, điều này có vẻ không đồng đều, nhưng nếu chúng ta lấy nhiều mẫu, rõ ràng mỗi mặt sẽ xuất hiện với cùng một tỷ lệ trong số lần tung.
plt.hist(DieRolls.draw(10000), bins=[1,2,3,4,5,6,7], align='mid')
plt.xlabel('Value')
plt.ylabel('Occurences')
plt.legend(['Die Rolls']);
Với việc tung xúc sắc, chúng ta có thể dễ dàng thấy rằng $p(x) = 1/6$ cho tất cả các giá trị của biến ngẫu nhiên $X$. Hãy xem xét các khả năng cho tất cả các giá trị của cả hàm xác suất và hàm phân phối tích lũy:
Value: $X = x$ | PMF: $p(x) = P(X = x)$ | CDF: $F(x) = P(X \leq x)$ | --- | --- | --- | 1 | $1/6$ | $1/6$ 2 | $1/6$ | $1/3$ 3 | $1/6$ | $1/2$ 4 | $1/6$ | $2/3$ 5 | $1/6$ | $5/6$ 6 | $1/6$ | $1$
Sử dụng bảng này, chúng ta có thể dễ dàng thấy rằng hàm xác suất thỏa mãn các điều kiện cần thiết. Mỗi giá trị của hàm xác suất nằm trong khoảng $[0,1]$, thỏa mãn điều kiện đầu tiên. Điều kiện thứ hai cũng được thỏa mãn vì tất cả các giá trị của $p(x)$ cộng lại bằng $1$, như được chứng minh trong hàm phân phối tích lũy. Điều này thể hiện hai tính chất của hàm phân phối tích lũy:
- CDF nằm giữa $0$ và $1$ cho mọi giá trị của $x$. Điều này tương đồng với giá trị của hàm phân phối xác suất.
- CDF không giảm theo $x$. Điều này có nghĩa là khi $x$ tăng lên, CDF sẽ tăng lên hoặc giữ nguyên.
Khi cố gắng lấy mẫu từ các phân phối xác suất khác, chúng ta có thể sử dụng sự kết hợp của phân phối đồng nhất với một số hàm nhất định để có được các mẫu phù hợp. Tuy nhiên, phương pháp này có thể rất kém hiệu quả. Do đó, chúng ta sẽ sử dụng các hàm có sẵn trong NumPy cho mỗi phân phối để đơn giản hóa vấn đề.
Phân phối Nhị thức¶
Phân phối nhị thức được sử dụng để mô tả các thành công và thất bại. Điều này có thể rất hữu ích trong bối cảnh đầu tư vì nhiều lựa chọn của chúng ta có xu hướng mang tính nhị phân như vậy. Khi chúng ta thực hiện một thử nghiệm thành công/thất bại đơn lẻ, chúng ta gọi đó là thử nghiệm Bernoulli. Với biến ngẫu nhiên Bernoulli, chúng ta có hai kết quả có thể xảy ra:
$$p(1) = P(Y = 1) = p \ \ \ \ \ \ \ p(0) = P(Y = 0) = 1-p$$
Chúng ta coi $Y$ nhận giá trị $1$ là một thành công, vì vậy xác suất của một thành công xảy ra trong một thử nghiệm đơn lẻ là $p$.
Phân phối nhị thức lấy một tập hợp $n$ thử nghiệm Bernoulli. Do đó, chúng ta có thể có từ $0$ đến $n$ thành công. Mỗi thử nghiệm có xác suất thành công giống nhau, $p$, và tất cả các thử nghiệm đều độc lập với nhau. Chúng ta có thể mô tả toàn bộ biến ngẫu nhiên nhị thức chỉ bằng $n$ và $p$, được ký hiệu bằng ký hiệu $X$ ~ $B(n, p)$. Điều này nói rằng $X$ là một biến ngẫu nhiên nhị thức với các tham số $n$ và $p$.
Để định nghĩa hàm xác suất của một biến ngẫu nhiên nhị thức, chúng ta phải có khả năng chọn một số thành công nào đó trong tổng số thử nghiệm. Ý tưởng này dễ dàng liên quan đến ý tưởng tổ hợp trong tổ hợp học. Một tổ hợp mô tả tất cả các cách có thể để chọn các mục từ một tập hợp sao cho thứ tự không quan trọng. Ví dụ, nếu chúng ta có $6$ đôi tất và muốn chọn $2$ trong số đó, chúng ta sẽ viết tổng số tổ hợp có thể là $\binom{6}{2}$. Điều này được mở rộng như sau:
$$ \binom{6}{2} = \frac{6!}{4! \ 2!} = 15 $$
Ở đây, ký hiệu $!$ biểu thị giai thừa và $n! = (n)(n-1)(n-2)\ldots (1)$. Để viết công thức cho sự kết hợp một cách tổng quát hơn, chúng ta viết:
$$ \binom{n}{x} = \frac{n!}{(n-x)! \ x!} $$
Chúng ta sử dụng ký hiệu này để chọn các thành công với biến ngẫu nhiên nhị thức của chúng ta. Sự kết hợp phục vụ mục đích tính toán có bao nhiêu cách khác nhau để đạt được cùng một kết quả. Hàm xác suất là:
$$ p(x) = P(X = x) = \binom{n}{x}p^x(1-p)^{n-x} = \frac{n!}{(n-x)! \ x!} p^x(1-p)^{n-x} $$
Với $X$ là một biến ngẫu nhiên nhị thức với phân phối $B(n, p)$.
class BinomialRandomVariable(DiscreteRandomVariable):
def __init__(self, numberOfTrials=10, probabilityOfSuccess=0.5):
self.variableType = "Binomial"
self.numberOfTrials = numberOfTrials
self.probabilityOfSuccess = probabilityOfSuccess
return
def draw(self, numberOfSamples):
samples = np.random.binomial(self.numberOfTrials, self.probabilityOfSuccess, numberOfSamples)
return samples
Lấy ví dụ về giá cổ phiếu di chuyển lên hoặc xuống, mỗi trường hợp đều có xác suất $p = 0.5$. Chúng ta có thể coi một lần tăng, hay $U$, là một thành công và một lần giảm, hay $D$, là một thất bại. Với điều này, chúng ta có thể phân tích xác suất của từng sự kiện bằng cách sử dụng biến ngẫu nhiên nhị thức. Chúng ta cũng sẽ xem xét giá trị $n$ là $5$ cho $5$ quan sát về giá cổ phiếu theo thời gian. Bảng dưới đây cho thấy xác suất của từng sự kiện:
Number of Up moves, $x$ | Ways of reaching $x$ Up moves $\binom{n}{x}$ | Independent Trials with $p = 0.50$ | $p(x)$ Value | CDF: $F(x) = P(X \leq x)$ | --- | --- | --- | --- | --- | $0$ | $1$ | $0.50^0 (1 - 0.50)^5 = 0.03125$ | $0.03125$ | $0.03125$ $1$ | $5$ | $0.50^1 (1 - 0.50)^4 = 0.03125$ | $0.15635$ | $0.18750$ $2$ | $10$ | $0.50^2 (1 - 0.50)^3 = 0.03125$ | $0.31250$ | $0.50000$ $3$ | $10$ | $0.50^3 (1 - 0.50)^2 = 0.03125$ | $0.31250$ | $0.81250$ $4$ | $5$ | $0.50^4 (1 - 0.50)^1 = 0.03125$ | $0.15635$ | $0.96875$ $5$ | $1$ | $0.50^5 (1 - 0.50)^0 = 0.03125$ | $0.03125$ | $1.00000$
Ở đây, chúng ta thấy rằng trong trường hợp cụ thể khi $p = 0.50$, phân phối nhị thức là đối xứng. Bởi vì chúng ta có xác suất bằng nhau cho cả chuyển động lên và chuyển động xuống, yếu tố phân biệt duy nhất giữa các xác suất cuối cùng trở thành khía cạnh tổ hợp của hàm xác suất, mà chính nó là đối xứng. Nếu chúng ta thay đổi một chút giá trị của $p$, chúng ta sẽ có một phân phối không đối xứng.
Bây giờ, chúng ta sẽ vẽ một số mẫu cho các tham số trên, nơi $X$ ~ $B(5, 0.50)$:
StockProbabilities = BinomialRandomVariable(5, 0.50)
plt.hist(StockProbabilities.draw(50), bins=[0, 1, 2, 3, 4, 5, 6], align='left')
plt.xlabel('Value')
plt.ylabel('Occurences')
plt.legend(['Die Rolls']);
Một lần nữa, như trong tất cả các trường hợp lấy mẫu, càng nhiều mẫu bạn lấy, kết quả của bạn càng gần với phân phối hơn:
plt.hist(StockProbabilities.draw(10000), bins=[0, 1, 2, 3, 4, 5, 6], align='left')
plt.xlabel('Value')
plt.ylabel('Occurences');
Chúng ta đã thay đổi các tham số của mình sao cho $p = 0.25$. Điều này khiến cho $P(X = 0) = 0.23730$, làm cho phân phối của chúng ta lệch nhiều hơn về phía các giá trị thấp. Chúng ta có thể dễ dàng thấy điều này trong đồ thị sau:
StockProbabilities = BinomialRandomVariable(5, 0.25)
plt.hist(StockProbabilities.draw(10000), bins=[0, 1, 2, 3, 4, 5, 6], align='left')
plt.xlabel('Value')
plt.ylabel('Occurences');
Việc thay đổi giá trị của $p$ từ $0.50$ xuống $0.25$ rõ ràng khiến phân phối của chúng ta trở nên không đối xứng. Chúng ta có thể mở rộng ý tưởng này về việc giá cổ phiếu di chuyển theo một biến ngẫu nhiên nhị thức vào một khuôn khổ mà chúng ta gọi là Mô Hình Nhị Thức về Sự Di Chuyển của Giá Cổ Phiếu. Đây được sử dụng như một trong những nền tảng cho việc định giá quyền chọn. Trong Mô Hình Nhị Thức, giả định rằng trong bất kỳ khoảng thời gian nào, giá cổ phiếu có thể di chuyển lên hoặc xuống với một giá trị được xác định bởi xác suất tăng hoặc giảm. Điều này biến giá cổ phiếu thành một hàm của một biến ngẫu nhiên nhị thức, độ lớn của sự di chuyển lên hoặc xuống, và giá cổ phiếu ban đầu. Chúng ta có thể thay đổi những tham số này để gần gũi hơn với các phân phối giá cổ phiếu khác nhau.
Biến ngẫu nhiên liên tục¶
Biến ngẫu nhiên liên tục khác với biến ngẫu nhiên rời rạc ở chỗ biến liên tục có thể nhận vô số kết quả. Chúng không thể được đếm hoặc mô tả dưới dạng danh sách. Do đó, việc gán xác suất cho từng kết quả là vô nghĩa. Bởi vì có vô số kết quả, xác suất để đạt được bất kỳ kết quả cá nhân nào là 0.
Chúng ta có thể giải quyết vấn đề này bằng cách thay vào đó tính xác suất cho các khoảng kết quả. Điều này được quản lý thông qua việc sử dụng phép tính, mặc dù để sử dụng các kỹ thuật lấy mẫu của chúng ta ở đây, chúng ta thực sự không cần phải sử dụng bất kỳ điều nào. Đối với một biến ngẫu nhiên liên tục, $P(X = 0)$ là vô nghĩa. Thay vào đó, chúng ta sẽ tìm kiếm một cái gì đó giống như $P(-1 < X < 1)$. Đối với các biến ngẫu nhiên liên tục, thay vì sử dụng hàm PMF, chúng ta định nghĩa một hàm mật độ xác suất (PDF), $f_X(x)$, để chúng ta có thể nói rằng: $$P(a < X < b) = \int_a^b f_X(x)dx$$
Tương tự như yêu cầu của chúng ta đối với phân phối rời rạc rằng tất cả xác suất cộng lại bằng $1$, ở đây chúng ta yêu cầu rằng:
- $f_X(x) \geq 0$ cho tất cả các giá trị của $X$
- $P(-\infty < X < \infty) = \int_{-\infty}^{\infty} f_X(x) dx = 1$
Cần lưu ý rằng vì xác suất tại một điểm cá nhân với phân phối liên tục là $0$, nên xác suất ở các điểm biên của một khoảng cũng là $0$. Do đó, $P(a \leq X \leq b) = P(a < X \leq b) = P(a \leq X < b) = P(a < X < b)$. Nếu chúng ta tích phân PDF qua tất cả các khả năng, trên toàn bộ khoảng có thể, giá trị nên là $1$.
class ContinuousRandomVariable:
def __init__(self, a=0, b=1):
self.variableType = ""
self.low = a
self.high = b
return
def draw(self, numberOfSamples):
samples = np.random.uniform(self.low, self.high, numberOfSamples)
return samples
Phân phối đồng nhất¶
Phân phối đồng nhất cũng có thể được định nghĩa trong khuôn khổ của một biến ngẫu nhiên liên tục. Chúng ta lấy $a$ và $b$ là các hằng số, trong đó $b$ là giá trị cao nhất có thể và $a$ là giá trị thấp nhất có thể mà kết quả có thể đạt được. Sau đó, hàm mật độ xác suất (PDF) của một biến ngẫu nhiên đồng nhất là:
$$f(x) = \begin{cases}\frac{1}{b - a} & \text{nếu $a < x < b$} \\ 0 & \text{ngược lại}\end{cases}$$
Vì hàm này được định nghĩa trên một khoảng liên tục, PDF bao phủ tất cả các giá trị giữa $a$ và $b$. Dưới đây là một đồ thị của PDF (bạn có thể thay đổi giá trị của $a$ và $b$ tùy ý):
a = 0.0
b = 8.0
x = np.linspace(a, b, 100)
y = [1/(b-a) for i in x]
plt.plot(x, y)
plt.xlabel('Value')
plt.ylabel('Probability');
Giống như trong trường hợp phân phối đồng nhất rời rạc, hàm mật độ xác suất (PDF) của phân phối đồng nhất liên tục là không đổi cho tất cả các giá trị mà biến có thể nhận. Sự khác biệt duy nhất ở đây là chúng ta không thể lấy xác suất cho bất kỳ điểm cá nhân nào. Hàm phân phối tích lũy (CDF), mà chúng ta có được từ việc tích phân PDF, là:
$$ F(x) = \begin{cases} 0 & \text{đối với $x \leq a$} \\ \frac{x - a}{b - a} & \text{đối với $a < x < b$} \\ 1 & \text{đối với $x \geq b$}\end{cases}$$
Và được vẽ trên cùng một khoảng như PDF như sau:
y = [(i - a)/(b - a) for i in x]
plt.plot(x, y)
plt.xlabel('Value')
plt.ylabel('Probability');
Phân phối chuẩn¶
Phân phối chuẩn là một phân phối rất phổ biến và quan trọng trong thống kê. Nhiều bài kiểm định và phương pháp quan trọng trong thống kê, và do đó, trong tài chính, dựa trên giả định về tính chuẩn. Một phần lớn điều này là nhờ vào kết quả của Định lý giới hạn trung tâm (CLT), cho rằng các mẫu đủ lớn của các thử nghiệm độc lập sẽ được phân phối theo phân phối chuẩn. Sự tiện lợi của phân phối chuẩn cũng tìm thấy ứng dụng trong một số chiến lược giao dịch thuật toán. Ví dụ, như đã đề cập trong tài liệu bài giảng giao dịch cặp (pair trading), chúng ta có thể tìm kiếm các cặp cổ phiếu có tính đồng liên kết và đặt cược vào hướng thay đổi của chênh lệch giữa chúng dựa trên phân phối chuẩn.
class NormalRandomVariable(ContinuousRandomVariable):
def __init__(self, mean=0, variance=1):
ContinuousRandomVariable.__init__(self)
self.variableType = "Normal"
self.mean = mean
self.standardDeviation = np.sqrt(variance)
return
def draw(self, numberOfSamples):
samples = np.random.normal(self.mean, self.standardDeviation, numberOfSamples)
return samples
Khi mô tả một biến ngẫu nhiên phân phối chuẩn, chúng ta chỉ cần biết giá trị trung bình ($\mu$) và phương sai ($\sigma^2$, trong đó $\sigma$ là độ lệch chuẩn). Chúng ta ký hiệu một biến ngẫu nhiên $X$ là biến ngẫu nhiên phân phối chuẩn bằng cách nói rằng $X$ ~ $N(\mu, \sigma^2)$. Trong lý thuyết danh mục đầu tư hiện đại, lợi nhuận của cổ phiếu thường được giả định theo phân phối chuẩn. Một đặc điểm chính của biến ngẫu nhiên phân phối chuẩn là một tổ hợp tuyến tính của hai hoặc nhiều biến ngẫu nhiên phân phối chuẩn sẽ tạo thành một biến ngẫu nhiên phân phối chuẩn khác. Điều này rất hữu ích khi xem xét lợi nhuận trung bình và phương sai của một danh mục đầu tư gồm nhiều cổ phiếu. Đến thời điểm này, chúng ta chỉ xem xét phân phối xác suất một biến, hay phân phối đơn biến. Khi chúng ta muốn mô tả nhiều biến ngẫu nhiên cùng một lúc, như trong trường hợp quan sát nhiều cổ phiếu, chúng ta có thể xem xét phân phối đa biến. Một phân phối chuẩn đa biến được mô tả hoàn toàn bởi các giá trị trung bình của từng biến, phương sai của chúng, và các tương quan riêng biệt giữa từng cặp biến. Điều này rất quan trọng khi xác định các đặc điểm của danh mục đầu tư vì phương sai của danh mục đầu tư tổng thể phụ thuộc vào cả phương sai của các chứng khoán và các tương quan giữa chúng.
Hàm mật độ xác suất (PDF) của một biến ngẫu nhiên phân phối chuẩn là:
$$ f(x) = \frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{(x - \mu)^2}{2\sigma^2}} $$
Và được định nghĩa cho $-\infty < x < \infty$. Khi chúng ta có $\mu = 0$ và $\sigma = 1$, chúng ta gọi đây là phân phối chuẩn chuẩn.
mu_1 = 0
mu_2 = 0
sigma_1 = 1
sigma_2 = 2
x = np.linspace(-8, 8, 200)
y = (1/(sigma_1 * np.sqrt(2 * 3.14159))) * np.exp(-(x - mu_1)*(x - mu_1) / (2 * sigma_1 * sigma_1))
z = (1/(sigma_2 * np.sqrt(2 * 3.14159))) * np.exp(-(x - mu_2)*(x - mu_2) / (2 * sigma_2 * sigma_2))
plt.plot(x, y, x, z)
plt.xlabel('Value')
plt.ylabel('Probability');
Bằng cách thay đổi giá trị trung bình và độ lệch chuẩn của phân phối chuẩn, chúng ta có thể thay đổi độ sâu và độ rộng của đường cong hình chuông. Với độ lệch chuẩn lớn hơn, các giá trị của phân phối sẽ ít tập trung xung quanh giá trị trung bình.
Thay vì sử dụng phân phối chuẩn để mô hình hóa giá cổ phiếu, chúng ta sử dụng nó để mô hình hóa lợi suất. Giá cổ phiếu không thể xuống dưới $0$ trong khi phân phối chuẩn có thể nhận tất cả các giá trị trên đường thực, làm cho nó phù hợp hơn với lợi suất. Dựa trên giá trị trung bình và phương sai của một phân phối chuẩn, chúng ta có thể đưa ra các tuyên bố sau:
- Khoảng $68\%$ tổng số quan sát nằm trong một độ lệch chuẩn xung quanh giá trị trung bình ($\mu \pm \sigma$)
- Khoảng $95\%$ tổng số quan sát nằm trong hai độ lệch chuẩn xung quanh giá trị trung bình ($\mu \pm 2\sigma$)
- Khoảng $99\%$ tổng số quan sát nằm trong ba độ lệch chuẩn xung quanh giá trị trung bình ($\mu \pm 3\sigma$)
Những giá trị này rất quan trọng để hiểu các khoảng tin cậy liên quan đến phân phối chuẩn. Khi xem xét giá trị trung bình và phương sai của một phân phối mẫu, chúng ta thường xem xét các khoảng tin cậy khác nhau xung quanh giá trị trung bình.
Sử dụng định lý giới hạn trung tâm, chúng ta có thể chuẩn hóa các biến ngẫu nhiên khác nhau để chúng trở thành các biến ngẫu nhiên chuẩn. Một công cụ rất phổ biến trong thống kê là bảng xác suất chuẩn, được sử dụng để tra cứu các giá trị của CDF chuẩn cho các giá trị $x$ nhất định. Bằng cách chuyển đổi các biến ngẫu nhiên thành biến ngẫu nhiên chuẩn, chúng ta có thể dễ dàng kiểm tra các bảng này để tìm giá trị xác suất. Chúng ta chuẩn hóa một biến ngẫu nhiên $X$ bằng cách trừ giá trị trung bình và chia cho phương sai, dẫn đến biến ngẫu nhiên chuẩn $Z$.
$$ Z = \frac{X - \mu}{\sigma} $$
Hãy xem xét trường hợp mà $X$ ~ $B(n, p)$ là một biến ngẫu nhiên nhị phân. Trong trường hợp của một biến ngẫu nhiên nhị phân, giá trị trung bình là $\mu = np$ và phương sai là $\sigma^2 = np(1 - p)$.
n = 50
p = 0.25
X = BinomialRandomVariable(n, p)
X_samples = X.draw(10000)
Z_samples = (X_samples - n * p) / np.sqrt(n * p * (1 - p))
plt.hist(X_samples, bins=range(0, n + 2), align='left')
plt.xlabel('Value')
plt.ylabel('Probability');
plt.hist(Z_samples, bins=20)
plt.xlabel('Value')
plt.ylabel('Probability');
Ý tưởng rằng chúng ta có thể chuẩn hóa các biến ngẫu nhiên là rất quan trọng. Bằng cách chuyển đổi một biến ngẫu nhiên sang một phân phối mà chúng ta quen thuộc hơn, phân phối chuẩn chuẩn, chúng ta có thể dễ dàng trả lời bất kỳ câu hỏi xác suất nào mà chúng ta có về biến gốc. Tuy nhiên, điều này phụ thuộc vào việc có đủ kích thước mẫu lớn.
Giả sử rằng lợi nhuận từ cổ phiếu được phân phối theo phân phối chuẩn. Giả sử rằng $Y$ là giá của một cổ phiếu. Chúng ta sẽ mô phỏng lợi nhuận của nó và vẽ đồ thị.
Y_initial = 100
X = NormalRandomVariable(0, 1)
Y_returns = X.draw(100) # generate 100 daily returns
Y = pd.Series(np.cumsum(Y_returns), name = 'Y') + Y_initial
Y.plot()
plt.xlabel('Time')
plt.ylabel('Value');
Chúng ta có một cổ phiếu khác, $Z$, và chúng ta có một danh mục đầu tư gồm $Y$ và $Z$, gọi là $W$.
Z_initial = 50
Z_returns = X.draw(100)
Z = pd.Series(np.cumsum(Z_returns), name='Z') + Z_initial
Z.plot()
plt.xlabel('Time')
plt.ylabel('Value');
Chúng ta xây dựng $W$ bằng cách lấy trung bình có trọng số của $Y$ và $Z$ dựa trên số lượng của chúng.
Y_quantity = 20
Z_quantity = 50
Y_weight = Y_quantity/(Y_quantity + Z_quantity)
Z_weight = 1 - Y_weight
W_initial = Y_weight * Y_initial + Z_weight * Z_initial
W_returns = Y_weight * Y_returns + Z_weight * Z_returns
W = pd.Series(np.cumsum(W_returns), name='Portfolio') + W_initial
W.plot()
plt.xlabel('Time')
plt.ylabel('Value');
pd.concat([Y, Z, W], axis=1).plot()
plt.xlabel('Time')
plt.ylabel('Value');
Lưu ý rằng lợi nhuận của danh mục đầu tư của chúng ta, $W$, cũng được phân phối theo phân phối chuẩn.
plt.hist(W_returns);
plt.xlabel('Return')
plt.ylabel('Occurrences');
Phân phối chuẩn được sử dụng rất phổ biến trong tài chính, đặc biệt là trong lý thuyết rủi ro và danh mục đầu tư. Có rất nhiều tài liệu được tìm thấy sử dụng phân phối chuẩn cho các mục đích từ phân tích rủi ro đến mô hình hóa giá cổ phiếu.
Tìm phân phối phù hợp¶
Bây giờ chúng ta sẽ cố gắng tìm một phân phối xác suất phù hợp với lợi suất của một cổ phiếu. Chúng ta sẽ lấy lợi suất của BID và cố gắng phù hợp một phân phối chuẩn với chúng. Điều đầu tiên cần kiểm tra là liệu lợi suất thực sự có thể hiện các đặc tính của một phân phối chuẩn hay không. Để làm điều này, chúng ta sẽ sử dụng kiểm định Jarque-Bera, cái mà chỉ ra sự không chuẩn nếu giá trị p thấp hơn một ngưỡng nhất định.
# Cài thư viện lấy dữ liệu miễn phí
!curl -fsSLO https://raw.githubusercontent.com/algo-stocks/data/master/data.py
from data import get_prices
def sharpe_ratio(asset, riskfree=0):
return np.mean(asset - riskfree)/np.std(asset - riskfree)
start = '2022-01-01'
end = '2025-01-01'
prices = get_prices('BID', start_date=start, end_date=end).BID
# Take the daily returns
returns = prices.pct_change()[1:]
#Set a cutoff
cutoff = 0.01
# Get the p-value of the JB test
_, p_value, skewness, kurtosis = stattools.jarque_bera(returns)
print("The JB test p-value is:", p_value)
print("We reject the hypothesis that the data are normally distributed:", p_value < cutoff)
print("The skewness of the returns is:", skewness)
print("The kurtosis of the returns is:", kurtosis)
plt.hist(returns, bins=20)
plt.xlabel('Value')
plt.ylabel('Occurrences');
The JB test p-value is: 2.5322403145608086e-37 We reject the hypothesis that the data are normally distributed: True The skewness of the returns is: 0.01929429687924076 The kurtosis of the returns is: 5.326634610141621
Giá trị p thấp của bài kiểm tra JB khiến chúng ta bác bỏ giả thuyết không rằng các khoản lợi nhuận được phân phối theo phân phối chuẩn. Điều này là do độ nhọn cao (các phân phối chuẩn có độ nhọn bằng $3$).
Chúng ta sẽ tiếp tục từ đây với giả định rằng các khoản lợi nhuận được phân phối theo phân phối chuẩn để có thể thực hiện các bước điều chỉnh phân phối. Tiếp theo, chúng ta sẽ tính giá trị trung bình mẫu và độ lệch chuẩn của chuỗi dữ liệu.
# Take the sample mean and standard deviation of the returns
sample_mean = np.mean(returns)
sample_std_dev = np.std(returns)
Bây giờ hãy xem cách mà một đường cong lý thuyết phù hợp với các giá trị thực tế.
x = np.linspace(-(sample_mean + 4 * sample_std_dev), (sample_mean + 4 * sample_std_dev), len(returns))
sample_distribution = ((1/np.sqrt(sample_std_dev * sample_std_dev * 2 * np.pi)) *
np.exp(-(x - sample_mean)*(x - sample_mean) / (2 * sample_std_dev * sample_std_dev)))
plt.hist(returns, bins=20, density=True);
plt.plot(x, sample_distribution)
plt.xlabel('Value')
plt.ylabel('Occurrences');
Đường lý thuyết của chúng ta về lợi nhuận có đỉnh thấp hơn đáng kể so với các giá trị thực tế, điều này có lý do vì lợi nhuận không thực sự phân phối theo phân phối chuẩn. Điều này lại liên quan đến độ nhọn (kurtosis) của phân phối chuẩn. Lợi nhuận có giá trị độ nhọn khoảng $5.3$, trong khi độ nhọn của phân phối chuẩn là $3$. Độ nhọn cao hơn dẫn đến đỉnh cao hơn. Một lý do chính khiến việc mô hình hóa giá cả và lợi nhuận trở nên khó khăn là do các phân phối xác suất cơ bản. Nhiều lý thuyết và frameworks trong tài chính yêu cầu dữ liệu phải có liên quan nào đó đến phân phối chuẩn. Đây là một lý do chính khiến phân phối chuẩn dường như rất phổ biến. Ví dụ, cơ sở của mô hình định giá Black-Scholes cho quyền chọn giả định rằng giá cổ phiếu được phân phối theo dạng log-normal. Tuy nhiên, rất khó để tìm dữ liệu thực tế phù hợp với các giả định về tính chuẩn mực. Khi thực hiện một chiến lược, bạn không nên giả định rằng dữ liệu tuân theo một phân phối mà nó rõ ràng không tuân theo, trừ khi có lý do rất tốt cho điều đó.
Nói chung, khi cố gắng khớp một phân phối xác suất với các giá trị thực tế, chúng ta nên có một phân phối cụ thể (hoặc các phân phối) trong tâm trí. Có nhiều bài kiểm tra cho các phân phối khác nhau mà chúng ta có thể áp dụng để xem cái nào có thể là phù hợp nhất. Thêm vào đó, khi ngày càng có nhiều thông tin, sẽ cần thiết phải cập nhật trung bình mẫu và độ lệch chuẩn hoặc thậm chí tìm một phân phối khác để phản ánh chính xác hơn thông tin mới. Hình dạng của phân phối sẽ thay đổi tương ứng.
Lưu ý: Tài liệu này mang tính chất chia sẻ kiến thức khoa học dữ liệu. Các mã chứng khoán xuất hiện trong tài liệu chỉ mang tính chất minh hoạ, không khuyến nghị đầu tư. Chúng tôi không chịu trách nhiệm trước mọi rủi ro nào do sử dụng tài liệu này.