December 26, 2013

Giới thiệu về phương pháp Principal Component Analysis (PCA) và một số ứng dụng trong tài chính (Phần I)

Theo VNquants
PCA 0

1. Giới thiệu phương pháp Principle Component Analysis (PCA):
Trong loạt bài này chúng tôi xin được trình bày về phương pháp Principle Component Analysis (PCA), đây là một kết quả rất đẹp của đại số mà ngày nay được ứng dụng trong rất nhiều lĩnh vực: Công nghệ thông tin, Sinh học,... và cả trong Tài chính.
Với dữ liệu cần phân tích ban đầu phụ thuộc nhiều biến, vấn đề là các biến này thường cótương quan với nhau sẽ bất lợi cho việc áp dụng các biến này để xây dựng các mô hình tính toán ví dụ: hồi quy… và với số biến giải thích lớn chúng ta sẽ rất khó để có cái nhìn trực quan về dữ liệu ví dụ: thị trường ta quan tâm có hàng ngàn mã cổ phiếu làm cách nào để khi quan sát dữ liệu từ hàng ngàn cổ phiếu này ta hình dung được xu hướng của toàn thị trường…
Phương pháp PCA sẽ "chiếu" (biễu diễn) dữ liệu đa chiều lên một không gian có cơ sở trực giao, tức nếu ta xem mỗi cơ sở trong không gian mới là một biến thì hình ảnh của dữ liệu gốc trong không gian mới này sẽ được biểu diễn thông qua các biến độc lập (tuyến tính). Vấn đề: nếu chuyển dữ liệu ban đầu sang không gian mới thì những thông tin đáng quan tâm của dữ liệu ban đầu liệu có bị mất? Để giải quyết vấn đề này phương pháp PCA sẽ tìm không gian mới với tiêu chí cố gắng phản ánh được càng nhiều thông tin gốc càng tốt, và thước đo cho khái niệm "thông tin" ở đây là phương sai. Một điểm hay nữa là: do các biến trong không gian mới độc lâp, nên ta có thể tính toán được tỷ lệ giải thích phương sai của từng biến mới đối với dữ liệu, điều này cho phép ta cân nhắc việc chỉ dùng số ít các biến để giải thích dữ liệu.
Các ứng dụng tự nhiên mà ta có thể nhận ra là:
- Giảm kích thước của dữ liệu.
- Nếu ta có thể giảm số chiều về 2 hoặc 3 chiều, ta có thể dùng các loại đồ thị để hiểu thêm về dữ liệu mà mình đang có, giúp ta nhìn dữ liệu trực quan hơn.
- Sử lý vấn đề tương quan giữa các biến trong dữ liệu ban đầu bằng cách sử dụng các biến mới trong không gian mà phương pháp PCA tìm được để mô tả dữ liệu.
* Chúng ta sẽ bắt  đầu bằng một ví dụ mang tính chất minh họa trực quan:
Chúng ta có 2 biến X1 và X2 có tương quan (tuyến tính), được biểu diển bằng đồ thị sau:
 PCA 1
Ta biết rằng khi thực hiện các phân tích đa biến mà trong đó các biến có tương quan với nhau là rất khó chịu!
Ta sẽ loại bỏ sự tương quan này bằng cách xoay trục (cơ sở)
PCA 2
PCA 3
Ta thấy rằng dữ liệu trên trục mới đã giảm sự tương quan đáng kể (biến Y1 và Y2 gần như không tương quan), và sự thay đổi của dữ liệu phụ thuộc phần lớn vào biến Y1, ta có thể chỉ dung một biến Y1 để biểu diễn dữ liệu, điều này giúp ta giảm số chiều dữ liệu mà không làm giàm quá nhiều “phương sai” của dữ liệu. Đây cũng chính là tư tưởng của phương pháp PCA. Sau đây chúng ta sẽ làm rõ hơn về mặt lý thuyết của phương pháp này
* Nền tảng toán học cho phương pháp PCA : Trong phần này chúng tôi sẽ giới thiệu cơ sở toán học của PCA một cách ngắn gọn và vắn tắt.
Cho biến ngẫu nhiên X có p chiềuX=(x1,...,xp) mô tả dữ liệu ban đầu và ta có ma trận hiệp phương sai là:
S=(sij)1ip, 1jp
* Ý tưởng chính :
Ta tìm các biến ngẫu nhiên mới y có dạng là tổ hợp tuyến tính của các thành phần của X sao cho y có phương sai càng lớn càng tốt (chứa nhiều thông tin), về mặt hình thức ta viết lại vấn đề trên: Tìm y có dạng y=pi=1aixi sao cho Var(y) lớn nhất có thể. Không mất tính tổng quát và để đơn giản tính toán, ta giả sử kỳ vọng của các thành phần trong X là 0 và phương sai bằng 1, lúc đó ta có:
Var(y)=pi=1pj=1aiajsij=aTSa
với a=(a1,..,ap), và aTa=1. Như vậy, ta cần giải bài toán tối ưu với điều kiện biên:
max aTSa với điều kiện biên aTa=1
bằng phương pháp nhân tử Largrange ta chuyển bài toán này thành:
max aTSaλ(1aTa)
nên ta có a là nghiệm của Sa=λa, dễ thấy: a chính là vecto riêng, còn λ chính là trị riêng tương ứng của ma trận S.
Chú ýS là ma trận đối xứng nửa xác định dương (symmetric positive semidefinite), và do đó có các trị riêng không âm và các vecto riêng lập thành họ trực giao.
Giả sử S có p trị riêng (λi)1ip và p vecto riêng (a(i))1ip tương ứng, do điều kiện aTa=1 nên ta thấy (a(i))1ip là họ cơ sở trực chuẩn trong không gian mới.
Ta thấy phương sai của hình chiếu của dữ liệu ban đầu lên cơ sở thứ i  (a(i)) chính là trị riêng thứ i (λi), như vậy ta xác định các thành phần chính dựa theo độ lớn của giá trị riệng. Ví dụ: thành phần quan trọng nhất, là hình chiếu của dữ liệu lên vecto riêng ứng với trị riêng lớn nhất...
Ngoài ra ta có: pi=1λi=pi=1sii là tổng phương sai, người ta hay dùng λipi=1λi để thể hiện mức độ phản ánh dữ liệu gốc theo thành phần thứ i, ví dụ: ta có tổng phương sai là 2 (pi=1λi), trị riêng của thành phần thứ 1 là 0.4, có thể hiểu là thành phần thứ 1 thể hiện được 0.4/2*100 phần trăm phương sai của dữ liệu, trị riêng của thành phần thứ 2 là 0.3, có thể hiểu là thành phần thứ 2 thể hiện được 0.3/2*100 phần trăm phương sai của dữ liệu, có thể nhận định thành phần thứ 1 quan trọng hơn thành phần thứ 2.
* Ví dụ miêu tả cách tính toán PCA bằng Matlab:
Giả sử ta có dữ liệu gốc gồm có 3 biến (3 cột), ta khai báo dưới dạng ma trận trong Matlab như sau:
A = [269.8 38.9 50.5
272.4 39.5 50.0
270.0 38.9 50.5
272.0 39.3 50.2
269.8 38.9 50.5
269.8 38.9 50.5
268.2 38.6 50.2
268.2 38.6 50.8
267.0 38.2 51.1
267.8 38.4 51.0
273.6 39.6 50.0
271.2 39.1 50.4
269.8 38.9 50.5
270.0 38.9 50.5
270.0 38.9 50.5
]; 
Ta chú ý: lúc xây dựng lý thuyết ở trên ta đã giả sử trung bình của các biến trong dữ liệu ban đầu bằng 0 và phương sai bằng 1, nên việc đầu tiên ta phải làm là chuẩn hóa (standardization), ta có thể dùng hàm zscore trong Matlab:
B=zscore(A)
Ta có thể tính ma trận hiệp phương sai bằng hàm cov trong Matlab, và tìm trị riêng cũng như các vecto riêng tương ứng bằng hàm eig
 [V D] = eig(cov(B))
Lúc này V là một ma trận với các cột là các vecto riêng, D là một ma trận chéo chứa các trị riêng tương ứng
Để đơn giản, Matlab có hàm princomp:
[COEFF SCORE LATENT] = princomp(B)
COEFF tương tự như ma trận với các cột là các vecto riêng, LATENT là vecto chứa các trị riêng, và SCORE là ảnh của dữ liệu trong cơ sở mới.
Ta thấy SCORE=B*COEFF
Sử dụng lệnh cumsum(LATENT) / sum(LATENT) ta được vecto: 0.9375    0.9978    1.0000
Có thể hiểu: thành phần thứ nhất (cơ sở mới) giải thích được khoảng 94% phương sai, thành phần thứ nhất và thứ 2 kết hợp sẽ giải thích được hơn 99% phương sai.
2. Eigen Portfolio cho thị trường chứng khoán Việt Nam:
Chúng ta bắt đầu với các cổ phiếu thuộc chỉ số VN30 từ ngày 01/01/2012-01/01/2013,
Ta lưu mã chứng khoán theo cột, còn dòng hiển thị giá chứng khoán theo ngày, tất cả dữ liệu VN30 từ ngày 01/01/2012-01/01/2013 được lưu trong biến: data
Ta tính lợi nhuận của các cổ phiếu (ma trận ret
for i=2:size(data,1)
% ret(i,:)=log((data(i,:))./data(i-1,:));
ret(i,:)=(data(i,:)-data(i-1,:))./data(i-1,:);
end
Chuẩn hóa dữ liệu (sao cho trung bình bằng 0, và phương sai 1)
X=zscore(ret);
Tính ma các vecto riêng và trị riêng của ma trận hiệp phương sai và hiển thị khả năng giải thích phương sai của 3 thành phần chính)
[COEFF,SCORE,latent] = princomp(X);
percent=cumsum(latent)./sum(latent);
percent(1:3)
Ta sẽ tạo một portfolio từ vecto riêng thứ I (giải thích được nhiều phương sai nhất, trong trường hợp này là khoảng 43%), ta còn gọi đây là Eigen Portfolio (màu xanh), và so sánh với đườngVN30-index (màu đỏ)
w=COEFF(:,1)./(sum(COEFF(:,1)));
COEFF(:,1): là vecto riêng ứng với trị riêng lớn nhất 
w: là vecto chứa tỷ lệ tài sản đầu tư vào từng loại chứng khoán
pof=data*w;
hold on
Và cuối cùng ta chuẩn hóa Eigen Portfolio và Vn30-index để so sánh
plot(zscore(pof),'b')
plot(zscore(prices(:,775)),'r')
PCA 4
Ta thấy là Eigen Portfolio thể hiện khá chính xác dáng điệu của đường VN30-index, mà ở đây ta hoàn toàn không sử dụng đến số lượng cổ phiếu lưu hành ...
Toàn bộ data + Matlab code của ví dụ này các bạn có thể tải tại:
Trong phần tiếp theo chúng tôi sẽ trình bày ứng dụng của phương pháp PCA vào phân tích đường cong lãi suất (Yield curve) và VAR (value at risk).

Tác giả: Nhóm nghiên cứu vnquants.
Source: http://vnquants.com/mini-project/gioi-thieu-ve-phuong-phap-principal-component-analysis-pca-va-mot-so-ung-dung-trong-tai-chinh-phan-1

No comments:

Post a Comment