Phân Tích Chuyên Sâu (Insights)
Cập nhật lần cuối:
Thảo luậnMục lục
- Cấu trúc dữ liệu (Schema): Để xem chính xác tên cột, kiểu dữ liệu (
Dtype) và ý nghĩa của các bảng dữ liệu trả về, vui lòng tham khảo chi tiết tại đây. KHÔNG nên suy đoán tên cột khi viết mã xử lý. - Cách Sử Dụng Nâng Cao: Hướng dẫn này tập trung vào kiến trúc Unified UI mặc định. Nếu bạn muốn can thiệp sâu vào nguồn dữ liệu, vui lòng tham khảo Tính Năng Nâng Cao.
📌 Tổng Quan
Insights Layer cung cấp xếp hạng top cổ phiếu và bộ lọc chứng khoán để nhà đầu tư nhận diện cơ hội và xu hướng thị trường.
Lưu ý: Nhóm chức năng định giá (P/E, P/B toàn thị trường) đã được chuyển sang nhóm lệnh Analytics từ phiên bản Unified UI mới. Nếu trước đây bạn dùng
Insights().valuation, vui lòng chuyển sangAnalytics().valuation(index).
🏗️ Cấu Trúc Nhóm Lệnh
Insights()
├── .ranking # Xếp hạng top cổ phiếu
├── .screener # Bộ lọc chứng khoán
├── .sentiment # Tâm lý thị trường (Experimental)
├── .flow # Dòng tiền thị trường (Experimental)
├── .sector() # Phân tích ngành (Experimental)
└── .equity() # Phân tích cổ phiếu (Experimental)1. Xếp hạng (Ranking)
Xếp hạng top cổ phiếu theo các tiêu chí khác nhau: tăng giá, giảm giá, khối lượng, nước ngoài, v.v.
Source: VND
Nhóm lệnh: insights.ranking
Phương Thức
| Method | Tham Số | Mô Tả | Return |
|---|---|---|---|
gainer() | index, limit | Top cổ phiếu tăng giá | DataFrame |
loser() | index, limit | Top cổ phiếu giảm giá | DataFrame |
value() | index, limit | Top cổ phiếu theo giá trị giao dịch | DataFrame |
volume() | index, limit | Top cổ phiếu theo khối lượng | DataFrame |
foreign_buy() | date, limit | Top nước ngoài mua nhiều | DataFrame |
foreign_sell() | date, limit | Top nước ngoài bán nhiều | DataFrame |
deal() | index, limit | Top giao dịch thỏa thuận | DataFrame |
Parameters:
index(str, optional): Chỉ số lọc (ví dụ:'VNINDEX','HNX'). Mặc đình lấy toàn thị trường.limit(int, optional): Số lượng kết quả. Mặc định 10.date(str, optional): Ngày giao dịch (YYYY-MM-DD).
Ví Dụ
from vnstock_data import Insights
ins = Insights()
df_gainers_vn = ins.ranking.gainer(index='VNINDEX', limit=1)
print(df_gainers_vn)| symbol | exchange | last_price | last_updated | price_change_1d | price_change_pct_1d | total_value | avg_volume_20d | volume_spike_20d_pct |
|---|---|---|---|---|---|---|---|---|
| HID | HOSE | 4.65 | 2026-05-15 10:38 | 0.3 | 6.89655 | 7.35031e+08 | 446655 | 35.9562 |
df_losers = ins.ranking.loser() print(df_losers)
df_volume = ins.ranking.volume() print(df_volume)
df_foreign_buy = ins.ranking.foreign_buy(limit=1)
print(df_foreign_buy)| symbol | date | net_value |
|---|---|---|
| TCB | 2026-05-15 | 4.11252e+10 |
df_foreign_sell = ins.ranking.foreign_sell()
print(df_foreign_sell)
df_deals = ins.ranking.deal()
print(df_deals)2. Bộ lọc chứng khoán (Screener)
Bộ lọc cổ phiếu cho phép lọc nhanh danh sách các mã cổ phiếu bạn quan tâm với bộ tiêu chí được hỗ trợ. Người dùng có thể nạp điều kiện lọc khi gọi API bằng cách truyền filters cấu hình bộ lọc nhằm rút ngắn thời gian và độ lớn dữ liệu tải về. (Mặc định nếu chạy không có tham số API sẽ kết hợp rất nhiều tiêu chí với biên độ lớn, đôi khi trả về rất ít kết quả).
Source: VCI
Nhóm lệnh: insights.screener
Phương Thức
| Method | Tham Số | Mô Tả | Return |
|---|---|---|---|
criteria() | lang | Danh sách giải thích tên cột và cấu hình (vi/en) | DataFrame |
filter() | filters, limit | Dữ liệu screener theo bộ lọc hoặc toàn thị trường | DataFrame |
Parameters:
filters(List[Dict], optional): Payload bộ lọc tùy chỉnh (là danh sách các tiêu chí lọc). Nếu không truyền, hệ thống sẽ gọi bộ lọc mặc định rộng nhất.lang(str): Ngôn ngữ ('vi' hoặc 'en'). Mặc định 'vi'.limit(int): Số lượng bản ghi tối đa. Mặc định 2000.
Bảng Tham Chiếu Cấu Trúc Bộ Lọc (Filters Payload)
Cấu trúc JSON cơ bản của filters (là một danh sách các dictionary) như sau:
[
{
"name": "TÊN_TIÊU_CHÍ_TỪ_HÀM_CRITERIA",
"extraName": "TÊN_BỔ_SUNG_NẾU_CÓ",
"conditionOptions": [
{"type": "value", "value": "GIÁ_TRỊ_LỰA_CHỌN"},
{"from": 0, "to": 10}
]
}
]Lưu ý quan trọng: Các field_name và extraName ở bảng dưới đây dùng để cấu hình filters khi gửi request. Khi dữ liệu trả về thành DataFrame, tên cột sẽ tự động chuyển sang định dạng snake_case (ví dụ: priceEma + ema20 sẽ thành cột price_ema_20, ema20Ema50 sẽ thành cột ema_20_ema_50). Vui lòng xem Schema Reference để biết chính xác tên cột của kết quả đầu ra.
Tất cả các tiêu chí lọc được hệ thống hỗ trợ bạn có thể tìm thấy ở bảng dưới đây (được rút trích từ bộ tiêu chí đầy đủ của hàm criteria()):
| Phân Loại | Tiêu Chí | field_name | extraName / extraName2 | Kiểu Filter (conditionOptions) | Ví dụ |
|---|---|---|---|---|---|
| Thông tin chung | Sàn giao dịch | exchange | chọn giá trị (hsx, hnx, upcom) | {"type": "value", "value": "hsx"} | |
| Nhóm ngành cấp 1 | sectorLv1 | chọn mã ngành | {"type": "value", "value": "1000"} | ||
| Vốn hóa (VND) | marketCap | khoảng giá trị | {"from": 0, "to": 1000000000} | ||
| Thị giá | marketPrice | khoảng giá trị | {"from": 10000, "to": 50000} | ||
| Giá & Khối lượng | % Biến động giá hàng ngày | dailyPriceChangePercent | khoảng giá trị | {"from": -5, "to": 5} | |
| Giá trị GD trung bình | adtv | 30Days | khoảng giá trị | {"from": 1e9, "to": 5e9} | |
| Khối lượng TB | avgVolume | 30Days | khoảng giá trị | {"from": 100000, "to": 2000000} | |
| Đột biến KL (vs TB) | esVolumeVsAvgVolume | 30Days | khoảng giá trị (%) | {"from": 20, "to": 100} | |
| Tỷ suất lợi nhuận | priceReturn | 3Month | khoảng giá trị (%) | {"from": 5, "to": 20} | |
| Hiệu suất vs VN-Index | outperformsIndex | 3Month | khoảng giá trị (%) | {"from": 0, "to": 15} | |
| Mức biến động giá | priceFluctuation | 30Days | khoảng giá trị (%) | {"from": 0, "to": 10} | |
| Phân tích kỹ thuật | Sức mạnh giá (Stock Strength) | stockStrength | khoảng giá trị | {"from": 50, "to": 100} | |
| Sức mạnh tương đối (RS) | rs | 3Month | khoảng giá trị | {"from": 70, "to": 100} | |
| RSI | rsi | khoảng giá trị | {"from": 30, "to": 70} | ||
| Giá so với EMA | priceEma | ema20 | khoảng giá trị (%) | {"from": -5, "to": 5} | |
| Tương quan EMA20 & EMA50 | ema20Ema50 | khoảng giá trị (%) | {"from": 0, "to": 5} | ||
| Tương quan EMA50 & EMA200 | ema50Ema200 | khoảng giá trị (%) | {"from": 0, "to": 5} | ||
| MACD | macd | khoảng giá trị | {"from": 0, "to": 5} | ||
| MACD Histogram | histogram | khoảng giá trị | {"from": 0, "to": 1} | ||
| ADX | adx | khoảng giá trị | {"from": 25, "to": 100} | ||
| Xu hướng cổ phiếu | stockTrend | chọn giá trị string | {"type": "value", "value": "STRONG_UPTREND"} | ||
| Xu hướng AO (Awesome Osc) | aoTrend | chọn giá trị string | {"type": "value", "value": "ABOVE_ZERO"} | ||
| Định giá & Tài chính | P/E cơ bản | ttmPe | khoảng giá trị | {"from": 5, "to": 15} | |
| P/B cơ bản | ttmPb | khoảng giá trị | {"from": 0.5, "to": 2.5} | ||
| ROE | ttmRoe | khoảng giá trị (%) | {"from": 15, "to": 50} | ||
| Tăng trưởng LNST (Mẹ) | npatmiGrowth | Yoy, Qm1 (extraName2) | khoảng giá trị (%) | {"from": 10, "to": 100} | |
| Tăng trưởng doanh thu | revenueGrowth | Yoy | khoảng giá trị (%) | {"from": 10, "to": 100} | |
| Biên Lợi nhuận ròng | netMargin | khoảng giá trị (%) | {"from": 10, "to": 100} | ||
| Biên Lợi nhuận gộp | grossMargin | khoảng giá trị (%) | {"from": 15, "to": 100} |
🤖 Mẹo: Dùng AI Để Viết Bộ Lọc
Do số lượng tiêu chí lọc tương đối nhiều, bạn nên yêu cầu AI viết cấu trúc payload JSON filters bằng cách cung cấp danh sách cột từ hàm criteria().
Prompt mẫu:
"Tôi đang dùng thư viện vnstock_data, hàm
ins.screener.filter(filters=...)cho phép truyền payload JSON để lọc cổ phiếu từ máy chủ. Dưới đây là danh sách tiêu chí lấy từ hàmcriteria():[Copy/paste kết quả từ hàm
ins.screener.criteria().to_csv()hoặcto_json()vào đây].Hãy soạn cho tôi một danh sách Python (cấu trúc JSON array) để lọc các cổ phiếu thuộc sàn HSX, có ROE > 15%, P/E < 10, và khối lượng giao dịch trung bình 30 ngày > 1,000,000."
Ví Dụ
from vnstock_data import Insights
ins = Insights()
custom_filters = [
{
"name": "exchange",
"conditionOptions": [{"type": "value", "value": "hsx"}]
},
{
"name": "ttmRoe",
"conditionOptions": [{"from": 15, "to": 100}]
},
{
"name": "ttmPe",
"conditionOptions": [{"from": 0, "to": 10}]
}
]
df_filtered = ins.screener.filter(filters=custom_filters)
print(f"Cổ phiếu HSX, P/E < 10, ROE > 15: {len(df_filtered)}")
print(df_filtered[['ticker', 'ttm_pe', 'ttm_roe']].head())
from vnstock_data import Listing
lst_vci = Listing(source="vci")
icb_df = lst_vci.industries_icb()
lv1_sectors = icb_df[icb_df['level'] == 1]
print("Danh sách mã ngành cấp 1:\n", lv1_sectors[['icb_code', 'icb_name']].head())
sector_code = "1000"
sector_filter = [
{
"name": "sectorLv1",
"conditionOptions": [{"type": "value", "value": sector_code}]
}
]
df_sector = ins.screener.filter(filters=sector_filter)
print(f"\nCổ phiếu thuộc nhóm ngành {sector_code}: {len(df_sector)}")
print(df_sector[['ticker', 'exchange', 'sector_lv1']].head())
df_all = ins.screener.filter()
print(f"Total stocks: {len(df_all)}")
cheap_good = df_all[
(df_all['pe'] < 10) & (df_all['roe'] > 15)
]
print(cheap_good[['symbol', 'pe', 'roe']].head())| symbol | exchange | ref_price | ceiling | price | floor | accumulated_value | accumulated_volume | market_cap | price_change_percent | avg_value_30d | avg_value_10d | avg_volume_30d | est_volume | volume_breakout_30d | pe | pb | roe | profit_growth_yoy | revenue_growth_yoy | net_margin | gross_margin |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ABB | UPCOM | 15200 | 17400 | 15200 | 13000 | 1.65051e+09 | 107900 | 1.57326e+13 | 0 | 1.23616e+10 | -86.8034 | 831840 | 302733 | -63.6068 | 4.69571 | 0.986995 | 21.1886 | 260.74 | 49.4604 | 34.5488 | 68.6208 |
3. Tâm lý thị trường (Sentiment)
Cung cấp các chỉ báo vĩ mô về tâm lý thị trường.
Nhóm lệnh: insights.sentiment
| Method | Tham Số | Mô Tả | Return |
|---|---|---|---|
breadth() | exchange | Độ rộng thị trường (tăng/giảm, trên MA20/MA50) | DataFrame |
contribution() | exchange | Top cổ phiếu đóng góp vào điểm số chỉ số | DataFrame |
heatmap() | exchange | Bản đồ nhiệt thị trường | DataFrame |
df_breadth = ins.sentiment.breadth(exchange='HOSE')4. Dòng tiền (Flow)
Cung cấp phân tích dòng tiền của các thành phần tham gia thị trường.
Nhóm lệnh: insights.flow
| Method | Tham Số | Mô Tả | Return |
|---|---|---|---|
foreign() | exchange, group_by | Dòng tiền mua/bán ròng của khối ngoại | DataFrame |
proprietary() | exchange, group_by | Dòng tiền tự doanh | DataFrame |
active() | exchange, group_by | Dòng tiền chủ động (aggressor) | DataFrame |
df_foreign = ins.flow.foreign(exchange='HOSE', group_by='stock')5. Phân tích ngành (Sector)
Cung cấp công cụ phân tích cấp độ ngành (Yêu cầu ind_code).
Nhóm lệnh: insights.sector
| Method | Tham Số | Mô Tả | Return |
|---|---|---|---|
valuation() | Chỉ số định giá của ngành | DataFrame | |
members() | Danh sách các cổ phiếu thành phần | DataFrame | |
rrg() | Động lượng RRG của ngành | DataFrame | |
flow() | Dòng tiền cấp độ ngành | DataFrame | |
index_intraday() | Giá trị chỉ số ngành intraday | DataFrame | |
flow_intraday() | Dòng tiền chủ động intraday của ngành | DataFrame |
df_bank_val = ins.sector('bank').valuation()6. Phân tích cổ phiếu (Equity)
Cung cấp công cụ phân tích cấp độ cổ phiếu (Yêu cầu symbol).
Nhóm lệnh: insights.equity
| Method | Tham Số | Mô Tả | Return |
|---|---|---|---|
peer_compare() | So sánh định giá với các công ty cùng ngành | DataFrame | |
order_flow() | mode | Phân bổ dòng lệnh (mode: 'by_price' hoặc 'by_time') | DataFrame |
order_flow_history() | Lịch sử giao dịch và phân bổ dòng tiền | DataFrame | |
rrg() | Động lượng RRG của cổ phiếu | DataFrame |
df_acb_comp = ins.equity('ACB').peer_compare()
Thảo luận