| Python Đọc Báo Cáo Tài Chính Doanh Nghiệp VN: PE, ROE, EPS 100 Cổ Phiếu Trong 5 Phút

Thay vì đọc từng báo cáo tài chính thủ công trên CafeF hay HOSE, Python giúp bạn tải và phân tích báo cáo tài chính của hàng trăm doanh nghiệp trong vài phút. Bài viết này hướng dẫn cách sàng lọc cổ phiếu undervalued dựa trên các chỉ số tài chính.

Tải Chỉ Số Tài Chính Bằng Vnstock

from vnstock import financial_ratio, listing_companies
import pandas as pd

# Lấy chỉ số PE, PB, ROE, EPS của VNM
ratios = financial_ratio("VNM", "quarterly", True)
print(ratios.columns.tolist())
print(ratios[['ticker', 'quarter', 'pe', 'pb', 'roe', 'eps', 'revenue']].tail(8))

Quét 100 Cổ Phiếu Cùng Lúc

from vnstock import financial_ratio, listing_companies
import pandas as pd
import time

# Lấy danh sách 100 cổ phiếu HOSE
stocks = listing_companies()
hose_100 = stocks[stocks['comGroupCode'] == 'HOSE']['ticker'].tolist()[:100]

all_ratios = []
errors = []

for i, sym in enumerate(hose_100):
    try:
        r = financial_ratio(sym, "yearly", True)
        if r is not None and len(r) > 0:
            latest = r.iloc[-1]  # lấy năm gần nhất
            all_ratios.append({
                'ticker': sym,
                'pe':     latest.get('pe', None),
                'pb':     latest.get('pb', None),
                'roe':    latest.get('roe', None),
                'eps':    latest.get('eps', None),
                'year':   latest.get('year', None),
            })
        if i % 10 == 0:
            print(f"  [{i+1}/100] Done {sym}")
        time.sleep(0.3)  # tránh rate limit
    except Exception as e:
        errors.append(sym)

df_ratios = pd.DataFrame(all_ratios)
print(f"nTải thành công: {len(df_ratios)} cổ phiếu")
print(f"Lỗi: {errors}")

Sàng Lọc Cổ Phiếu Undervalued

# Lọc cổ phiếu có:
# - PE  15% (kinh doanh hiệu quả)
# - EPS > 0 (có lợi nhuận)
# - PB  0]

undervalued = df_clean[
    (df_clean['pe']  < 15) &
    (df_clean['pb']   15)
].sort_values('roe', ascending=False)

print(f"n=== Cổ phiếu undervalued: {len(undervalued)} mã ===")
print(undervalued[['ticker', 'pe', 'pb', 'roe', 'eps']].to_string())

Tính Giá Trị Nội Tại (DCF Đơn Giản)

def simple_dcf(eps, growth_rate=0.10, discount_rate=0.12, years=10):
    """
    DCF đơn giản dựa trên EPS
    eps: lợi nhuận trên cổ phiếu (nghìn đồng)
    growth_rate: tốc độ tăng trưởng kỳ vọng
    discount_rate: tỷ lệ chiết khấu
    years: số năm dự báo
    """
    pv_eps = 0
    for t in range(1, years + 1):
        future_eps = eps * (1 + growth_rate) ** t
        pv_eps += future_eps / (1 + discount_rate) ** t

    # Terminal value (Gordon Growth Model)
    terminal_eps  = eps * (1 + growth_rate) ** years
    terminal_value = terminal_eps * (1 + 0.03) / (discount_rate - 0.03)
    pv_terminal   = terminal_value / (1 + discount_rate) ** years

    intrinsic_value = pv_eps + pv_terminal
    return intrinsic_value

# Áp dụng cho từng cổ phiếu
undervalued['fair_value'] = undervalued['eps'].apply(
    lambda x: simple_dcf(x / 1000)  # EPS thường tính bằng đồng, đổi sang nghìn đồng
)
print(undervalued[['ticker', 'eps', 'pe', 'fair_value']].head(10))

Xuất Kết Quả Ra Excel

from datetime import date

filename = f"stock_screening_{date.today()}.xlsx"
undervalued.to_excel(filename, index=False)
print(f"Đã xuất: {filename}")

Lợi Thế So Với Làm Thủ Công

Excel/Tay Python
Phân tích 100 mã 2–3 ngày 5–10 phút
Cập nhật số liệu mới Làm lại từ đầu Chạy lại script
Thêm tiêu chí lọc Chỉnh công thức phức tạp Thêm 1 dòng code
Lỗi dữ liệu Khó phát hiện Exception handling tự động

Kết Luận

Python biến việc phân tích tài chính doanh nghiệp từ công việc tốn ngày thành việc của vài phút. Thêm vào quy trình đầu tư hàng tuần — chạy mỗi chiều thứ Sáu sau khi thị trường đóng cửa để có danh sách cổ phiếu tiềm năng cho tuần tới.


📌 Muốn ứng dụng Python vào phân tích và giao dịch tài chính thực chiến?
Khóa Python Fintech — Phân Tích Dữ Liệu Lớn & Tự Động Hóa Giao Dịch tại Hướng Nghiệp Dữ Liệu giúp bạn thực hành với dữ liệu VnIndex, Binance API thật — không dạy lý thuyết hàn lâm.
📞 Hotline/Zalo: 0927 909 257

admin

admin

Biên tập viên, Hướng Nghiệp Dữ Liệu
713 Bài viết
15.4k Người theo dõi
120k+ Lượt đọc

Biên tập viên nội dung tại Hướng Nghiệp Dữ Liệu, phụ trách tổng hợp và biên soạn các bài viết về lập trình Python, dữ liệu và công nghệ.