5  Xây dựng lãi suất phi rủi ro tại Việt Nam

Note

Trong chương này, chúng ta sẽ giải quyết một vấn đề đơn giản nhưng quan trọng: làm thế nào để xây dựng chuỗi lãi suất phi rủi ro cho nghiên cứu tài chính thực nghiệm tại Việt Nam. Chúng ta sẽ đánh giá các chỉ số thay thế hiện có, chẳng hạn như lợi suất trái phiếu chính phủ, lãi suất liên ngân hàng qua đêm và lãi suất chính sách của Ngân hàng Nhà nước Việt Nam (SBV), phát triển các quy trình nội suy và điều chỉnh tần số, và định lượng độ nhạy của các kết quả định giá tài sản chính đối với việc lựa chọn chỉ số thay thế lãi suất phi rủi ro.

Lãi suất phi rủi ro là con số quan trọng nhất trong lĩnh vực tài chính. Nó là cơ sở cho lợi nhuận vượt trội, lãi suất chiết khấu, phí bảo hiểm nhân tố, chi phí vốn chủ sở hữu, đánh giá hiệu suất và định giá phái sinh. Mặc dù đóng vai trò nền tảng như vậy, lãi suất phi rủi ro thường được coi là một con số cố định: một con số được lấy từ cơ sở dữ liệu và đưa vào các công thức mà không cần suy nghĩ thêm. Tại các thị trường phát triển với thị trường chứng khoán chính phủ sâu rộng và thanh khoản cao, cách tiếp cận hời hợt này thường không gây hại. Nhưng ở Việt Nam thì không phải vậy.

Thị trường trái phiếu của Việt Nam khá mỏng, phân mảnh và đặc trưng bởi việc phát hành trái phiếu chính phủ ngắn hạn không đều đặn. Không có một lãi suất phi rủi ro duy nhất, được chấp nhận rộng rãi, tương tự như lãi suất tín phiếu kho bạc kỳ hạn 1 tháng – vốn là nền tảng cho hầu hết các nghiên cứu định giá tài sản tại các thị trường phát triển. Thay vào đó, các nhà nghiên cứu phải lựa chọn giữa các chỉ số thay thế không hoàn hảo, mỗi chỉ số đều có những ưu điểm và hạn chế riêng. Sự lựa chọn này không hề đơn giản: các chỉ số thay thế khác nhau có thể tạo ra lợi nhuận vượt trội, phí bảo hiểm nhân tố và ước tính định giá khác nhau đáng kể.

Chương này trình bày một phương pháp tiếp cận có hệ thống để xây dựng lãi suất phi rủi ro. Chúng ta bắt đầu với các yêu cầu lý thuyết đối với một tài sản phi rủi ro, sau đó đánh giá các chỉ số thay thế hiện có của Việt Nam so với các yêu cầu này. Chúng ta xây dựng chuỗi lãi suất phi rủi ro hàng tháng theo các thông số kỹ thuật khác nhau, trình bày các kỹ thuật điều chỉnh tần số và nội suy, và tiến hành phân tích độ nhạy để định lượng ảnh hưởng của việc lựa chọn chỉ số thay thế đến các kết quả tiếp theo.

5.1 Vai trò của lãi suất phi rủi ro trong tài chính

5.1.1 Lợi nhuận vượt mức

Việc sử dụng cơ bản nhất của tỷ lệ không rủi ro là tính toán lợi nhuận vượt mức. Lợi nhuận vượt quá trên tài sản \(i\) trong kỳ \(t\) là:

\[ r_{i,t}^{e} = r_{i,t} - r_{f,t} \tag{5.1}\]

trong đó \(r_{i,t}\) là lợi nhuận thô và \(r_{f,t}\) là tỷ lệ không rủi ro trong cùng một khoảng thời gian, bằng cùng một loại tiền tệ và theo cùng một quy ước lãi kép. Lợi nhuận vượt mức cô lập khoản bồi thường cho rủi ro gánh chịu, loại bỏ lợi nhuận có thể kiếm được mà không phải chịu rủi ro.

Việc đo sai \(r{f,t}\) trực tiếp làm ô nhiễm mọi quan sát lợi nhuận dư thừa và mở rộng ra, mọi số lượng bắt nguồn từ lợi nhuận vượt mức. Nếu \(r_{f,t}\) bị thiên vị đi lên một cách có hệ thống, lợi nhuận vượt quá bị đánh giá thấp một cách có hệ thống, phí bảo hiểm nhân tố bị nén và chi phí vốn chủ sở hữu bị phóng đại.

5.1.2 Phí bảo hiểm yếu tố

Trong mô hình ba yếu tố Fama and French (1993), phí bảo hiểm rủi ro thị trường là:

\[ \text{MKTRF}_t = r_{m,t} - r_{f,t} \tag{5.2}\]

trong đó \(r_{m,t}\) là lợi suất thị trường được tính theo giá trị. Phần bù rủi ro theo quy mô (SMB) và giá trị (HML) được định nghĩa là lợi suất của các danh mục đầu tư mua-bán và không phụ thuộc trực tiếp vào \(r_{f,t}\). Tuy nhiên, hệ số chặn (alpha) từ hồi quy chuỗi thời gian của lợi suất vượt trội của bất kỳ danh mục đầu tư nào dựa trên các yếu tố lại phụ thuộc vào \(r_{f,t}\) thông qua biến phụ thuộc. Lãi suất phi rủi ro bị sai lệch sẽ làm dịch chuyển tất cả các alpha một cách đồng đều.

5.1.3 Tỷ lệ chiết khấu và định giá

Mô hình dòng tiền chiết khấu định giá một công ty như sau:

\[ V_0 = \sum_{t=1}^{\infty} \frac{E[CF_t]}{(1 + r_{WACC})^t} \tag{5.3}\]

trong đó chi phí vốn bình quân gia quyền (WACC) phụ thuộc vào chi phí vốn chủ sở hữu, do đó phụ thuộc vào tỷ lệ phi rủi ro thông qua Mô hình định giá tài sản vốn:

\[ r_{e} = r_f + \beta_i (\bar{r}_m - r_f) \tag{5.4}\]

Sai số 100 điểm cơ bản trong \(r_f\) sẽ ảnh hưởng đến chi phí vốn chủ sở hữu và có thể làm thay đổi giá trị hiện tại của dòng tiền dài hạn từ 10-20%, tùy thuộc vào đặc điểm thời gian đáo hạn.

5.1.4 Đánh giá hiệu suất

Các thước đo hiệu suất được điều chỉnh theo rủi ro, chẳng hạn như hệ số Sharpe:

\[ \text{SR} = \frac{\bar{r}_p - \bar{r}_f}{\sigma(r_p - r_f)} \tag{5.5}\]

và alpha của Jensen:

\[ \alpha = \bar{r}_p - r_f - \hat{\beta}_p (\bar{r}_m - r_f) \tag{5.6}\]

Cả hai đều phụ thuộc trực tiếp vào \(r_f\). Tỷ lệ Sharpe đặc biệt nhạy cảm vì mẫu số (biến động lợi nhuận vượt mức) cũng bị ảnh hưởng bởi mức độ và sự thay đổi của \(r_f\).

5.2 “Không rủi ro” có nghĩa là gì trong thực tế?

Một tài sản thực sự không có rủi ro phải đáp ứng đồng thời bốn điều kiện (Table 5.1).

Table 5.1: Yêu cầu đối với tài sản không rủi ro
Điều kiện Định nghĩa Thử thách thực tế
Không có rủi ro vỡ nợ Tổ chức phát hành không thể không thanh toán Chỉ nợ có chủ quyền bằng đồng tiền của chính mình mới đủ điều kiện
Dòng tiền đã biết Khoản thanh toán là chắc chắn trước Loại trừ các công cụ lãi suất thả nổi
Không có rủi ro tái đầu tư Thời gian đáo hạn phù hợp với thời gian đầu tư Yêu cầu chứng khoán không có phiếu giảm giá có kỳ hạn chính xác
Tính thanh khoản cao Có thể giao dịch với chi phí thấp Thị trường trái phiếu chính phủ mỏng thất bại trong bài kiểm tra này

Không có tài sản nào trong thế giới thực đáp ứng hoàn hảo cả bốn điều kiện. Ngay cả trong thị trường trái phiếu chính phủ sâu nhất, vẫn có một khoản phí thanh khoản cao hơn đối với chứng khoán ngoài hoạt động và lợi suất thuận tiện trong các đợt phát hành đang hoạt động (Krishnamurthy and Vissing-Jorgensen 2012). Câu hỏi thực tế là: công cụ hiện có nào gần nhất?

5.2.1 Proxy lý tưởng

Proxy tỷ lệ không rủi ro lý tưởng cho nghiên cứu định giá tài sản thực nghiệm có các thuộc tính sau:

  1. Kỳ hạn ngắn: Giảm thiểu rủi ro tái đầu tư và ô nhiễm phí bảo hiểm có kỳ hạn. Lựa chọn thông thường là đáo hạn 1 tháng.
  2. Được chính phủ hậu thuẫn: Loại bỏ rủi ro tín dụng (bằng nội tệ).
  3. Giao dịch tích cực: Đảm bảo rằng lợi nhuận quan sát được phản ánh các điều kiện thị trường hiện tại.
  4. Phát hành thường xuyên: Cung cấp một chuỗi thời gian liên tục mà không có khoảng trống.
  5. Phương pháp nhất quán: Tính toán năng suất rõ ràng và có thể so sánh theo thời gian.

5.3 Proxy có sẵn tại Việt Nam

Cơ sở hạ tầng tài chính của Việt Nam cung cấp một số công cụ ứng cử viên, không có công cụ nào đáp ứng hoàn toàn tất cả các tiêu chí. Chúng tôi lần lượt đánh giá từng công cụ.

5.3.1 Lợi suất trái phiếu chính phủ

Chính phủ Việt Nam phát hành trái phiếu trong một loạt các kỳ hạn thông qua Kho bạc Nhà nước và Thị trường Trái phiếu Việt Nam (VBM). Các đặc điểm chính (Table 5.2)

Table 5.2: Đặc điểm trái phiếu chính phủ Việt Nam
Tính năng Mô tả
Cơ quan phát hành Kho bạc Nhà nước Việt Nam
Thị trường sơ cấp Đấu giá thông qua HNX
Kỳ hạn có sẵn 1, 2, 3, 5, 7, 10, 15, 20, 30 năm
Kỳ hạn ngắn nhất 1 năm (đôi khi có kỳ hạn ngắn hơn thông qua tín phiếu kho bạc)
Cơ cấu lãi suất Cố định, nửa năm một lần
Tần suất phát hành Đấu giá định kỳ hàng tuần/hai tuần một lần
Thanh khoản thị trường thứ cấp Tập trung vào phân khúc 3-5 năm; phân khúc ngắn hạn khá ít
Dữ liệu có sẵn Có thể truy cập qua DataCore.vn

Hạn chế chính của lợi suất trái phiếu chính phủ khi được sử dụng như một thước đo lãi suất phi rủi ro là sự khan hiếm các chứng khoán có kỳ hạn ngắn. Trái phiếu kỳ hạn một năm là chuẩn mực được phát hành thường xuyên ngắn nhất, và lợi suất của chúng bao gồm một khoản phí kỳ hạn mà không có trong lãi suất phi rủi ro thực sự. Tín phiếu kho bạc (kỳ hạn < 1 năm) được phát hành không thường xuyên và với số lượng nhỏ, khiến chúng không phù hợp để sử dụng như một chuỗi liên tục.

5.3.2 Lãi suất qua đêm liên ngân hàng

Thị trường liên ngân hàng Việt Nam thiết lập lãi suất cho vay qua đêm giữa các ngân hàng thương mại. Lãi suất qua đêm được Ngân hàng Nhà nước Việt Nam (SBV) công bố.

Ưu điểm: Thời hạn rất ngắn (qua đêm), tần suất cao (hàng ngày), phản ánh chi phí vay thực tế trong hệ thống tài chính.

Hạn chế: Phản ánh rủi ro tín dụng của ngành ngân hàng (rủi ro vỡ nợ liên ngân hàng, mặc dù nhỏ), có thể biến động mạnh trong thời kỳ khủng hoảng thanh khoản và không tương ứng với một công cụ tài chính không lãi suất có thể giao dịch được.

5.3.3 Lãi suất chính sách của Ngân hàng Nhà nước (SBV)

Ngân hàng Nhà nước Việt Nam quy định một số tỷ giá hối đoái do chính phủ quản lý (Table 5.3).

Table 5.3: Lãi suất chính sách của Ngân hàng Nhà nước (SBV)
Tỷ lệ Vai trò Tần suất thay đổi
Lãi suất tái cấp vốn Lãi suất cho vay của Ngân hàng Nhà nước Việt Nam (SBV) đối với các ngân hàng Không thường xuyên (các cuộc họp chính sách)
Tỷ lệ chiết khấu Tỷ lệ chiết khấu lại cho các loại giấy tờ đủ điều kiện Không thường xuyên
Lãi suất cho vay qua đêm Mức trần cho vay liên ngân hàng qua đêm Không thường xuyên
Mức trần lãi suất tiền gửi Lãi suất tối đa mà ngân hàng có thể trả cho tiền gửi Không thường xuyên

Ưu điểm: Ổn định (ít thay đổi), phản ánh lập trường chính sách tiền tệ, có sẵn trong toàn bộ giai đoạn nghiên cứu.

Hạn chế: Không phải là lợi nhuận được giao dịch (tức là không nhà đầu tư nào thực sự có thể kiếm được lãi suất theo chính sách). Đại diện cho mục tiêu quản lý, không phải giá cân bằng thị trường. Phản ứng với các điều kiện kinh tế vĩ mô với độ trễ.

5.3.4 Lãi suất tiền gửi tiết kiệm

Các ngân hàng thương mại cung cấp tiền gửi có kỳ hạn với lãi suất chịu sự giám sát của Ngân hàng Nhà nước Việt Nam (SBV). Lãi suất tiền gửi ngắn hạn (1 tháng hoặc 3 tháng) đôi khi được sử dụng như một thước đo không chính thức cho lãi suất không rủi ro trong thực tiễn.

Ưu điểm: Mang lại lợi nhuận đầu tư cho các nhà đầu tư nhỏ, dễ dàng tiếp cận.

Hạn chế: Phụ thuộc vào rủi ro tín dụng của ngân hàng, có thể khác nhau giữa các ngân hàng, mức trần tạo ra một mức giá có thể không phản ánh tỷ lệ cân bằng thực tế, không được tiêu chuẩn hóa cho mục đích nghiên cứu.

5.3.5 So sánh tóm tắt

Table 5.4: So sánh các chỉ số lãi suất phi rủi ro tại Việt Nam
Ủy quyền Rủi ro vỡ nợ Phù hợp kỳ hạn Tính liên tục Tính thanh khoản Khuyến nghị sử dụng
Trái phiếu chính phủ kỳ hạn 1 năm Tối thiểu (chủ quyền) Kém (1 năm so với 1 tháng) Tốt Trung bình Phân tích hàng năm/hàng quý
Tín phiếu kho bạc (< 1 năm) Tối thiểu (chính phủ) Tốt (khi có sẵn) Kém (phát hành không thường xuyên) Thấp Khi có sẵn, được ưu tiên
Lãi suất qua đêm liên ngân hàng Thấp (liên ngân hàng) Rất ngắn (qua đêm) Xuất sắc Cao (liên ngân hàng) Phân tích hàng ngày/hàng tháng
Lãi suất tái cấp vốn SBV Không có (do chính quyền quản lý) Không áp dụng (không giao dịch) Xuất sắc Không áp dụng Chỉ so sánh dài hạn
Lãi suất tiền gửi ngân hàng 1 tháng Thấp-trung bình (ngân hàng) Tốt (1 tháng) Tốt Không áp dụng DCF của chuyên gia

5.4 Xây dựng chuỗi lãi suất phi rủi ro

Giờ đây, chúng ta sẽ xây dựng các chuỗi lãi suất phi rủi ro hàng tháng thay thế và xem xét các đặc tính của chúng.

5.4.1 Tải và Làm sạch Dữ liệu Lãi suất

import pandas as pd
import numpy as np

# Assume rf_data contains: date, rate_type, rate_annual (annualized, in %)
rf_raw = pd.read_parquet("data/risk_free_rates.parquet")

# Preview available rate types
print("Available rate types:")
print(rf_raw["rate_type"].value_counts())
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(8, 4.5))

colors = {
    "govt_bond_1y": "#2C73D2",
    "interbank_overnight": "#FF6B6B",
    "sbv_refinancing": "#5DCEAF",
    "tbill_3m": "#FFB347",
    "deposit_1m": "#B19CD9"
}

for rate_type, color in colors.items():
    subset = rf_raw[rf_raw["rate_type"] == rate_type].sort_values("date")
    if len(subset) > 0:
        ax.plot(
            subset["date"], subset["rate_annual"],
            label=rate_type.replace("_", " ").title(),
            color=color, linewidth=1.2, alpha=0.85
        )

ax.set_ylabel("Annualized Rate (%)")
ax.set_xlabel("")
ax.legend(frameon=False, fontsize=9, loc="upper right")
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
plt.tight_layout()
plt.show()
Figure 5.1

5.4.2 Căn chỉnh tần số

Các bài kiểm tra định giá tài sản yêu cầu lãi suất phi rủi ro hàng tháng. Dữ liệu thô có thể được cung cấp hàng ngày, hàng tuần hoặc không đều đặn. Chúng tôi sử dụng logic chuyển đổi sau:

Từ hàng ngày sang hàng tháng: Lấy mức giá trung bình hàng ngày trong mỗi tháng, sau đó chuyển đổi từ giá trị hàng năm sang giá trị hàng tháng.

Từ không đều đến hàng tháng: Đối với các chuỗi dữ liệu có khoảng trống (ví dụ: tín phiếu kho bạc), hãy điền dữ liệu quan sát gần nhất vào trước, sau đó tính trung bình trong mỗi tháng.

Chuyển đổi từ lãi suất hàng năm sang hàng tháng: Theo lãi kép đơn giản, \(r_f^{hàng tháng} = r_f^{hàng năm} / 12\). Theo lãi kép liên tục, \(r_f^{hàng tháng} = r_f^{hàng năm} / 12\) (vì lãi suất liên tục có tính chất cộng). Chúng ta sử dụng lãi kép đơn giản để nhất quán với quy ước rằng lợi nhuận cổ phiếu được tính toán như lợi nhuận trung bình cộng.

# Construct monthly risk-free rates from each proxy

def construct_monthly_rf(rf_raw, rate_type, method="mean"):
    """
    Convert raw rate data to monthly frequency.

    Parameters
    ----------
    rf_raw : pd.DataFrame
        Raw rate data with columns: date, rate_type, rate_annual
    rate_type : str
        Which rate proxy to use
    method : str
        Aggregation method: 'mean', 'last', or 'first'

    Returns
    -------
    pd.DataFrame
        Monthly risk-free rate with columns: date, rf_monthly
    """
    subset = (
        rf_raw[rf_raw["rate_type"] == rate_type]
        .sort_values("date")
        .set_index("date")
    )

    # Forward-fill gaps (for irregular series)
    subset = subset.resample("D").ffill()

    # Aggregate to monthly
    if method == "mean":
        monthly = subset.resample("ME")["rate_annual"].mean()
    elif method == "last":
        monthly = subset.resample("ME")["rate_annual"].last()
    else:
        monthly = subset.resample("ME")["rate_annual"].first()

    monthly = monthly.reset_index()
    monthly.columns = ["date", "rf_annual"]

    # Convert annualized rate (%) to monthly decimal
    monthly["rf_monthly"] = monthly["rf_annual"] / 100 / 12

    return monthly[["date", "rf_monthly", "rf_annual"]]

# Construct series for each proxy
rf_proxies = {}
for proxy in ["govt_bond_1y", "interbank_overnight", "sbv_refinancing"]:
    rf_proxies[proxy] = construct_monthly_rf(rf_raw, proxy)
    rf_proxies[proxy]["proxy"] = proxy

rf_all = pd.concat(rf_proxies.values(), ignore_index=True)

5.4.3 Xử lý dữ liệu bị thiếu và các điểm gián đoạn cấu trúc

Dữ liệu giá cước Việt Nam có thể có khoảng trống do thị trường đóng cửa, báo cáo thay đổi hoặc giới thiệu các công cụ mới. Chúng tôi xử lý những vấn đề này một cách có hệ thống:

# Check coverage for each proxy
coverage = (
    rf_all
    .groupby("proxy")
    .agg(
        start_date=("date", "min"),
        end_date=("date", "max"),
        n_months=("rf_monthly", "count"),
        n_missing=("rf_monthly", lambda x: x.isna().sum()),
        avg_rate_pct=("rf_annual", "mean")
    )
    .round(2)
)

print(coverage)

Đối với các khoảng thời gian mà proxy chính không khả dụng, chúng tôi xây dựng một chuỗi kết hợp bằng cách sử dụng hệ thống phân cấp ưu tiên:

def construct_blended_rf(rf_proxies, priority=None):
    """
    Construct a blended monthly risk-free rate using proxy priority.

    Priority order (default):
    1. Treasury bills (shortest maturity, sovereign)
    2. Interbank overnight (short maturity, high frequency)
    3. 1-year government bond (sovereign, regular)
    4. SBV refinancing rate (fallback)
    """
    if priority is None:
        priority = [
            "tbill_3m",
            "interbank_overnight",
            "govt_bond_1y",
            "sbv_refinancing"
        ]

    # Create full date range
    all_dates = pd.date_range(
        start=min(df["date"].min() for df in rf_proxies.values()),
        end=max(df["date"].max() for df in rf_proxies.values()),
        freq="ME"
    )

    blended = pd.DataFrame({"date": all_dates})
    blended["rf_monthly"] = np.nan
    blended["source"] = ""

    for proxy in priority:
        if proxy in rf_proxies:
            proxy_df = rf_proxies[proxy][["date", "rf_monthly"]].rename(
                columns={"rf_monthly": f"rf_{proxy}"}
            )
            blended = blended.merge(proxy_df, on="date", how="left")

            # Fill missing values from this proxy
            mask = blended["rf_monthly"].isna() & blended[f"rf_{proxy}"].notna()
            blended.loc[mask, "rf_monthly"] = blended.loc[mask, f"rf_{proxy}"]
            blended.loc[mask, "source"] = proxy

            blended = blended.drop(columns=[f"rf_{proxy}"])

    return blended

rf_blended = construct_blended_rf(rf_proxies)
Table 5.5: Data Source Composition of Blended Risk-Free Rate Series
source_comp = (
    rf_blended
    .groupby("source")
    .agg(
        n_months=("date", "count"),
        pct=("date", lambda x: len(x) / len(rf_blended) * 100)
    )
    .round(1)
    .sort_values("n_months", ascending=False)
)

source_comp

5.4.4 Các Đặc Điểm Của Dãy Được Xây Dựng

Table 5.6: Summary Statistics of Monthly Risk-Free Rate Proxies
rf_wide = rf_all.pivot_table(
    index="date", columns="proxy", values="rf_monthly"
)

summary = rf_wide.describe(percentiles=[0.10, 0.25, 0.50, 0.75, 0.90]).T
summary = summary[["mean", "std", "min", "10%", "50%", "90%", "max"]]
summary.columns = [
    "Mean", "Std", "Min", "P10", "Median", "P90", "Max"
]

# Convert to annualized percentage for interpretability
(summary * 12 * 100).round(2)
fig, axes = plt.subplots(2, 1, figsize=(8, 6), sharex=True)

# Level
for proxy, color in [
    ("govt_bond_1y", "#2C73D2"),
    ("interbank_overnight", "#FF6B6B"),
    ("sbv_refinancing", "#5DCEAF")
]:
    subset = rf_proxies[proxy].sort_values("date")
    axes[0].plot(
        subset["date"], subset["rf_monthly"] * 100,
        label=proxy.replace("_", " ").title(),
        color=color, linewidth=1
    )
axes[0].set_ylabel("Monthly Rate (%)")
axes[0].legend(frameon=False, fontsize=9)
axes[0].spines["top"].set_visible(False)
axes[0].spines["right"].set_visible(False)

# Pairwise spread: govt bond - interbank
merged = rf_proxies["govt_bond_1y"][["date", "rf_monthly"]].merge(
    rf_proxies["interbank_overnight"][["date", "rf_monthly"]],
    on="date", suffixes=("_bond", "_interbank")
)
merged["spread"] = (merged["rf_monthly_bond"] - merged["rf_monthly_interbank"]) * 100

axes[1].fill_between(
    merged["date"], merged["spread"], 0,
    where=merged["spread"] > 0, alpha=0.4, color="#2C73D2", label="Bond > Interbank"
)
axes[1].fill_between(
    merged["date"], merged["spread"], 0,
    where=merged["spread"] <= 0, alpha=0.4, color="#FF6B6B", label="Bond < Interbank"
)
axes[1].axhline(0, color="black", linewidth=0.5)
axes[1].set_ylabel("Spread (% monthly)")
axes[1].set_xlabel("")
axes[1].legend(frameon=False, fontsize=9)
axes[1].spines["top"].set_visible(False)
axes[1].spines["right"].set_visible(False)

plt.tight_layout()
plt.show()
Figure 5.2

Sự chênh lệch giữa các proxy là nhiều thông tin. Chênh lệch dương nhất quán (lợi suất trái phiếu > lãi suất liên ngân hàng) phản ánh phí bảo hiểm kỳ hạn được nhúng trong trái phiếu kỳ hạn 1 năm. Các giai đoạn mà lãi suất liên ngân hàng tăng vọt trên lợi suất trái phiếu thường tương ứng với cuộc khủng hoảng thanh khoản trong hệ thống ngân hàng.

5.4.5 Tương quan giữa các proxy

Table 5.7: Pairwise Correlation of Monthly Risk-Free Rate Proxies
rf_corr = rf_wide.corr().round(3)
rf_corr.index = [x.replace("_", " ").title() for x in rf_corr.index]
rf_corr.columns = [x.replace("_", " ").title() for x in rf_corr.columns]
rf_corr

Mối tương quan cao (> 0,8) giữa các proxy cho thấy mức độ và hướng của biến động lãi suất được nắm bắt tương tự bởi tất cả các proxy. Tương quan thấp sẽ chỉ ra rằng việc lựa chọn proxy tạo ra sự thay đổi đặc thù đáng kể thành lợi nhuận vượt mức.

5.5 Xây dựng lợi nhuận dư thừa

Với chuỗi tỷ giá không rủi ro trong tay, giờ đây chúng tôi xây dựng lợi nhuận vượt mức cho các cổ phiếu riêng lẻ và cho danh mục đầu tư thị trường.

5.5.1 Quy ước phù hợp

Xây dựng lại lợi nhuận vượt trội đòi hỏi tính nhất quán chặt chẽ trên ba chiều kích (Table 5.8).

Table 5.8: Yêu cầu nhất quán cho lợi nhuận vượt trội
Chiều kích Yêu cầu Lỗi phổ biến
Tỷ giá Cùng một loại tiền tệ cho \(r_i\)\(r_f\) Sử dụng tỷ giá USD cho lợi nhuận định danh bằng VND
Tần suất Cùng kỳ hạn nắm giữ Sử dụng \(r_f\) định danh hàng năm với \(r_i\) hàng tháng
Tích lũy Cùng quy ước Trộn kết quả lôg và toán
# Load monthly stock returns
stock_returns = pd.read_parquet("data/monthly_returns.parquet")
# Assume columns: symbol, date (month-end), ret

# Merge with risk-free rate
# Use the blended series as the baseline
rf_for_merge = rf_blended[["date", "rf_monthly"]].rename(
    columns={"rf_monthly": "rf"}
)

stock_returns = stock_returns.merge(rf_for_merge, on="date", how="left")

# Compute excess returns
stock_returns["ret_excess"] = stock_returns["ret"] - stock_returns["rf"]

5.5.2 Lợi nhuận dư thừa thị trường

# Value-weighted market return
market_monthly = (
    stock_returns
    .groupby("date")
    .apply(
        lambda g: np.average(
            g["ret"].dropna(),
            weights=g["mktcap"].loc[g["ret"].dropna().index]
        ) if g["ret"].dropna().shape[0] > 0 else np.nan,
        include_groups=False
    )
    .reset_index(name="rm")
)

market_monthly = market_monthly.merge(rf_for_merge, on="date", how="left")
market_monthly["mktrf"] = market_monthly["rm"] - market_monthly["rf"]
fig, ax = plt.subplots(figsize=(8, 3.5))

ax.bar(
    market_monthly["date"], market_monthly["mktrf"] * 100,
    color=np.where(market_monthly["mktrf"] >= 0, "#2C73D2", "#FF6B6B"),
    width=25, alpha=0.8
)
ax.axhline(0, color="black", linewidth=0.5)
ax.set_ylabel("Market Excess Return (%)")
ax.set_xlabel("")
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
plt.tight_layout()
plt.show()
Figure 5.3

5.6 Phân tích độ nhạy: Lựa chọn proxy quan trọng như thế nào?

Đây là câu hỏi thực nghiệm trung tâm của chương. Nếu các proxy không rủi ro khác nhau về cơ bản tạo ra cùng một kết quả xuôi dòng, thì sự lựa chọn là không quan trọng. Nếu chúng tạo ra các kết quả khác nhau, các nhà nghiên cứu phải biện minh cho sự lựa chọn của họ và báo cáo tính mạnh mẽ.

5.6.1 Ảnh hưởng đến phí bảo hiểm vốn chủ sở hữu

Table 5.9: Annualized Equity Premium Under Alternative Risk-Free Proxies
results = []
for proxy_name, proxy_df in rf_proxies.items():
    rf_merge = proxy_df[["date", "rf_monthly"]].rename(
        columns={"rf_monthly": "rf_proxy"}
    )
    merged = market_monthly[["date", "rm"]].merge(rf_merge, on="date", how="inner")
    merged["mktrf_proxy"] = merged["rm"] - merged["rf_proxy"]

    n_months = merged["mktrf_proxy"].count()
    mean_monthly = merged["mktrf_proxy"].mean()
    std_monthly = merged["mktrf_proxy"].std()
    sharpe = mean_monthly / std_monthly if std_monthly > 0 else np.nan
    t_stat = mean_monthly / (std_monthly / np.sqrt(n_months))

    results.append({
        "Proxy": proxy_name.replace("_", " ").title(),
        "N Months": n_months,
        "Mean (% ann.)": round(mean_monthly * 12 * 100, 2),
        "Std (% ann.)": round(std_monthly * np.sqrt(12) * 100, 2),
        "Sharpe (ann.)": round(sharpe * np.sqrt(12), 3),
        "t-stat": round(t_stat, 2)
    })

pd.DataFrame(results).style.hide(axis="index")

5.6.2 Ảnh hưởng đến phí bảo hiểm yếu tố

Table 5.10: Factor Premium Sensitivity to Risk-Free Proxy (Annualized %)
# Load or construct factor returns
# Assume factors_monthly has: date, smb, hml (these are long-short, rf-independent)
# Only MKTRF changes with the proxy

factors_monthly = pd.read_parquet("data/factors_monthly.parquet")

for proxy_name, proxy_df in rf_proxies.items():
    rf_merge = proxy_df[["date", "rf_monthly"]].rename(
        columns={"rf_monthly": "rf_proxy"}
    )
    factors_merged = factors_monthly.merge(rf_merge, on="date", how="inner")
    factors_merged = factors_merged.merge(
        market_monthly[["date", "rm"]], on="date", how="inner"
    )
    factors_merged[f"mktrf_{proxy_name}"] = (
        factors_merged["rm"] - factors_merged["rf_proxy"]
    )

    mean_mktrf = factors_merged[f"mktrf_{proxy_name}"].mean() * 12 * 100
    mean_smb = factors_merged["smb"].mean() * 12 * 100
    mean_hml = factors_merged["hml"].mean() * 12 * 100

    print(
        f"{proxy_name:>25s}: MKTRF = {mean_mktrf:6.2f}%, "
        f"SMB = {mean_smb:6.2f}%, HML = {mean_hml:6.2f}%"
    )

Lưu ý rằng SMB và HML được xây dựng dưới dạng lợi nhuận danh mục đầu tư dài hạn và phải giống hệt nhau bất kể proxy không có rủi ro. Chỉ có MKTRF khác nhau. Tuy nhiên, nếu nhà nghiên cứu sử dụng tỷ lệ không rủi ro để tính toán lợi nhuận vượt mức cổ phiếu riêng lẻ trước khi sắp xếp thành danh mục yếu tố, sự khác biệt nhỏ trong việc sắp xếp có thể phát sinh.

5.6.3 Ảnh hưởng đến ước tính alpha

Việc lựa chọn proxy không rủi ro ảnh hưởng đến ước tính alpha cho bất kỳ danh mục đầu tư nào được đánh giá dựa trên mô hình yếu tố. Chúng tôi minh họa điều này bằng cách ước tính alpha của danh mục đầu tư động lượng theo mỗi proxy.

Table 5.11: Momentum Portfolio Alpha Sensitivity to Risk-Free Proxy
import statsmodels.api as sm

# Assume momentum_ret contains: date, mom_ret (raw return of WML portfolio)
momentum_ret = pd.read_parquet("data/momentum_returns.parquet")

alpha_results = []
for proxy_name, proxy_df in rf_proxies.items():
    rf_merge = proxy_df[["date", "rf_monthly"]].rename(
        columns={"rf_monthly": "rf_proxy"}
    )

    merged = (
        momentum_ret
        .merge(rf_merge, on="date", how="inner")
        .merge(market_monthly[["date", "rm"]], on="date", how="inner")
        .merge(factors_monthly[["date", "smb", "hml"]], on="date", how="inner")
    )

    merged["mom_excess"] = merged["mom_ret"] - merged["rf_proxy"]
    merged["mktrf"] = merged["rm"] - merged["rf_proxy"]

    X = sm.add_constant(merged[["mktrf", "smb", "hml"]])
    y = merged["mom_excess"]
    model = sm.OLS(y, X).fit(cov_type="HAC", cov_kwds={"maxlags": 6})

    alpha_results.append({
        "Proxy": proxy_name.replace("_", " ").title(),
        "Alpha (% monthly)": round(model.params["const"] * 100, 3),
        "t-stat": round(model.tvalues["const"], 2),
        "R²": round(model.rsquared, 3)
    })

pd.DataFrame(alpha_results).style.hide(axis="index")

5.6.4 Ảnh hưởng đến định giá

Để minh họa tác động định giá, hãy xem xét một bài tập DCF đơn giản trong đó chi phí vốn chủ sở hữu được ước tính thông qua CAPM.

Table 5.12: Cost of Equity and Terminal Value Sensitivity to Risk-Free Proxy
# Example: firm with beta = 1.0, expected CF = 1 billion VND, growth = 3%
beta_example = 1.0
cf = 1e9  # VND
growth = 0.03

valuation_results = []
for proxy_name, proxy_df in rf_proxies.items():
    rf_ann = proxy_df["rf_annual"].dropna().iloc[-12:].mean() / 100  # Latest year avg

    rf_merge = proxy_df[["date", "rf_monthly"]].rename(
        columns={"rf_monthly": "rf_proxy"}
    )
    mkt_merged = market_monthly[["date", "rm"]].merge(
        rf_merge, on="date", how="inner"
    )
    mkt_merged["mktrf"] = mkt_merged["rm"] - mkt_merged["rf_proxy"]
    erp = mkt_merged["mktrf"].mean() * 12  # Annualized equity premium

    cost_equity = rf_ann + beta_example * erp
    terminal_value = cf / (cost_equity - growth) if cost_equity > growth else np.nan

    valuation_results.append({
        "Proxy": proxy_name.replace("_", " ").title(),
        "Rf (% ann.)": round(rf_ann * 100, 2),
        "ERP (% ann.)": round(erp * 100, 2),
        "Cost of Equity (%)": round(cost_equity * 100, 2),
        "Terminal Value (B VND)": round(terminal_value / 1e9, 1) if terminal_value else "N/A"
    })

pd.DataFrame(valuation_results).style.hide(axis="index")
ImportantPhát hiện quan trọng

Ngay cả những khác biệt nhỏ về lãi suất phi rủi ro (50-150 điểm cơ bản giữa các chỉ số thay thế) cũng có thể tạo ra sự khác biệt về giá trị cuối kỳ từ 10-30%. Các nhà nghiên cứu và chuyên gia thực hành phải ghi chép rõ ràng lựa chọn lãi suất phi rủi ro của mình và báo cáo độ nhạy cảm đối với các lựa chọn thay thế.

5.7 Các yếu tố cần xem xét về cấu trúc

Khi cần tỷ lệ chiết khấu dài hạn hơn (ví dụ: để ước tính dòng tiền chiết khấu hoặc chi phí vốn trong nhiều năm), tỷ lệ lãi suất phi rủi ro cần phải phù hợp với kỳ hạn. Điều này đòi hỏi phải xây dựng đường cong lợi suất từ ​​dữ liệu trái phiếu chính phủ hiện có.

5.7.1 Ước tính đường cong lợi suất

Gürkaynak, Sack, and Wright (2007) phát triển một phương pháp tham số để ước tính đường cong lợi suất bằng cách sử dụng các mô hình Nelson and Siegel (1987)Svensson (1994). Mô hình Nelson-Siegel tham số hóa lãi suất kỳ hạn tức thời như sau:

\[ f(\tau) = \beta_0 + \beta_1 \exp\left(-\frac{\tau}{\lambda}\right) + \beta_2 \frac{\tau}{\lambda} \exp\left(-\frac{\tau}{\lambda}\right) \tag{5.7}\]

trong đó \(\tau\) là độ chín, \(\beta_0\) là mức dài hạn, \(\beta_1\) xác định độ dốc, \(\beta_2\) xác định độ cong và \(\lambda\) kiểm soát vị trí của bướu.

Lợi nhuận tương ứng là:

\[ y(\tau) = \beta_0 + \beta_1 \frac{1 - \exp(-\tau/\lambda)}{\tau/\lambda} + \beta_2 \left[\frac{1 - \exp(-\tau/\lambda)}{\tau/\lambda} - \exp(-\tau/\lambda)\right] \tag{5.8}\]

from scipy.optimize import minimize

def nelson_siegel_yield(tau, beta0, beta1, beta2, lam):
    """Nelson-Siegel yield curve model."""
    tau_lam = tau / lam
    factor1 = (1 - np.exp(-tau_lam)) / tau_lam
    factor2 = factor1 - np.exp(-tau_lam)
    return beta0 + beta1 * factor1 + beta2 * factor2

def fit_nelson_siegel(maturities, yields):
    """Fit Nelson-Siegel model to observed yields."""
    def objective(params):
        beta0, beta1, beta2, lam = params
        if lam <= 0:
            return 1e10
        fitted = nelson_siegel_yield(maturities, beta0, beta1, beta2, lam)
        return np.sum((yields - fitted) ** 2)

    result = minimize(
        objective,
        x0=[yields[-1], yields[0] - yields[-1], 0, 2.0],
        method="Nelder-Mead",
        options={"maxiter": 10000}
    )
    return result.x

# Example: fit to latest available government bond yields
# Assume govt_yields contains: date, maturity_years, yield_pct
govt_yields = pd.read_parquet("data/govt_bond_yields.parquet")

latest_date = govt_yields["date"].max()
latest_yields = govt_yields[govt_yields["date"] == latest_date].sort_values("maturity_years")

maturities = latest_yields["maturity_years"].values
yields = latest_yields["yield_pct"].values

params = fit_nelson_siegel(maturities, yields)
beta0, beta1, beta2, lam = params
tau_fine = np.linspace(0.25, 30, 200)
fitted_yields = nelson_siegel_yield(tau_fine, *params)

fig, ax = plt.subplots(figsize=(7, 4))
ax.scatter(
    maturities, yields, color="#FF6B6B", s=60, zorder=5,
    label="Observed yields", edgecolors="white"
)
ax.plot(
    tau_fine, fitted_yields, color="#2C73D2", linewidth=2,
    label="Nelson-Siegel fit"
)
ax.set_xlabel("Maturity (Years)")
ax.set_ylabel("Yield (%)")
ax.legend(frameon=False)
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
plt.tight_layout()
plt.show()

print(f"Nelson-Siegel parameters:")
print(f"  β₀ (level)     = {beta0:.4f}")
print(f"  β₁ (slope)     = {beta1:.4f}")
print(f"  β₂ (curvature) = {beta2:.4f}")
print(f"  λ (decay)      = {lam:.4f}")
Figure 5.4
Tip

Đường cong lợi suất Nelson-Siegel cho phép khai thác tỷ lệ không rủi ro ở bất kỳ kỳ hạn nào. Đối với định giá tài sản hàng tháng, hãy đánh giá đường cong ở mức \(\tau = 1/12\) (một tháng). Đối với định giá DCF với thời hạn 10 năm, hãy đánh giá ở mức \(\tau = 10\). Phương pháp đối sánh độ tuổi này vượt trội hơn so với việc sử dụng một proxy duy nhất cho mọi mục đích.

5.7.2 Trích xuất lãi suất ngắn hạn từ đường cong lợi suất

# Extract 1-month rate from Nelson-Siegel curve at each date
def extract_ns_short_rate(govt_yields, target_maturity=1/12):
    """
    For each date, fit Nelson-Siegel and extract the yield
    at the target maturity.
    """
    dates = govt_yields["date"].unique()
    short_rates = []

    for d in dates:
        obs = govt_yields[govt_yields["date"] == d].sort_values("maturity_years")
        if len(obs) < 3:  # Need at least 3 points to fit
            short_rates.append({"date": d, "rf_ns": np.nan})
            continue

        try:
            params = fit_nelson_siegel(
                obs["maturity_years"].values,
                obs["yield_pct"].values
            )
            rf_ns = nelson_siegel_yield(target_maturity, *params)
            short_rates.append({"date": d, "rf_ns": rf_ns})
        except Exception:
            short_rates.append({"date": d, "rf_ns": np.nan})

    return pd.DataFrame(short_rates)

ns_short_rates = extract_ns_short_rate(govt_yields)

5.8 Lãi suất phi rủi ro thực tế so với lãi suất phi rủi ro danh nghĩa

Đối với một số ứng dụng nhất định, đặc biệt là định giá dài hạn và phân tích lợi suất thực, lãi suất phi rủi ro thực (đã điều chỉnh lạm phát) phù hợp hơn lãi suất danh nghĩa. Phương trình Fisher liên hệ chúng như sau:

\[ r_f^{real} \approx r_f^{nominal} - \pi^{e} \tag{5.9}\]

trong đó \(\pi^e\) là lạm phát dự kiến. Trên thực tế, chúng ta có thể sử dụng lạm phát CPI thực tế làm thước đo gần đúng cho lạm phát dự kiến ​​(với giả định về kỳ vọng hợp lý, hoặc như một điều chỉnh sau đó).

# Load CPI data
# Assume cpi_data contains: date, cpi_index (or inflation_mom for month-over-month)
cpi_data = pd.read_parquet("data/cpi_monthly.parquet")
cpi_data = cpi_data.sort_values("date")
cpi_data["inflation_monthly"] = cpi_data["cpi_index"].pct_change()

rf_real = rf_blended[["date", "rf_monthly"]].merge(
    cpi_data[["date", "inflation_monthly"]], on="date", how="inner"
)
rf_real["rf_real"] = rf_real["rf_monthly"] - rf_real["inflation_monthly"]
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(
    rf_real["date"], rf_real["rf_monthly"] * 100,
    color="#2C73D2", label="Nominal", linewidth=1
)
ax.plot(
    rf_real["date"], rf_real["rf_real"] * 100,
    color="#FF6B6B", label="Real", linewidth=1
)
ax.axhline(0, color="black", linewidth=0.5, linestyle="--")
ax.set_ylabel("Monthly Rate (%)")
ax.set_xlabel("")
ax.legend(frameon=False)
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
plt.tight_layout()
plt.show()
Figure 5.5
Note

Trong thời kỳ lạm phát cao, lãi suất phi rủi ro thực tế có thể âm đáng kể. Điều này có tác động đến việc tính toán lợi suất vượt trội thực tế và đến việc giải thích phần bù rủi ro cổ phiếu theo giá trị thực. Lãi suất phi rủi ro thực tế âm ngụ ý rằng trái phiếu chính phủ danh nghĩa không giữ được sức mua, điều này củng cố lập luận cho việc đầu tư vào cổ phiếu từ góc độ lợi suất thực tế.

5.9 So sánh quốc tế

Việc so sánh môi trường lãi suất phi rủi ro của Việt Nam với các thị trường mới nổi và phát triển khác sẽ giúp hiểu rõ hơn về quy mô của vấn đề (Table 5.13).

# get the risk-free rate of Asian markets
Table 5.13: Các chỉ số thay thế lãi suất phi rủi ro: So sánh quốc tế
Quốc gia Chỉ số đại diện tiêu biểu Kỳ hạn ngắn hạn Mức độ tiêu biểu (%, 2020-2024)
Việt Nam Lãi suất liên ngân hàng qua đêm / Trái phiếu chính phủ kỳ hạn 1 năm Hạn chế (ít trái phiếu kỳ hạn dưới 1 năm) 2,5-6,0
Thái Lan Lãi suất mua lại song phương 1 ngày Có (repo 1 ngày) 0,5-2,5
Indonesia Lãi suất repo ngược 7 ngày của Ngân hàng Trung ương Indonesia Có (7 ngày, 1 tháng) 3,5-6,0
Philippines Tín phiếu kho bạc 91 ngày Có (Tín phiếu kho bạc 91 ngày) 1,5-6,0
Ấn Độ Tín phiếu kho bạc 91 ngày Có (Tín phiếu kho bạc 91 ngày) 3,5-7,0
Hàn Quốc Tỷ lệ trả lãi trong 91 ngày Có (trả lãi trong 91 ngày) 1.0-3.5
Nhật Bản Lãi suất cho vay qua đêm không thế chấp Có (qua đêm) -0,1-0,1

Môi trường lãi suất phi rủi ro của Việt Nam được đặc trưng bởi lãi suất danh nghĩa tương đối cao (phản ánh lạm phát và động lực tăng trưởng), hạn chế khả năng cung cấp các công cụ có chủ quyền kỳ hạn rất ngắn và phụ thuộc nhiều hơn vào lãi suất liên ngân hàng làm đại diện hoạt động. Điều này tương tự như các thị trường biên giới ASEAN khác nhưng tương phản rõ rệt với các thị trường châu Á phát triển, nơi thị trường chứng khoán chính phủ sâu cung cấp các tiêu chuẩn ngắn hạn rõ ràng.

5.10 Danh sách kiểm tra các phương pháp hay nhất

Dựa trên phân tích trong chương này, chúng tôi tóm tắt các thực tiễn được khuyến nghị để xây dựng lãi suất phi rủi ro trong nghiên cứu tài chính Việt Nam (Table 5.14).

Table 5.14: Các phương pháp tốt nhất để xây dựng tỷ lệ lãi suất không rủi ro
Thực hành Lý do
Sử dụng kỳ hạn ngắn nhất có thể Giảm thiểu sự ảnh hưởng của phí bảo hiểm kỳ hạn
Đối khớp tần số với dữ liệu trả về Tránh tích lũy sai lệch giữa tần số vô tuyến và lợi nhuận từ cổ phiếu
Sử dụng cùng một quy ước tính lãi kép Tính toán trả về số học yêu cầu chuyển đổi số học sang số thực
Ghi rõ thông tin về máy chủ proxy và nguồn Cho phép sao chép; các máy chủ proxy khác nhau cho kết quả khác nhau
Báo cáo về độ nhạy cảm đối với các chỉ số thay thế Chứng minh tính vững chắc của các kết luận
Tránh các mức lãi suất chính sách dự báo tương lai Lãi suất chính sách không phải là lợi nhuận đầu tư
Xử lý các khoảng trống bằng phương pháp nội suy đã được ghi chép Điền dữ liệu về phía trước, sau đó tính trung bình trong tháng; ghi lại quy trình
Sử dụng thuật toán Nelson-Siegel để khớp kỳ hạn Cho phép trích xuất lãi suất bất kỳ kỳ hạn nào từ dữ liệu thưa thớt
Cần xem xét lãi suất thực cho phân tích dài hạn Lãi suất danh nghĩa phóng đại mức lương thực tế trong thời kỳ lạm phát cao
Duy trì một chuỗi dữ liệu nhất quán cho mỗi nghiên cứu Việc trộn lẫn các chỉ số thay thế giữa các giai đoạn sẽ tạo ra sự gián đoạn về cấu trúc

5.11 Giữ lại lãi suất phi rủi ro để sử dụng cho các khâu tiếp theo.

Bước cuối cùng là lưu chuỗi lãi suất phi rủi ro đã xây dựng để sử dụng trong các chương tiếp theo.

# Save all variants for flexibility
rf_output = rf_blended[["date", "rf_monthly", "source"]].copy()
rf_output["rf_annual_pct"] = rf_output["rf_monthly"] * 12 * 100

# Also save individual proxies
for proxy_name, proxy_df in rf_proxies.items():
    col_name = f"rf_{proxy_name}"
    rf_output = rf_output.merge(
        proxy_df[["date", "rf_monthly"]].rename(
            columns={"rf_monthly": col_name}
        ),
        on="date",
        how="left"
    )

# Save to parquet for use in later chapters
rf_output.to_parquet("data/risk_free_rate.parquet", index=False)

print(f"Risk-free rate series saved: {len(rf_output)} months")
print(f"Date range: {rf_output['date'].min()} to {rf_output['date'].max()}")
print(f"\nColumns: {list(rf_output.columns)}")
Tip

Bằng cách lưu trữ tỷ lệ lãi suất phi rủi ro dưới dạng một tệp riêng biệt, được ghi chép đầy đủ, tất cả các chương tiếp theo có thể hợp nhất nó một cách nhất quán. Điều này tránh được lỗi thường gặp là tái tạo tỷ lệ lãi suất phi rủi ro khác nhau trong các phân tích khác nhau trong cùng một nghiên cứu.

5.12 Tóm tắt

Chương này đã chứng minh rằng việc xây dựng lãi suất phi rủi ro là một quyết định mô hình hóa hàng đầu trong nghiên cứu tài chính Việt Nam, chứ không phải là một yếu tố kỹ thuật được xem xét sau đó. Những điểm chính cần ghi nhớ là:

  1. Không có chỉ số thay thế hoàn hảo nào ở Việt Nam. Lãi suất liên ngân hàng qua đêm, lợi suất trái phiếu chính phủ kỳ hạn 1 năm và lãi suất chính sách của Ngân hàng Nhà nước Việt Nam đều có những ưu điểm và hạn chế riêng. Chuỗi kết hợp sử dụng thứ tự ưu tiên được ghi chép đầy đủ sẽ cung cấp chỉ số cơ sở đáng tin cậy nhất.

  2. Việc lựa chọn chỉ số đại diện có ảnh hưởng định lượng. Các chỉ số đại diện khác nhau có thể làm thay đổi mức chênh lệch giá cổ phiếu ước tính từ 50-200 điểm cơ bản hàng năm, làm thay đổi hệ số alpha của danh mục đầu tư và thay đổi giá trị cuối kỳ của phương pháp chiết khấu dòng tiền (DCF) từ 10-30%.

  3. Việc điều chỉnh tần suất và các quy ước tính lãi kép phải được xử lý cẩn thận. Việc chuyển đổi lãi suất hàng năm sang lãi suất hàng tháng yêu cầu phải chỉ rõ quy ước tính lãi kép. Các khoảng trống trong dữ liệu cần được nội suy và ghi chép lại.

  4. Mô hình đường cong lợi suất Nelson-Siegel cho phép trích xuất lãi suất phi rủi ro cho mọi kỳ hạn từ dữ liệu trái phiếu chính phủ thưa thớt, điều này đặc biệt có giá trị đối với việc ước tính lãi suất chiết khấu phù hợp với kỳ hạn.

  5. Phân tích độ nhạy là bắt buộc. Bất kỳ nghiên cứu nào báo cáo kết quả dựa trên một chỉ số thay thế không rủi ro duy nhất mà không báo cáo tính ổn định đối với các chỉ số thay thế đều tiềm ẩn nguồn gốc của sự không chắc chắn trong việc xác định mô hình.