vnstock-js

vnstock-js

Tài LiệuVí DụBài ViếtTài Chính
k

© Copyright 2026

Giới Thiệu
Danh Sách Hàm
Cài Đặt
Kiến Trúc
Hướng Dẫn Sử Dụng Nhanh
CLI
Lịch Sử Phiên Bản
Câu Hỏi Thường Gặp
Cơ Bản
Giao Dịch - Trading
Báo Giá - Quote
Niêm Yết - Listing
Tài Chính - Financials
Chỉ Báo - Indicators
AI Contextv1.4Mới
Thị Trường - Marketv1.5Mới
MCP Serverv1.4Mới
Watchlistv1.4Mới
Sàng Lọc - Screening
Tìm Kiếm - Search
Lịch Giao Dịch - Calendar
Realtime - Thời Gian Thực
QuoteHistory
PriceBoardItem
TopStock
CompanyProfile
ScreenResult
RealtimeQuote
ExchangeRate
  1. Tài Liệu
  2. Key Features
  3. Advanced
  4. Screening

Sàng Lọc - Screening

Lọc cổ phiếu theo tiêu chí tài chính trong một rổ chỉ định

Note:

Thay đổi ở v1.5. screen() nay bắt buộc có group hoặc exchange. Không truyền thì ném InvalidParameterError.

Lý do: chỉ số tài chính phải lấy theo từng mã, nên quét cả 2000 mã trong một lần gọi là cách chắc chắn bị nguồn chặn với lỗi 429.

Kết quả cũng bỏ eps, revenue, netProfit vì nguồn REST mới không có. Cần số tuyệt đối thì dùng stock.financials.

Sử dụng

import vnstock from 'vnstock-js';

const results = await vnstock.stock.screening.screen({
  group: 'VN30',
  filters: [
    { field: 'pe', operator: '<', value: 15 },
    { field: 'roe', operator: '>', value: 0.15 },
  ],
  sortBy: 'roe',
  order: 'desc',
  limit: 20,
});

Params

ParamTypeMô tả
groupstring?VN30, HNX30, VN100... Ưu tiên hơn exchange
exchangestring?HOSE, HNX, UPCOM
filtersScreenFilter[]Danh sách điều kiện lọc
sortBystring?Sắp xếp theo field
order"asc" | "desc"Thứ tự (mặc định: desc)
limitnumber?Giới hạn kết quả
concurrencynumber?Số request song song khi lấy chỉ số (mặc định 5)

Phải có group hoặc exchange.

Filter operators

OperatorMô tả
<Nhỏ hơn
>Lớn hơn
<=Nhỏ hơn hoặc bằng
>=Lớn hơn hoặc bằng
=Bằng

Chi phí của từng nhóm field

Không phải field nào cũng tốn như nhau. Biết điều này giúp viết bộ lọc nhanh hơn nhiều.

Miễn phí, lấy từ bảng giá. Một request cho cả rổ.

FieldMô tả
priceGiá hiện tại (nghìn VND)
priceChangeThay đổi so với tham chiếu
changePercentPhần trăm thay đổi
volumeKhối lượng
valueGiá trị giao dịch (tỷ VND)
exchangeSàn

Miễn phí nếu bật init({ ratios: true }). Xem mục bên dưới.

FieldMô tả
roeReturn on Equity
roaReturn on Assets
roicReturn on Invested Capital
grossMarginBiên lợi nhuận gộp
ebitMarginBiên EBIT
currentRatioThanh toán hiện hành
quickRatioThanh toán nhanh
debtToEquityNợ trên vốn chủ
dividendYieldTỷ suất cổ tức
sharesSố cổ phiếu lưu hành

Tốn một request cho mỗi mã. Chúng phái sinh từ giá nên không dựng sẵn được.

FieldMô tả
pePrice/Earnings
pbPrice/Book
psPrice/Sales
marketCapVốn hóa (tỷ VND)

Bộ lọc rẻ chạy trước

Thư viện tự tách bộ lọc làm hai nhóm và chạy nhóm rẻ trước, nên chỉ mã đã sống sót mới phải gọi thêm.

// Lọc khối lượng trước, chỉ vài mã còn lại mới phải lấy PE
await vnstock.stock.screening.screen({
  exchange: 'HOSE',
  filters: [
    { field: 'volume', operator: '>', value: 5000000 },
    { field: 'pe', operator: '<', value: 12 },
  ],
});

HOSE có hơn 400 mã. Cách viết trên chạy khoảng 1.5 giây. Lọc PE trên cả sàn mà không thu hẹp trước thì mất khoảng 17 giây và hơn 400 request.

Tăng tốc với init({ ratios: true })

await vnstock.init({ ratios: true });

const rows = await vnstock.stock.screening.screen({
  group: 'VN30',
  filters: [{ field: 'roe', operator: '>', value: 0.2 }],
  sortBy: 'roe',
});

init({ ratios: true }) tải bộ chỉ số theo quý dựng sẵn từ GitHub và cache 24 giờ. Có file này thì lọc theo nhóm chỉ số quý không gọi mạng lần nào.

Đo trên VN30: 416ms có file, 1413ms không có.

Mặc định tắt vì phần lớn người dùng không sàng lọc và đây là thêm một lượt tải khoảng 400 kB. Tải lỗi thì init() vẫn chạy bình thường, screening tự quay về gọi theo từng mã.

Note:

Nguồn trả 0 thay vì null cho chỉ số không áp dụng được với ngành đó, ví dụ currentRatio và roic của ngân hàng. Thư viện giữ nguyên số của nguồn, không tự suy diễn.

Nghĩa là lọc currentRatio < 1 sẽ dính cả nhóm ngân hàng. Cân nhắc lọc kèm exchange hoặc ngành.

Output: ScreenResult[]

[{
  symbol: "FPT",
  companyName: "CTCP FPT",
  industry: "Công nghệ",
  exchange: "HOSE",
  price: 67.1,
  changePercent: 0.15,
  volume: 2611600,
  value: 176.2,
  pe: 11.42,
  pb: 2.87,
  roe: 0.265,
  marketCap: 99312.5,
  ratioPeriod: "2026Q2",
}]

ratioPeriod cho biết chỉ số lấy từ kỳ báo cáo nào, chỉ có khi bật ratios: true.

PreviousWatchlist
NextTìm Kiếm - Search

Nội Dung

Sử dụngParamsFilter operatorsChi phí của từng nhóm fieldBộ lọc rẻ chạy trướcTăng tốc với `init({ ratios: true })`Output: `ScreenResult[]`