Vnstock Logo

Mô hình định giá

Mở rộng

Mục lục

Agent Guide Notebook minh hoạ

Khuyên dùng: Nên ưu tiên sử dụng Agent Guide để nạp môi trường cho AI Agent trên máy tính cục bộ. Tránh viết code thủ công hoặc dùng AI phiên bản web/Google Colab vì AI không có thông tin mới nhất về thư viện nên dễ viết sai cú pháp.



Tổng quan

Mô-đun vnstock_quant.valuation cung cấp các công cụ định lượng giá trị nội tại doanh nghiệp dựa trên mô hình chiết khấu dòng cổ tức (Dividend Discount Model - DDM), kỹ thuật định giá đảo ngược để bóc tách kỳ vọng thị trường (Reverse Valuation) và xác định tỷ số P/E hợp lý (Justified P/E) theo chuẩn mực CFA Institute.

Lưu ý về bản chất mô hình

Mọi kết quả định giá là đầu ra toán học của mô hình dựa trên các giả định đầu vào (lợi suất yêu cầu, tốc độ tăng trưởng, tỷ lệ chi trả) do người dùng thiết lập. Đây không phải là giá mục tiêu hay khuyến nghị đầu tư của Vnstock.


Mô hình chiết khấu cổ tức (DDM)

Mô hình DDM phù hợp với các doanh nghiệp niêm yết có lịch sử chi trả cổ tức tiền mặt đều đặn, chính sách phân phối lợi nhuận minh bạch và dòng tiền hoạt động ổn định (như các ngành điện, nước, dược phẩm, công nghệ thông tin).

Python
from vnstock_quant import valuation as vl

# Trường hợp 1: Mô hình tăng trưởng đều Gordon (Gordon Growth Model)
# Cổ tức vừa chi trả d0 = 3.700 VNĐ, kỳ vọng tăng trưởng dài hạn g = 5,4%/năm, lợi suất yêu cầu r = 7,5%
gordon_val = vl.ddm(r=0.075, d0=3700, terminal_g=0.054)
print(f"Giá trị nội tại: {gordon_val['value']:,.0f} VNĐ")

# Trường hợp 2: Mô hình DDM hai giai đoạn (Two-stage DDM)
# Doanh nghiệp tăng trưởng cao 10%/năm trong 3 năm đầu, sau đó ổn định ở mức 5%
multi_stage = vl.ddm(
    r=0.15,
    d0=5000,
    stages=[(0.10, 3)],  # [(tốc độ tăng trưởng, số năm)]
    terminal_g=0.05
)
print(multi_stage[["value", "pv_dividends", "pv_terminal", "terminal_share"]])

# Trường hợp 3: Khai báo dòng cổ tức dự phóng chi tiết (Explicit Dividends)
# 4 năm đầu tái đầu tư toàn bộ (cổ tức = 0), từ năm thứ 5 bắt đầu trả 4.000 VNĐ rồi tăng trưởng 6%
explicit_val = vl.ddm(r=0.10, dividends=[0, 0, 0, 0, 4000], terminal_g=0.06)
print(f"Giá trị nội tại: {explicit_val['value']:,.0f} VNĐ")

Tham số chi tiết của hàm ddm()

Tham sốKiểu dữ liệuÝ nghĩa
rfloatLợi suất yêu cầu của nhà đầu tư (tính theo năm, dạng phân số). Bắt buộc phải lớn hơn terminal_g
terminal_gfloatTốc độ tăng trưởng dài hạn sau khi kết thúc giai đoạn tăng trưởng nhanh
d0 / d1floatMức cổ tức tiền mặt vừa chi trả gần nhất (d0) hoặc cổ tức dự kiến kỳ tới (d1)
stageslist[tuple]Danh sách các giai đoạn tăng trưởng: [(g1, số_năm1), (g2, số_năm2)]
dividendslist[float]Danh sách dự phóng cổ tức chi tiết từng năm [D1, D2, ..., Dn]
Chỉ số terminal_share (Tỷ trọng giá trị cuối kỳ)

Hàm ddm() luôn trả về thuộc tính terminal_share (tỷ lệ phần trăm giá trị đến từ giá trị thanh lý cuối kỳ). Nếu chỉ số này vượt quá 70–80%, mô hình đang quá nhạy cảm với giả định r − g. Bạn nên thực hiện phân tích độ nhạy (sensitivity analysis) trên một dải tham số thay vì tin vào một con số duy nhất.


Định giá đảo ngược (Reverse Valuation)

Thay vì dự phóng tăng trưởng để tìm giá trị nội tại, kỹ thuật định giá đảo ngược cho phép bạn lấy thị giá hiện tại trên sàn giao dịch và bóc tách câu hỏi: "Với mức thị giá này, thị trường đang ngầm định doanh nghiệp sẽ tăng trưởng bao nhiêu % mỗi năm?"

Python
# Cổ phiếu đang giao dịch ở mức giá 63.000 VNĐ, cổ tức năm tới dự kiến 1.760 VNĐ
current_price = 63000
expected_d1 = 1760

# 1. Tính tốc độ tăng trưởng ngầm định khi biết lợi suất yêu cầu là 7%
implied_g = vl.implied_growth(price=current_price, d1=expected_d1, r=0.07)
print(f"Tăng trưởng dài hạn ngầm định: {implied_g * 100:.2f}%/năm")

# 2. Tính lợi suất yêu cầu ngầm định khi giả định tốc độ tăng trưởng dài hạn là 4%
implied_r = vl.implied_return(price=current_price, d1=expected_d1, g=0.04)
print(f"Lợi suất yêu cầu ngầm định: {implied_r * 100:.2f}%/năm")

Nếu tốc độ tăng trưởng ngầm định (implied_g) mà thị trường đòi hỏi vượt xa năng lực tăng trưởng ngành hoặc tốc độ tăng trưởng kinh tế vĩ mô, mức giá đó đang hàm ý một giả định tăng trưởng lạc quan, đáng để bạn tự kiểm tra lại.


Xác định tỷ số P/E hợp lý theo cơ bản (Justified P/E)

Tỷ số P/E trên thị trường thường bị bóp méo bởi tâm lý ngắn hạn. Hàm vl.justified_pe() xác định tỷ số P/E lý thuyết dựa trên các biến số nền tảng: tỷ lệ chi trả cổ tức (payout), lợi suất yêu cầu (r) và tăng trưởng (g):

Python
# Doanh nghiệp chi trả cổ tức 68% lợi nhuận, lợi suất yêu cầu 9%, tăng trưởng 6,9%
payout_ratio = 0.68
cost_of_equity = 0.09
growth_rate = 0.069

# 1. P/E dự phóng hợp lý (Forward Justified P/E = payout / (r − g))
pe_forward = vl.justified_pe(payout=payout_ratio, r=cost_of_equity, g=growth_rate)
print(f"P/E Forward hợp lý: {pe_forward:.2f}x")

# 2. P/E trượt hợp lý (Trailing Justified P/E = payout * (1 + g) / (r − g))
pe_trailing = vl.justified_pe(payout=payout_ratio, r=cost_of_equity, g=growth_rate, kind="trailing")
print(f"P/E Trailing hợp lý: {pe_trailing:.2f}x")

# 3. Suy ra lợi suất yêu cầu ngầm định từ P/E thị trường đang ở mức 28x
implied_cost = vl.pe_implied(pe=28, payout=0.70, g=0.04)
print(f"Lợi suất yêu cầu ngầm định từ P/E: {implied_cost * 100:.2f}%")

Kiểm định khoa học

Toàn bộ thuật toán trong mô-đun valuation được kiểm định đối chiếu với các bài toán mẫu trong giáo trình CFA Program Level I (Equity Investments & Quantitative Methods).


Đọc tiếp