© 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
¶
Hồi quy tuyến tính¶
By Evgenia "Jenny" Nitishinskaya and Delaney Granizo-Mackenzie with example algorithms by David Edwards
Edited by AI Cafe¹
Hồi quy tuyến tính là một kỹ thuật đo lường mối quan hệ giữa hai biến. Nếu chúng ta có một biến độc lập $X$ và một biến phụ thuộc $Y$, hồi quy tuyến tính cho phép chúng ta xác định mô hình tuyến tính nào $Y = \alpha + \beta X$ giải thích tốt nhất dữ liệu. Ví dụ, hãy xem xét FPT và VCB. Chúng ta muốn biết VCB biến đổi như thế nào dựa trên sự biến đổi của FPT, vì vậy chúng ta sẽ lấy lợi nhuận hàng ngày của mỗi công ty và hồi quy chúng với nhau.
Thư viện statsmodels
của Python có một hàm phù hợp tuyến tính tích hợp sẵn. Lưu ý rằng điều này sẽ cho ra một đường phù hợp tốt nhất; liệu mối quan hệ mà nó thể hiện có ý nghĩa hay không là điều bạn cần xác định. Đầu ra cũng sẽ có một số thống kê về mô hình, chẳng hạn như R-bình phương và giá trị F, điều này có thể giúp bạn định lượng độ tốt của sự phù hợp thực sự là như thế nào.
# Import libraries
import numpy as np
from statsmodels import regression
import statsmodels.api as sm
import matplotlib.pyplot as plt
Đầu tiên, chúng ta sẽ định nghĩa một hàm thực hiện hồi quy tuyến tính và vẽ biểu đồ kết quả.
def linreg(X,Y):
# Running the linear regression
X = sm.add_constant(X)
model = regression.linear_model.OLS(Y, X).fit()
a = model.params[0]
b = model.params[1]
X = X[:, 1]
# Return summary of the regression and plot results
X2 = np.linspace(X.min(), X.max(), 100)
Y_hat = X2 * b + a
plt.scatter(X, Y, alpha=0.3) # Plot the raw data
plt.plot(X2, Y_hat, 'r', alpha=0.9); # Add the regression line, colored in red
plt.xlabel('X Value')
plt.ylabel('Y Value')
return model.summary()
Bây giờ chúng ta sẽ lấy dữ liệu giá cả của FPT và VCB và thực hiện một phân tích hồi quy.
# 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
start = '2024-01-01'
end = '2025-01-01'
closes = get_prices('FPT', 'VCB', start_date=start, end_date=end)
# We have to take the percent changes to get to returns
# Get rid of the first (0th) element because it is NAN
fpt_returns = closes['FPT'].pct_change()[1:]
vcb_returns = closes['VCB'].pct_change()[1:]
linreg(fpt_returns.values, vcb_returns.values)
Dep. Variable: | y | R-squared: | 0.059 |
---|---|---|---|
Model: | OLS | Adj. R-squared: | 0.055 |
Method: | Least Squares | F-statistic: | 15.55 |
Date: | Thu, 17 Apr 2025 | Prob (F-statistic): | 0.000105 |
Time: | 08:43:26 | Log-Likelihood: | 807.60 |
No. Observations: | 249 | AIC: | -1611. |
Df Residuals: | 247 | BIC: | -1604. |
Df Model: | 1 | ||
Covariance Type: | nonrobust |
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
const | -1.093e-06 | 0.001 | -0.002 | 0.999 | -0.001 | 0.001 |
x1 | 0.1548 | 0.039 | 3.944 | 0.000 | 0.077 | 0.232 |
Omnibus: | 127.157 | Durbin-Watson: | 1.745 |
---|---|---|---|
Prob(Omnibus): | 0.000 | Jarque-Bera (JB): | 1251.404 |
Skew: | 1.778 | Prob(JB): | 1.82e-272 |
Kurtosis: | 13.391 | Cond. No. | 65.3 |
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Mỗi điểm trên đồ thị ở trên đại diện cho một ngày, với tọa độ x là lợi nhuận của FPT, và tọa độ y là lợi nhuận của VCB. Như chúng ta có thể thấy, đường hồi quy tốt nhất cho thấy rằng mỗi khi lợi nhuận từ FPT tăng 1%, chúng ta chỉ thấy tăng 0.15% từ VCB. Điều này được thể hiện bởi tham số $\beta$, mà được ước lượng là 0.1548. Tất nhiên, đối với những khoản thua lỗ, chúng ta cũng sẽ thấy những khoản thua lỗ ít hơn ở VCB.
Hồi quy tuyến tính vs. Tương quan¶
- Hồi quy tuyến tính cung cấp cho chúng ta một mô hình tuyến tính cụ thể, nhưng bị giới hạn trong các trường hợp phụ thuộc tuyến tính.
- Tương quan thì chung hơn cho cả phụ thuộc tuyến tính và không tuyến tính, nhưng không cung cấp cho chúng ta một mô hình thực tế.
- Cả hai đều là những thước đo của hiệp phương sai.
- Hồi quy tuyến tính có thể cho chúng ta mối quan hệ giữa Y và nhiều biến độc lập bằng cách làm cho X trở thành đa chiều.
Tham Số khác với Ước Lượng¶
Điều quan trọng là phải nhớ rằng tất cả các tham số $\alpha$ và $\beta$ được ước lượng bởi hồi quy tuyến tính chỉ là ước lượng. Bạn không bao giờ có thể biết các tham số thật sự là gì trừ khi bạn biết quá trình vật lý tạo ra dữ liệu. Các tham số mà bạn ước lượng hôm nay có thể không giống như phân tích được thực hiện khi bao gồm dữ liệu ngày mai, và các tham số thật sự có thể đang thay đổi. Do đó, điều quan trọng là khi thực hiện phân tích thực tế phải chú ý đến sai số chuẩn của các ước lượng tham số. Một cách để có cảm nhận về độ ổn định của các ước lượng tham số của bạn là ước lượng chúng bằng cách sử dụng một cửa sổ dữ liệu động và xem có bao nhiêu biến động trong các ước lượng.
Ví dụ¶
Bây giờ hãy xem điều gì xảy ra nếu chúng ta hồi quy hai biến ngẫu nhiên thuần túy.
X = np.random.rand(100)
Y = np.random.rand(100)
linreg(X, Y)
Dep. Variable: | y | R-squared: | 0.000 |
---|---|---|---|
Model: | OLS | Adj. R-squared: | -0.010 |
Method: | Least Squares | F-statistic: | 0.003434 |
Date: | Thu, 17 Apr 2025 | Prob (F-statistic): | 0.953 |
Time: | 08:59:44 | Log-Likelihood: | -14.911 |
No. Observations: | 100 | AIC: | 33.82 |
Df Residuals: | 98 | BIC: | 39.03 |
Df Model: | 1 | ||
Covariance Type: | nonrobust |
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
const | 0.4753 | 0.060 | 7.938 | 0.000 | 0.356 | 0.594 |
x1 | -0.0061 | 0.105 | -0.059 | 0.953 | -0.214 | 0.202 |
Omnibus: | 20.490 | Durbin-Watson: | 2.363 |
---|---|---|---|
Prob(Omnibus): | 0.000 | Jarque-Bera (JB): | 5.267 |
Skew: | 0.148 | Prob(JB): | 0.0718 |
Kurtosis: | 1.915 | Cond. No. | 4.68 |
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Kết quả trên cho thấy một đám mây điểm khá đồng nhất. Điều quan trọng cần lưu ý rằng ngay cả với 100 mẫu, đường có độ dốc rõ ràng do ngẫu nhiên. Đây là lý do tại sao việc sử dụng các bài kiểm tra thống kê chứ không phải hình ảnh để xác minh kết quả của bạn là rất quan trọng.
Bây giờ hãy làm cho Y phụ thuộc vào X cộng với một số nhiễu ngẫu nhiên.
# Generate ys correlated with xs by adding normally-destributed errors
Y = X + 0.2*np.random.randn(100)
linreg(X,Y)
Dep. Variable: | y | R-squared: | 0.606 |
---|---|---|---|
Model: | OLS | Adj. R-squared: | 0.602 |
Method: | Least Squares | F-statistic: | 150.5 |
Date: | Thu, 17 Apr 2025 | Prob (F-statistic): | 1.63e-21 |
Time: | 09:02:08 | Log-Likelihood: | 8.5851 |
No. Observations: | 100 | AIC: | -13.17 |
Df Residuals: | 98 | BIC: | -7.960 |
Df Model: | 1 | ||
Covariance Type: | nonrobust |
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
const | -0.0222 | 0.047 | -0.470 | 0.640 | -0.116 | 0.072 |
x1 | 1.0149 | 0.083 | 12.267 | 0.000 | 0.851 | 1.179 |
Omnibus: | 1.600 | Durbin-Watson: | 1.772 |
---|---|---|---|
Prob(Omnibus): | 0.449 | Jarque-Bera (JB): | 1.560 |
Skew: | 0.296 | Prob(JB): | 0.458 |
Kurtosis: | 2.845 | Cond. No. | 4.68 |
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Trong trường hợp này, đường hồi quy tốt nhất thực sự mô hình hóa biến phụ thuộc Y khá tốt (với giá trị $R^2$ cao).
Đánh giá và báo cáo kết quả¶
Mô hình hồi quy dựa trên một số giả định:
- Biến độc lập không phải là ngẫu nhiên.
- Phương sai của sai số là không đổi giữa các quan sát. Điều này rất quan trọng để đánh giá độ phù hợp của mô hình.
- Các sai số không tự tương quan. Thống kê Durbin-Watson phát hiện điều này; nếu nó gần bằng 2, thì không có tự tương quan.
- Các sai số được phân phối theo phân phối chuẩn. Nếu điều này không đúng, chúng ta không thể sử dụng một số thống kê, chẳng hạn như kiểm định F.
Nếu chúng ta xác nhận rằng các giả định cần thiết của mô hình hồi quy được thỏa mãn, chúng ta có thể an tâm sử dụng các thống kê được báo cáo để phân tích độ phù hợp. Ví dụ, giá trị $R^2$ cho biết phần trăm biến động tổng thể của $Y$ được mô hình giải thích.
Khi đưa ra dự đoán dựa trên mô hình, điều hữu ích là không chỉ báo cáo một giá trị duy nhất mà còn là khoảng tin cậy. Hồi quy tuyến tính báo cáo khoảng tin cậy 95% cho các tham số hồi quy, và chúng ta có thể hình dung điều này bằng cách sử dụng thư viện seaborn
, thư viện này vẽ đường hồi quy và làm nổi bật khoảng tin cậy 95% (mặc định) cho đường hồi quy:
import seaborn
seaborn.regplot(x=fpt_returns, y=vcb_returns);
Cơ sở Toán học¶
Đây là một cái nhìn tổng quan rất ngắn gọn về hồi quy tuyến tính. Để biết thêm, xin vui lòng xem: https://en.wikipedia.org/wiki/Linear_regression
Phương pháp bình phương tối thiểu¶
Hồi quy hoạt động bằng cách tối ưu hóa vị trí của đường hồi quy tốt nhất (hoặc mặt phẳng trong các chiều cao hơn). Nó thực hiện điều này bằng cách xác định mức độ sai lệch của hồi quy thông qua một hàm mục tiêu. Trong hồi quy bình phương tối thiểu (OLS), mà chúng ta đang sử dụng ở đây, hàm mục tiêu là:
$$\sum_{i=1}^n (Y_i - a - bX_i)^2$$
Chúng ta sử dụng $a$ và $b$ để đại diện cho các ứng viên tiềm năng cho $\alpha$ và $\beta$. Ý nghĩa của hàm mục tiêu này là cho mỗi điểm trên đường hồi quy tốt nhất, chúng ta so sánh nó với điểm thực tế và lấy bình phương của sự chênh lệch. Hàm này sẽ giảm khi chúng ta có được các ước lượng tham số tốt hơn. Hồi quy là một trường hợp đơn giản của tối ưu hóa số học có giải pháp dạng đóng và không cần bất kỳ bộ tối ưu hóa nào. Chúng ta chỉ cần tìm các kết quả nhằm tối thiểu hóa hàm mục tiêu.
Chúng ta sẽ ký hiệu mô hình cuối cùng mà kết quả từ việc tối thiểu hóa hàm mục tiêu của chúng ta là:
$$ \hat{Y} = \hat{\alpha} + \hat{\beta}X $$
Với $\hat{\alpha}$ và $\hat{\beta}$ là các ước lượng đã chọn cho các tham số mà chúng ta sử dụng để dự đoán và $\hat{Y}$ là các giá trị dự đoán của $Y$ dựa trên các ước lượng đó.
Sai Số Chuẩn¶
Chúng ta cũng có thể tính sai số chuẩn của ước lượng, đo lường độ lệch chuẩn của thành phần sai số $\epsilon$, bằng cách lấy tham số scale
của mô hình được trả về bởi hồi quy và lấy căn bậc hai của nó. Công thức cho sai số chuẩn của ước lượng là
$$ s = \left( \frac{\sum_{i=1}^n \epsilon_i^2}{n-2} \right)^{1/2} $$
Nếu $\hat{\alpha}$ và $\hat{\beta}$ là các tham số thực sự ($\hat{\alpha} = \alpha$ và $\hat{\beta} = \beta$), chúng ta có thể biểu diễn sai số cho một giá trị dự đoán cụ thể của $Y$ là $s^2$ cho tất cả các giá trị của $X_i$. Chúng ta tính bình phương sự chênh lệch $(Y - \hat{Y})$ để có được phương sai vì $\hat{Y}$ không bao gồm sai số trong chính các ước lượng tham số. Bởi vì $\hat{\alpha}$ và $\hat{\beta}$ chỉ là các ước lượng trong việc xây dựng mô hình của $Y$, bất kỳ giá trị dự đoán nào, $\hat{Y}$, sẽ có sai số chuẩn riêng của nó dựa trên phân phối của các biến $X$ mà chúng ta đưa vào mô hình. Sai số dự đoán này được biểu diễn bằng công thức sau:
$$ s_f^2 = s^2 \left( 1 + \frac{1}{n} + \frac{(X - \mu_X)^2}{(n-1)\sigma_X^2} \right) $$
Trong đó $\mu_X$ là trung bình của các quan sát của chúng ta về $X$ và $\sigma_X$ là độ lệch chuẩn của $X$. Điều chỉnh này cho $s^2$ bao gồm sự không chắc chắn trong các ước lượng tham số của chúng ta. Sau đó, khoảng tự tin 95% cho dự đoán là $\hat{Y} \pm t_cs_f$, trong đó $t_c$ là giá trị tới hạn của thống kê t cho $n$ mẫu và độ tin cậy mong muốn là 95%.
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.