8  Lý thuyết danh mục đầu tư hiện đại

Trong chương trước, chúng ta đã trình bày cách tải và phân tích dữ liệu thị trường chứng khoán bằng các hình vẽ và thống kê mô tả. Bây giờ, chúng ta chuyển sang một trong những câu hỏi cơ bản nhất của tài chính: Nhà đầu tư nên phân bổ của cải của mình như thế nào giữa các tài sản có lợi nhuận kỳ vọng, phương sai và tương quan khác nhau để tối ưu hóa hiệu quả danh mục đầu tư?

Thoạt nhìn, câu hỏi này có vẻ đơn giản. Tại sao không đầu tư toàn bộ vào tài sản có lợi nhuận kỳ vọng cao nhất? Câu trả lời nằm ở một nhận định sâu sắc đã làm thay đổi kinh tế học tài chính: rủi ro là quan trọng, và có thể quản lý rủi ro thông qua đa dạng hóa.

Lý thuyết danh mục đầu tư hiện đại (Modern Portfolio Theory, MPT), do Markowitz (1952) đề xuất, đã tạo ra cuộc cách mạng trong việc ra quyết định đầu tư bằng cách chính thức hóa sự đánh đổi giữa rủi ro và lợi nhuận kỳ vọng. Trước Markowitz, các nhà đầu tư chủ yếu nghĩ về rủi ro theo từng chứng khoán riêng lẻ. Thiên tài của Markowitz là nhận ra rằng điều quan trọng không phải là rủi ro của từng chứng khoán một cách tách biệt, mà là cách chúng đóng góp vào rủi ro của toàn bộ danh mục. Nhận định này có ảnh hưởng lớn đến mức giúp ông giành Giải Sveriges Riksbank về Khoa học Kinh tế năm 1990 và đặt nền móng cho phần lớn tài chính hiện đại.

8.0.1 Nhận định cốt lõi: Đa dạng hóa như một bữa trưa miễn phí

MPT dựa trên một sự thật toán học quan trọng: rủi ro của danh mục không chỉ phụ thuộc vào độ biến động của từng tài sản mà còn phụ thuộc vào tương quan giữa lợi nhuận của các tài sản. Nhận định này cho thấy sức mạnh của đa dạng hóa: kết hợp các tài sản có lợi nhuận không biến động hoàn toàn đồng pha có thể làm giảm rủi ro chung của danh mục mà không nhất thiết phải hy sinh lợi nhuận kỳ vọng.

Hãy xét một phép so sánh đơn giản: Giả sử bạn kinh doanh cả kem chống nắng và ô. Vào những ngày nắng, doanh số kem chống nắng tăng mạnh nhưng doanh số ô sụt giảm; vào những ngày mưa thì ngược lại. Nhờ bán cả hai sản phẩm, tổng doanh thu của bạn ổn định hơn so với khi chỉ bán một loại. “Tương quan” giữa doanh số kem chống nắng và doanh số ô là âm, và việc kết hợp chúng làm giảm phương sai của thu nhập chung. Đây chính xác là logic đằng sau đa dạng hóa danh mục đầu tư.

Phép so sánh giỏ trái cây đưa ra một góc nhìn khác: Nếu bạn chỉ có táo và chúng bị hỏng, bạn mất tất cả. Với nhiều loại trái cây, một số có thể hỏng nhưng những loại khác vẫn tươi. Đa dạng hóa đóng vai trò như bảo hiểm trước các rủi ro đặc thù của từng tài sản.

8.0.2 Khung trung bình–phương sai

Trọng tâm của MPT là phân tích trung bình–phương sai, đánh giá các danh mục đầu tư dựa trên hai chiều:

  1. Lợi nhuận kỳ vọng (trung bình): Mức lợi nhuận trung bình dự kiến khi nắm giữ danh mục
  2. Rủi ro (phương sai): Mức độ phân tán của các lợi nhuận có thể xảy ra quanh giá trị kỳ vọng

Giả định then chốt là nhà đầu tư chỉ quan tâm đến hai mô-men này của phân phối lợi nhuận. Giả định này hoàn toàn đúng nếu lợi nhuận tuân theo phân phối chuẩn, hoặc nếu nhà đầu tư có hàm thỏa dụng bậc hai. Ngay cả khi các điều kiện này không được thỏa mãn một cách chính xác, phân tích trung bình–phương sai thường vẫn cho một xấp xỉ tốt về lựa chọn danh mục tối ưu.

Bằng cách cân bằng giữa lợi nhuận kỳ vọng và rủi ro, nhà đầu tư có thể xây dựng các danh mục hoặc tối đa hóa lợi nhuận kỳ vọng ở một mức rủi ro cho trước, hoặc tối thiểu hóa rủi ro ở một mức lợi nhuận kỳ vọng mong muốn. Trong chương này, chúng ta suy ra các quyết định danh mục tối ưu này bằng phương pháp giải tích và triển khai cách tiếp cận trung bình–phương sai bằng tính toán.

Hiện mã
import pandas as pd
import numpy as np
import tidyfinance as tf

from plotnine import *
from mizani.formatters import percent_format
from adjustText import adjust_text

8.1 Tập hợp tài sản: Thiết lập bài toán

Giả sử nhà đầu tư có \(N\) tài sản rủi ro khác nhau để lựa chọn. Mỗi tài sản \(i\) được đặc trưng bởi:

  • Lợi nhuận kỳ vọng \(\mu_i\): Mức lợi nhuận dự kiến khi nắm giữ tài sản trong một kỳ
  • Phương sai \(\sigma_i^2\): Mức độ phân tán của lợi nhuận quanh giá trị trung bình
  • Hiệp phương sai \(\sigma_{ij}\): Mức độ mà lợi nhuận của tài sản \(i\) biến động cùng với lợi nhuận của tài sản \(j\)

Nhà đầu tư chọn trọng số danh mục \(\omega_i\) cho mỗi tài sản \(i\). Các trọng số này biểu thị tỷ trọng tổng tài sản được đầu tư vào từng tài sản. Chúng ta áp đặt ràng buộc rằng tổng các trọng số bằng một:

\[ \sum_{i=1}^N \omega_i = 1 \]

“Ràng buộc ngân sách” này bảo đảm nhà đầu tư đầu tư toàn bộ vốn, tức là không có lựa chọn bên ngoài như cất tiền dưới đệm. Lưu ý rằng chúng ta cho phép trọng số âm (vị thế bán khống) hoặc lớn hơn một (đòn bẩy), dù trong thực tế các vị thế này có thể bị hạn chế.

8.1.1 Hai giai đoạn của việc lựa chọn danh mục

Theo Markowitz (1952), việc lựa chọn danh mục gồm hai giai đoạn riêng biệt:

  1. Ước lượng: Hình thành kỳ vọng về hiệu quả của chứng khoán trong tương lai dựa trên quan sát, kinh nghiệm và lập luận kinh tế
  2. Tối ưu hóa: Sử dụng các kỳ vọng này để chọn danh mục tối ưu

Trong thực tế, hai giai đoạn này không thể tách rời hoàn toàn. Giai đoạn ước lượng xác định các đầu vào (\(\mu\), \(\Sigma\)) cung cấp cho giai đoạn tối ưu hóa. Ước lượng kém dẫn đến lựa chọn danh mục kém, bất kể quy trình tối ưu hóa tinh vi đến đâu.

Để giữ cho mạch khái niệm rõ ràng, trong chương này chúng ta chủ yếu tập trung vào giai đoạn tối ưu hóa. Chúng ta coi lợi nhuận kỳ vọng và ma trận phương sai–hiệp phương sai là đã biết, và dùng dữ liệu lịch sử để tính các giá trị xấp xỉ hợp lý. Trong các chương sau, chúng ta sẽ đề cập những thách thức đáng kể phát sinh từ sự bất định trong ước lượng.

8.1.2 Tải và chuẩn bị dữ liệu

Chúng ta làm việc với các cổ phiếu thành phần của chỉ số VN30, gồm 30 cổ phiếu lớn nhất và có tính thanh khoản cao nhất trên Sở Giao dịch Chứng khoán TP. Hồ Chí Minh của Việt Nam. Điều này tạo ra một tập hợp tài sản thực tế cho nhà đầu tư trong nước tại Việt Nam.

Hiện mã
vn30_symbols = [
    "ACB","BCM","BID","BVH","CTG","FPT","GAS","GVR","HDB","HPG",
    "MBB","MSN","MWG","PLX","POW","SAB","SHB","SSB","STB","TCB",
    "TPB","VCB","VHM","VIB","VIC","VJC","VNM","VPB","VRE","EIB"
]

Chúng ta tải dữ liệu giá lịch sử:

Hiện mã
import pandas as pd
from io import BytesIO
import datetime as dt
import os
import boto3
from botocore.client import Config

class ConnectMinio:
    def __init__(self):
        self.MINIO_ENDPOINT = os.environ["MINIO_ENDPOINT"]
        self.MINIO_ACCESS_KEY = os.environ["MINIO_ACCESS_KEY"]
        self.MINIO_SECRET_KEY = os.environ["MINIO_SECRET_KEY"]
        self.REGION = os.getenv("MINIO_REGION", "us-east-1")

        self.s3 = boto3.client(
            "s3",
            endpoint_url=self.MINIO_ENDPOINT,
            aws_access_key_id=self.MINIO_ACCESS_KEY,
            aws_secret_access_key=self.MINIO_SECRET_KEY,
            region_name=self.REGION,
            config=Config(signature_version="s3v4"),
        )

    def test_connection(self):
        resp = self.s3.list_buckets()
        print("Connected. Buckets:")
        for b in resp.get("Buckets", []):
            print(" -", b["Name"])

conn = ConnectMinio()
s3 = conn.s3
conn.test_connection()

bucket_name = os.environ["MINIO_BUCKET"]

prices = pd.read_csv(
    BytesIO(
        s3.get_object(
            Bucket=bucket_name,
            Key="historycal_price/dataset_historical_price.csv"
        )["Body"].read()
    ),
    low_memory=False
)

prices["date"] = pd.to_datetime(prices["date"])
prices["adjusted_close"] = prices["close_price"] * prices["adj_ratio"]
prices = prices.rename(columns={
    "vol_total": "volume",
    "open_price": "open",
    "low_price": "low",
    "high_price": "high",
    "close_price": "close"
})
prices = prices.sort_values(["symbol", "date"])
Connected. Buckets:
 - dsteam-data
 - rawbctc

Chúng ta lọc để chỉ giữ lại các cổ phiếu thành phần của VN30:

Hiện mã
prices_daily = prices[prices["symbol"].isin(vn30_symbols)]
prices_daily[["date", "symbol", "adjusted_close"]].head(3)
date symbol adjusted_close
18176 2010-01-04 ACB 329.408244
18177 2010-01-05 ACB 329.408244
18178 2010-01-06 ACB 320.258015

8.1.3 Tính lợi nhuận kỳ vọng

Lợi nhuận trung bình mẫu đóng vai trò là giá trị xấp xỉ cho lợi nhuận kỳ vọng. Với mỗi tài sản \(i\), chúng ta tính:

\[ \hat{\mu}_i = \frac{1}{T} \sum_{t=1}^{T} r_{i,t} \]

trong đó \(r_{i,t}\) là lợi nhuận của tài sản \(i\) trong kỳ \(t\), và \(T\) là tổng số kỳ.

Tại sao dùng lợi nhuận hàng tháng? Mặc dù dữ liệu hàng ngày cung cấp nhiều quan sát hơn, lợi nhuận hàng tháng mang lại một số lợi thế cho tối ưu hóa danh mục. Thứ nhất, lợi nhuận hàng tháng ít nhiễu hơn và có tự tương quan chuỗi yếu hơn. Thứ hai, tái cân bằng hàng tháng thực tế hơn đối với hầu hết nhà đầu tư, tránh chi phí giao dịch quá mức. Thứ ba, sai số ước lượng của lợi nhuận trung bình vốn đã đáng kể: dùng dữ liệu hàng ngày không cải thiện đáng kể độ chính xác của ước lượng trung bình vì lợi nhuận trung bình tăng tỷ lệ thuận với khoảng thời gian, trong khi sai số ước lượng tăng theo căn bậc hai của số quan sát.

Hiện mã
returns_monthly = (prices_daily
  .assign(
    date=prices_daily["date"].dt.to_period("M").dt.to_timestamp()
  )
  .groupby(["symbol", "date"], as_index=False)
  .agg(adjusted_close=("adjusted_close", "last"))
  .assign(
    ret=lambda x: x.groupby("symbol")["adjusted_close"].pct_change()
  )
)

8.1.4 Tính độ biến động

Rủi ro của từng tài sản trong MPT được đo bằng phương sai (\(\sigma^2_i\)) hoặc căn bậc hai của nó, tức là độ lệch chuẩn hay độ biến động (\(\sigma_i\)). Chúng ta dùng độ lệch chuẩn mẫu làm giá trị xấp xỉ:

\[ \hat{\sigma}_i = \sqrt{\frac{1}{T-1} \sum_{t=1}^{T} (r_{i,t} - \hat{\mu}_i)^2} \]

Có những thước đo rủi ro thay thế, bao gồm Value-at-Risk, Expected Shortfall và các mô-men bậc cao như độ bất đối xứng (skewness) và độ nhọn. Tuy nhiên, phương sai vẫn là thước đo chủ lực trong lý thuyết danh mục nhờ tính dễ xử lý về mặt toán học và vai trò trung tâm của phân phối chuẩn trong tài chính.

Hiện mã
assets = (returns_monthly
  .groupby("symbol", as_index=False)
  .agg(
    mu=("ret", "mean"),
    sigma=("ret", "std")
  )
)

8.1.5 Trực quan hóa sự đánh đổi giữa rủi ro và lợi nhuận

Hình 8.1 hiển thị lợi nhuận kỳ vọng của từng tài sản (trục tung) so với độ biến động của nó (trục hoành). Không gian “trung bình–độ lệch chuẩn” này là nền tảng của lý thuyết danh mục.

Hiện mã
assets_figure = (
  ggplot(
    assets, 
    aes(x="sigma", y="mu", label="symbol")
  )
  + geom_point()
  + geom_text(adjust_text={"arrowprops": {"arrowstyle": "-"}})
  + scale_x_continuous(labels=percent_format())
  + scale_y_continuous(labels=percent_format())
  + labs(
      x="Volatility (Standard Deviation)", 
      y="Expected Return",
      title="Expected returns and volatilities of VN30 index constituents"
  )
)
assets_figure.show()
Tiêu đề: Lợi nhuận kỳ vọng và độ biến động của các cổ phiếu thành phần chỉ số VN30. Hình là biểu đồ phân tán với độ biến động trên trục hoành và lợi nhuận kỳ vọng trên trục tung.
Hình 8.1: Lợi nhuận kỳ vọng và độ biến động dựa trên lợi nhuận hàng tháng đã điều chỉnh theo chi trả cổ tức và chia tách cổ phiếu.

Một số nhận xét rút ra từ hình này. Thứ nhất, có sự không đồng nhất đáng kể về cả lợi nhuận kỳ vọng và độ biến động giữa các cổ phiếu. Thứ hai, mối quan hệ giữa rủi ro và lợi nhuận khác xa tuyến tính. Một số cổ phiếu có độ biến động cao nhưng lợi nhuận kỳ vọng thấp, thậm chí âm. Thứ ba, hầu hết các cổ phiếu riêng lẻ dường như đem lại sự đánh đổi rủi ro–lợi nhuận kém. Như chúng ta sẽ thấy, các danh mục có thể cải thiện đáng kể so với những vị thế riêng lẻ này.

8.2 Ma trận phương sai–hiệp phương sai: Nắm bắt tương tác giữa các tài sản

8.2.1 Tại sao tương quan quan trọng

Một đổi mới then chốt của MPT là nhận ra rằng rủi ro danh mục phụ thuộc rất lớn vào cách các tài sản biến động cùng nhau. Ma trận phương sai–hiệp phương sai \(\Sigma\) nắm bắt mọi tương tác theo từng cặp giữa lợi nhuận của các tài sản.

Để hiểu vì sao tương quan quan trọng, hãy xét phương sai của một danh mục gồm hai tài sản: \[\sigma_p^2 = \omega_1^2\sigma_1^2 + \omega_2^2\sigma_2^2 + 2\omega_1\omega_2\sigma_{12}\]

Số hạng thứ ba chứa hiệp phương sai \(\sigma_{12} = \rho_{12}\sigma_1\sigma_2\), trong đó \(\rho_{12}\) là hệ số tương quan. Khi \(\rho_{12} < 1\), phương sai danh mục nhỏ hơn trung bình có trọng số của các phương sai riêng lẻ. Khi \(\rho_{12} < 0\), lợi ích đa dạng hóa còn rõ rệt hơn nữa.

Sự thật toán học này có hàm ý sâu sắc: Bạn có thể giảm rủi ro mà không làm giảm lợi nhuận kỳ vọng bằng cách kết hợp các tài sản không biến động hoàn toàn cùng nhau. Điều này đôi khi được gọi là “bữa trưa miễn phí duy nhất trong tài chính”.

8.2.2 Tính ma trận phương sai–hiệp phương sai

Chúng ta tính ma trận hiệp phương sai mẫu như sau: \[\hat{\sigma}_{ij} = \frac{1}{T-1} \sum_{t=1}^{T} (r_{i,t} - \hat{\mu}_i)(r_{j,t} - \hat{\mu}_j)\]

Trước tiên, chúng ta chuyển dữ liệu lợi nhuận sang dạng rộng với các tài sản làm cột:

Hiện mã
returns_wide = (returns_monthly
  .pivot(index="date", columns="symbol", values="ret")
  .reset_index()
)

sigma = (returns_wide
  .drop(columns=["date"])
  .cov()
)

8.2.3 Diễn giải ma trận phương sai–hiệp phương sai

Các phần tử trên đường chéo của \(\Sigma\) là phương sai của từng tài sản. Các phần tử ngoài đường chéo là hiệp phương sai, có thể dương (các tài sản có xu hướng biến động cùng chiều), âm (các tài sản có xu hướng biến động ngược chiều) hoặc bằng không (không có quan hệ tuyến tính).

Để dễ diễn giải hơn, chúng ta thường chuyển hiệp phương sai thành tương quan: \[\rho_{ij} = \frac{\sigma_{ij}}{\sigma_i \sigma_j}\]

Tương quan bị chặn trong khoảng từ -1 đến +1, nên dễ so sánh giữa các cặp tài sản hơn.

Hình 8.2 trực quan hóa ma trận phương sai–hiệp phương sai dưới dạng bản đồ nhiệt.

Hiện mã
sigma_long = (sigma
  .reset_index()
  .melt(id_vars="symbol", var_name="symbol_b", value_name="value")
)

sigma_long["symbol_b"] = pd.Categorical(
  sigma_long["symbol_b"], 
  categories=sigma_long["symbol_b"].unique()[::-1],
  ordered=True
)

sigma_figure = (
  ggplot(
    sigma_long, 
    aes(x="symbol", y="symbol_b", fill="value")
  )
  + geom_tile()
  + labs(
      x="", y="", fill="(Co-)Variance",
      title="Sample variance-covariance matrix of VN30 index constituents"
    )
  + scale_fill_continuous(labels=percent_format())
  + theme(axis_text_x=element_text(angle=45, hjust=1))
)
sigma_figure.show()
Tiêu đề: Ma trận phương sai–hiệp phương sai của các cổ phiếu thành phần chỉ số VN30.
Hình 8.2: Phương sai và hiệp phương sai dựa trên lợi nhuận hàng tháng đã điều chỉnh theo chi trả cổ tức và chia tách cổ phiếu.

Bản đồ nhiệt cho thấy những mẫu hình quan trọng. Đường chéo (phương sai) cho biết cổ phiếu nào biến động mạnh nhất. Các mẫu hình ngoài đường chéo cho biết những cặp cổ phiếu nào có xu hướng biến động cùng nhau. Nhìn chung, các cổ phiếu trong cùng một ngành có xu hướng tương quan với nhau cao hơn so với các cổ phiếu thuộc ngành khác.

8.3 Danh mục phương sai tối thiểu

8.3.1 Động lực: Tối thiểu hóa rủi ro làm mốc so sánh

Trước khi xét đến lợi nhuận kỳ vọng, hãy tìm danh mục chỉ nhằm tối thiểu hóa rủi ro. Danh mục phương sai tối thiểu (minimum-variance portfolio, MVP) này đóng vai trò là mốc so sánh và điểm tham chiếu quan trọng. Nó thể hiện lựa chọn của một nhà đầu tư cực kỳ ngại rủi ro, tức là người chỉ quan tâm đến việc tối thiểu hóa độ biến động.

8.3.2 Bài toán tối ưu hóa

Nhà đầu tư theo phương sai tối thiểu giải bài toán: \[ \min_{\omega} \omega^{\prime}\Sigma\omega \]

với ràng buộc tổng các trọng số bằng một:

\[ \omega^{\prime}\iota = 1 \]

trong đó \(\iota\) là vectơ cột \(N \times 1\) gồm toàn số một.

Nói bằng lời: tối thiểu hóa phương sai danh mục, với điều kiện đầu tư toàn bộ vốn.

8.3.3 Nghiệm giải tích

Đây là một bài toán tối ưu hóa có ràng buộc kinh điển, có thể giải bằng nhân tử Lagrange. Hàm Lagrange là:

\[ \mathcal{L} = \omega^{\prime}\Sigma\omega - \lambda(\omega^{\prime}\iota - 1) \]

Lấy điều kiện bậc nhất theo \(\omega\): \[ \frac{\partial \mathcal{L}}{\partial \omega} = 2\Sigma\omega - \lambda\iota = 0 \]

Giải theo \(\omega\): \[ \omega = \frac{\lambda}{2}\Sigma^{-1}\iota \]

Dùng ràng buộc \(\omega^{\prime}\iota = 1\) để giải theo \(\lambda\): \[ \frac{\lambda}{2}\iota^{\prime}\Sigma^{-1}\iota = 1 \implies \frac{\lambda}{2} = \frac{1}{\iota^{\prime}\Sigma^{-1}\iota} \]

Thay ngược trở lại: \[ \omega_{\text{mvp}} = \frac{\Sigma^{-1}\iota}{\iota^{\prime}\Sigma^{-1}\iota} \]

Công thức gọn gàng này cho thấy các trọng số phương sai tối thiểu chỉ phụ thuộc vào ma trận hiệp phương sai, còn lợi nhuận kỳ vọng không đóng vai trò gì. Ma trận hiệp phương sai nghịch đảo \(\Sigma^{-1}\) xác định lượng đầu tư vào mỗi tài sản dựa trên phương sai của nó và hiệp phương sai của nó với mọi tài sản khác.

8.3.4 Triển khai

Hiện mã
iota = np.ones(sigma.shape[0])
sigma_inv = np.linalg.inv(sigma.values)
omega_mvp = (sigma_inv @ iota) / (iota @ sigma_inv @ iota)

8.3.5 Trực quan hóa các trọng số phương sai tối thiểu

Hình 8.3 hiển thị các trọng số danh mục của danh mục phương sai tối thiểu.

Hiện mã
assets = assets.assign(omega_mvp=omega_mvp)

assets["symbol"] = pd.Categorical(
  assets["symbol"],
  categories=assets.sort_values("omega_mvp")["symbol"],
  ordered=True
)

omega_figure = (
  ggplot(
    assets,
    aes(y="omega_mvp", x="symbol", fill="omega_mvp>0")
  )
  + geom_col()
  + coord_flip()
  + scale_y_continuous(labels=percent_format())
  + labs(
      x="", 
      y="Portfolio Weight", 
      title="Minimum-variance portfolio weights"
  )
  + theme(legend_position="none")
)
omega_figure.show()
Tiêu đề: Trọng số danh mục phương sai tối thiểu. Hình là biểu đồ cột thể hiện trọng số danh mục của từng cổ phiếu thành phần chỉ số VN30.
Hình 8.3: Các trọng số dựa trên các mô-men lịch sử của lợi nhuận hàng tháng đã điều chỉnh theo chi trả cổ tức và chia tách cổ phiếu.

Một số đặc điểm của danh mục phương sai tối thiểu đáng chú ý. Thứ nhất, nhiều cổ phiếu nhận trọng số bằng không hoặc gần bằng không. Thứ hai, một số cổ phiếu nhận trọng số âm (vị thế bán khống). Các vị thế bán khống này không phải do sai lệch tính toán, mà phản ánh nỗ lực của bộ tối ưu hóa nhằm khai thác tương quan để giảm rủi ro. Thứ ba, các trọng số khá cực đoan (cả dương lớn và âm lớn), điều này thường cho thấy sự khuếch đại sai số ước lượng, một chủ đề chúng ta sẽ đề cập trong các chương sau.

8.3.6 Hiệu quả của danh mục

Hãy tính lợi nhuận kỳ vọng và độ biến động của danh mục phương sai tối thiểu:

Hiện mã
mu = assets["mu"].values
mu_mvp = omega_mvp @ mu
sigma_mvp = np.sqrt(omega_mvp @ sigma.values @ omega_mvp)

summary_mvp = pd.DataFrame({
  "mu": [mu_mvp],
  "sigma": [sigma_mvp],
  "type": ["Minimum-Variance Portfolio"]
})
summary_mvp
mu sigma type
0 -0.011424 0.043512 Minimum-Variance Portfolio
Hiện mã
mu_mvp_fmt = f"{mu_mvp:.4f}"
sigma_mvp_fmt = f"{sigma_mvp:.4f}"
print(f"The MVP return is {mu_mvp_fmt} and volatility is {sigma_mvp_fmt}.")
The MVP return is -0.0114 and volatility is 0.0435.

Nếu lợi nhuận kỳ vọng âm, đó không phải là lỗi tính toán. Danh mục phương sai tối thiểu tối thiểu hóa rủi ro mà không quan tâm đến lợi nhuận kỳ vọng. Vì một số tài sản trong mẫu có lợi nhuận trung bình âm, tổ hợp tối thiểu hóa rủi ro có thể thừa hưởng lợi nhuận kỳ vọng âm. Điều này làm nổi bật một hạn chế cơ bản của việc dùng trung bình mẫu lịch sử làm ước lượng của lợi nhuận kỳ vọng: chúng cực kỳ nhiễu và có thể dẫn đến những kết quả trái với trực giác kinh tế ngay cả khi toán học tối ưu hóa vận hành đúng.

8.4 Danh mục hiệu quả: Cân bằng giữa rủi ro và lợi nhuận

8.4.1 Sự đánh đổi của nhà đầu tư

Trong hầu hết các trường hợp, tối thiểu hóa phương sai không phải là mục tiêu duy nhất của nhà đầu tư. Một cách phát biểu thực tế hơn cho phép nhà đầu tư đánh đổi giữa rủi ro và lợi nhuận kỳ vọng. Nhà đầu tư có thể sẵn sàng chấp nhận phương sai danh mục cao hơn để đổi lấy lợi nhuận kỳ vọng cao hơn.

Một danh mục hiệu quả tối thiểu hóa phương sai với điều kiện đạt được ít nhất một mức lợi nhuận kỳ vọng mục tiêu \(\bar{\mu}\). Một cách hình thức:

\[\min_{\omega} \omega^{\prime}\Sigma\omega\]

với các ràng buộc: \[\omega^{\prime}\iota = 1 \quad \text{(fully invested)}\] \[\omega^{\prime}\mu \geq \bar{\mu} \quad \text{(minimum return)}\]

Khi \(\bar{\mu}\) vượt quá lợi nhuận kỳ vọng của danh mục phương sai tối thiểu, nhà đầu tư chấp nhận nhiều rủi ro hơn để có thêm lợi nhuận.

8.4.2 Đặt lợi nhuận mục tiêu

Để minh họa, giả sử nhà đầu tư muốn đạt ít nhất mức lợi nhuận trung bình lịch sử của cổ phiếu có hiệu quả tốt nhất:

Hiện mã
mu_bar = assets["mu"].max()
print(f"Target expected return: {mu_bar:.5f}")
Target expected return: 0.01886

Đây là một mục tiêu đầy tham vọng: nó có nghĩa là đạt mức lợi nhuận của cổ phiếu duy nhất có lợi nhuận cao nhất, đồng thời hưởng lợi từ đa dạng hóa để giảm rủi ro.

8.4.3 Nghiệm giải tích

Bài toán tối ưu hóa có ràng buộc với một ràng buộc bất đẳng thức đối với lợi nhuận kỳ vọng có thể được giải bằng các điều kiện Karush-Kuhn-Tucker (KKT). Tại điểm tối ưu (giả sử ràng buộc lợi nhuận là ràng buộc chặt), nghiệm là:

\[\omega_{\text{efp}} = \frac{\lambda^*}{2}\left(\Sigma^{-1}\mu - \frac{D}{C}\Sigma^{-1}\iota\right)\]

trong đó:

  • \(C = \iota^{\prime}\Sigma^{-1}\iota\) (một đại lượng vô hướng đo “độ lớn” của ma trận hiệp phương sai nghịch đảo)
  • \(D = \iota^{\prime}\Sigma^{-1}\mu\) (phản ánh tương tác giữa lợi nhuận kỳ vọng và ma trận hiệp phương sai nghịch đảo)
  • \(E = \mu^{\prime}\Sigma^{-1}\mu\) (đo “tín hiệu” trong lợi nhuận kỳ vọng được gia quyền bằng các hiệp phương sai nghịch đảo)
  • \(\lambda^* = 2\frac{\bar{\mu} - D/C}{E - D^2/C}\) (giá bóng (shadow price) của ràng buộc lợi nhuận)

Cách khác, chúng ta có thể biểu diễn danh mục hiệu quả như một tổ hợp tuyến tính của danh mục phương sai tối thiểu và một danh mục “lợi nhuận vượt mức”:

\[\omega_{\text{efp}} = \omega_{\text{mvp}} + \frac{\lambda^*}{2}\left(\Sigma^{-1}\mu - D \cdot \omega_{\text{mvp}}\right)\]

Cách biểu diễn này cho thấy trực giác quan trọng: danh mục hiệu quả xuất phát từ danh mục phương sai tối thiểu và nghiêng về các tài sản có lợi nhuận kỳ vọng cao hơn, với mức độ nghiêng được xác định bởi \(\lambda^*\).

8.4.4 Triển khai

Hiện mã
C = iota @ sigma_inv @ iota
D = iota @ sigma_inv @ mu
E = mu @ sigma_inv @ mu
lambda_tilde = 2 * (mu_bar - D / C) / (E - (D ** 2) / C)
omega_efp = omega_mvp + (lambda_tilde / 2) * (sigma_inv @ mu - D * omega_mvp)

mu_efp = omega_efp @ mu
sigma_efp = np.sqrt(omega_efp @ sigma.values @ omega_efp)

summary_efp = pd.DataFrame({
  "mu": [mu_efp],
  "sigma": [sigma_efp],
  "type": ["Efficient Portfolio"]
})

8.4.5 So sánh các danh mục

Hình 8.4 vẽ cả hai danh mục cùng với các tài sản riêng lẻ.

Hiện mã
summaries = pd.concat(
  [assets, summary_mvp, summary_efp], ignore_index=True
)

summaries_figure = (
  ggplot(
    summaries, 
    aes(x="sigma", y="mu")
  )
  + geom_point(data=summaries.query("type.isna()"))
  + geom_point(data=summaries.query("type.notna()"), color="#F21A00", size=3)
  + geom_label(aes(label="type"), adjust_text={"arrowprops": {"arrowstyle": "-"}})
  + scale_x_continuous(labels=percent_format())
  + scale_y_continuous(labels=percent_format())
  + labs(
      x="Volatility (Standard Deviation)", 
      y="Expected Return",
      title="Efficient & minimum-variance portfolios"
    ) 
)
summaries_figure.show()
Tiêu đề: Danh mục hiệu quả và danh mục phương sai tối thiểu. Hình cho thấy các chấm lớn lần lượt chỉ vị trí của danh mục phương sai tối thiểu và danh mục hiệu quả đem lại lợi nhuận kỳ vọng của cổ phiếu có lợi nhuận cao nhất. Các chấm nhỏ chỉ vị trí của từng cổ phiếu thành phần.
Hình 8.4: Các chấm lớn lần lượt chỉ vị trí của danh mục phương sai tối thiểu và danh mục hiệu quả đem lại lợi nhuận kỳ vọng của cổ phiếu có lợi nhuận cao nhất. Các chấm nhỏ chỉ vị trí của từng cổ phiếu thành phần.

Hình này cho thấy những lợi ích đa dạng hóa đáng kể của tối ưu hóa danh mục. Danh mục hiệu quả đạt cùng mức lợi nhuận kỳ vọng với cổ phiếu riêng lẻ có lợi nhuận cao nhất nhưng với độ biến động thấp hơn đáng kể. “Bữa trưa miễn phí” từ đa dạng hóa này là nhận định trung tâm của Lý thuyết danh mục đầu tư hiện đại.

8.4.6 Vai trò của mức độ ngại rủi ro

Lợi nhuận mục tiêu \(\bar{\mu}\) ngầm phản ánh mức độ ngại rủi ro của nhà đầu tư. Các nhà đầu tư ít ngại rủi ro hơn chọn \(\bar{\mu}\) cao hơn, chấp nhận nhiều phương sai hơn để có thêm lợi nhuận kỳ vọng. Các nhà đầu tư ngại rủi ro hơn chọn \(\bar{\mu}\) gần với lợi nhuận kỳ vọng của danh mục phương sai tối thiểu.

Tương đương, khung trung bình–phương sai có thể được suy ra từ các quyết định tối ưu của nhà đầu tư có hàm thỏa dụng trung bình–phương sai: \[U(\omega) = \omega^{\prime}\mu - \frac{\gamma}{2}\omega^{\prime}\Sigma\omega\]

trong đó \(\gamma\) là hệ số ngại rủi ro tương đối. Phần Phụ lục chỉ ra rằng có một ánh xạ một–một giữa \(\gamma\) và \(\bar{\mu}\), nên cả hai cách phát biểu đều cho ra các danh mục hiệu quả giống nhau.

8.5 Đường biên hiệu quả: Thực đơn các danh mục tối ưu

Đường biên hiệu quả là tập hợp tất cả các danh mục mà không có danh mục nào khác đem lại lợi nhuận kỳ vọng cao hơn với cùng mức phương sai hoặc thấp hơn. Về mặt hình học, nó vạch ra biên trên của các tổ hợp (độ biến động, lợi nhuận kỳ vọng) có thể đạt được.

Mọi nhà đầu tư trung bình–phương sai duy lý đều nên nắm giữ một danh mục nằm trên đường biên hiệu quả. Các danh mục nằm dưới đường biên là danh mục bị trội (kém hiệu quả): tồn tại một danh mục khác có lợi nhuận cao hơn với cùng mức rủi ro, hoặc rủi ro thấp hơn với cùng mức lợi nhuận.

8.5.1 Định lý phân tách quỹ tương hỗ

Một kết quả đáng chú ý giúp đơn giản hóa việc xây dựng đường biên hiệu quả. Định lý phân tách quỹ tương hỗ (đôi khi gọi là định lý hai quỹ) phát biểu rằng bất kỳ danh mục hiệu quả nào cũng có thể được biểu diễn như một tổ hợp tuyến tính của hai danh mục hiệu quả khác nhau bất kỳ.

Một cách hình thức, nếu \(\omega_{\mu_1}\) và \(\omega_{\mu_2}\) là các danh mục hiệu quả lần lượt đem lại lợi nhuận kỳ vọng \(\mu_1\) và \(\mu_2\), thì danh mục: \[\omega_{a\mu_1 + (1-a)\mu_2} = a \cdot \omega_{\mu_1} + (1-a) \cdot \omega_{\mu_2}\]

cũng là danh mục hiệu quả và đem lại lợi nhuận kỳ vọng \(a\mu_1 + (1-a)\mu_2\).

Kết quả này có hàm ý thực tiễn sâu sắc: nhà đầu tư chỉ cần tiếp cận hai “quỹ tương hỗ” hiệu quả là có thể xây dựng bất kỳ danh mục nào nằm trên đường biên hiệu quả. Việc chọn quỹ cụ thể nào không quan trọng: hai danh mục hiệu quả khác nhau bất kỳ đều sinh ra toàn bộ đường biên.

8.5.2 Chứng minh định lý phân tách

Chứng minh suy ra trực tiếp từ nghiệm giải tích của các danh mục hiệu quả. Xét:

\[ a \cdot \omega_{\mu_1} + (1-a) \cdot \omega_{\mu_2} = \left(\frac{a\mu_1 + (1-a)\mu_2 - D/C}{E - D^2/C}\right)\left(\Sigma^{-1}\mu - \frac{D}{C}\Sigma^{-1}\iota\right) \]

Biểu thức này có đúng dạng của danh mục hiệu quả đem lại lợi nhuận kỳ vọng \(a\mu_1 + (1-a)\mu_2\), qua đó chứng minh định lý.

8.5.3 Tính đường biên hiệu quả

Dùng danh mục phương sai tối thiểu và danh mục hiệu quả của chúng ta làm hai “quỹ”, chúng ta có thể vạch ra toàn bộ đường biên hiệu quả:

Hiện mã
efficient_frontier = (
  pd.DataFrame({
    "a": np.arange(-1, 2.01, 0.01)
  })
  .assign(
    omega=lambda x: x["a"].map(lambda a: a * omega_efp + (1 - a) * omega_mvp)
  )
  .assign(
    mu=lambda x: x["omega"].map(lambda w: w @ mu),
    sigma=lambda x: x["omega"].map(lambda w: np.sqrt(w @ sigma @ w))
  )
)

Lưu ý rằng chúng ta cho phép \(a\) nằm trong khoảng từ -1 đến 2, nghĩa là một số danh mục liên quan đến việc bán khống một trong hai quỹ cơ sở và vay đòn bẩy để đầu tư vào quỹ còn lại. Điều này vạch ra cả phần trên lẫn phần dưới của hyperbol biên.

8.5.4 Trực quan hóa đường biên hiệu quả

Hình 8.5 hiển thị đường biên hiệu quả cùng với các tài sản riêng lẻ và các danh mục chuẩn.

Hiện mã
summaries = pd.concat(
  [summaries, efficient_frontier], ignore_index=True
)

summaries_figure = (
  ggplot(
    summaries, 
    aes(x="sigma", y="mu")
  )
  + geom_point(data=summaries.query("type.isna()"))
  + geom_line(data=efficient_frontier, color="blue", alpha=0.7)
  + geom_point(data=summaries.query("type.notna()"), color="#F21A00", size=3)
  + geom_label(aes(label="type"), adjust_text={"arrowprops": {"arrowstyle": "-"}})
  + scale_x_continuous(labels=percent_format())
  + scale_y_continuous(labels=percent_format())
  + labs(
      x="Volatility (Standard Deviation)", 
      y="Expected Return",
      title="The Efficient Frontier and VN30 Constituents"
    ) 
)
summaries_figure.show()
Tiêu đề: Đường biên hiệu quả được xây dựng từ dữ liệu lịch sử của các cổ phiếu thành phần chỉ số VN30. Hình cho thấy các cổ phiếu thành phần chỉ số VN30 trong biểu đồ trung bình–phương sai. Một đường hyperbol biểu thị đường biên hiệu quả của các danh mục trội hơn các khoản nắm giữ riêng lẻ, theo nghĩa chúng đem lại lợi nhuận kỳ vọng cao hơn với cùng mức độ biến động.
Hình 8.5: Các chấm lớn chỉ vị trí của danh mục phương sai tối thiểu và danh mục hiệu quả. Các chấm nhỏ chỉ vị trí của từng cổ phiếu thành phần.

Đường biên hiệu quả có dạng hyperbol đặc trưng. Điểm ngoài cùng bên trái là danh mục phương sai tối thiểu. Khi đi lên và sang phải dọc theo đường biên, lợi nhuận kỳ vọng tăng nhưng độ biến động cũng tăng. Phần trên của hyperbol (phía trên danh mục phương sai tối thiểu) là phần “hiệu quả”: các danh mục này đem lại lợi nhuận cao nhất ở mỗi mức rủi ro. Phần dưới là phần “phi hiệu quả”: các danh mục này bị trội bởi các danh mục đối xứng của chúng trên phần trên.

Hình cũng cho thấy đa dạng hóa cải thiện đáng kể như thế nào so với các vị thế cổ phiếu riêng lẻ. Gần như tất cả các cổ phiếu riêng lẻ đều nằm sâu bên trong đường biên hiệu quả, nghĩa là nhà đầu tư có thể đạt cùng mức lợi nhuận kỳ vọng với rủi ro thấp hơn nhiều, hoặc lợi nhuận kỳ vọng cao hơn nhiều với cùng mức rủi ro, chỉ đơn giản bằng cách đa dạng hóa.

8.6 Những điểm chính

Chương này đã giới thiệu các khái niệm của Lý thuyết danh mục đầu tư hiện đại. Các nhận định chính là:

  1. Rủi ro danh mục phụ thuộc vào tương quan: Phương sai của một danh mục không đơn giản là trung bình có trọng số của các phương sai riêng lẻ. Hiệp phương sai giữa các tài sản đóng vai trò quan trọng, tạo ra cơ hội đa dạng hóa.

  2. Đa dạng hóa là “bữa trưa miễn phí duy nhất” trong tài chính: Bằng cách kết hợp các tài sản không biến động hoàn toàn cùng nhau, nhà đầu tư có thể giảm rủi ro mà không hy sinh lợi nhuận kỳ vọng. Nhận định này là nền tảng của thực hành đầu tư hiện đại.

  3. Danh mục phương sai tối thiểu tối thiểu hóa rủi ro: Danh mục này chỉ phụ thuộc vào ma trận hiệp phương sai và đóng vai trò là mốc so sánh quan trọng. Nó thể hiện cách ít rủi ro nhất để đầu tư toàn bộ vốn vào các tài sản rủi ro.

  4. Danh mục hiệu quả cân bằng giữa rủi ro và lợi nhuận: Bằng cách chấp nhận nhiều phương sai hơn, nhà đầu tư có thể đạt lợi nhuận kỳ vọng cao hơn. Danh mục hiệu quả là những danh mục đem lại sự đánh đổi tốt nhất có thể.

  5. Đường biên hiệu quả đặc trưng cho các danh mục tối ưu: Đường biên này trong không gian trung bình–độ lệch chuẩn thể hiện thực đơn các lựa chọn tối ưu dành cho nhà đầu tư trung bình–phương sai.

  6. Phân tách hai quỹ giúp đơn giản hóa việc triển khai: Bất kỳ danh mục hiệu quả nào cũng có thể được xây dựng từ hai danh mục hiệu quả khác nhau bất kỳ, giảm gánh nặng tính toán của tối ưu hóa danh mục.

Nhìn về phía trước, nhiều vấn đề phức tạp quan trọng phát sinh trong thực tế. Thứ nhất, các đầu vào của tối ưu hóa danh mục (lợi nhuận kỳ vọng và hiệp phương sai) phải được ước lượng từ dữ liệu, và sai số ước lượng có thể ảnh hưởng mạnh đến hiệu quả danh mục. Thứ hai, các ràng buộc thực tế như chi phí giao dịch, hạn chế bán khống và giới hạn vị thế làm thay đổi bài toán tối ưu hóa. Thứ ba, giả định rằng nhà đầu tư chỉ quan tâm đến trung bình và phương sai có thể quá hạn chế khi lợi nhuận không tuân theo phân phối chuẩn hoặc khi nhà đầu tư có sở thích phức tạp hơn. Chúng ta sẽ đề cập các phần mở rộng này trong các chương tiếp theo.