vnstock-js

vnstock-js

Tài LiệuDùng Với AIVí DụBài ViếtDemo
k

© Copyright 2026

Giới Thiệu
Cài Đặt
Hướng Dẫn Sử Dụng Nhanh
Quy Ước & Đơn Vịv2.0
Dùng Với AIv2.0
Kiến Trúc
Danh Sách Hàm
Nâng Cấp Từ v1v2.0
CLI
Lịch Sử Phiên Bản
Câu Hỏi Thường Gặp
Cơ Bản
Bảng Giá - Prices
Lịch Sử Giá - History
Danh Mục Mã - Symbols
Tìm Kiếm - Search
Tài Chính - Financials
Thị Trường - Marketv1.5
Sàng Lọc - Screening
Chỉ Báo & Pattern
AI Contextv1.4
Danh Mục Đầu Tưv2.0
Theo Dõi & Cảnh Báov2.0
Backtest & Phiên Tương Tựv2.0
Trình Duyệt & Proxyv2.0
Lịch Giao Dịch - Calendar
Vàng, Tỷ Giá, Tin Tức
MCP Serverv1.4
Watchlistv1.4
Bar
Quote
Tick
TopMover
CompanyProfile
ScreenRow
GoldQuote & FxRate
  1. Tài Liệu
  2. Key Features
  3. Advanced
  4. Portfolio

Danh Mục Đầu Tư

Định giá danh mục theo giá hiện tại, nhóm theo môi giới và ngành, lưu và đọc lại.

Xem .md
import { vn } from "vnstock-js";

const p = await vn.portfolio({
  positions: [
    { symbol: "FPT", quantity: 100, cost: 120000, broker: "DNSE" },
    { symbol: "VCB", quantity: 200, cost: 58000, broker: "TCBS" },
    { symbol: "HPG", quantity: 500, cost: 28000 },
  ],
  cash: { DNSE: 5000000, TCBS: 2000000 },
});

console.log(p.totals.nav, p.totals.pnlPct);

Note:

cost là giá vốn mỗi cổ phiếu bằng đồng: 120000, không phải 120. Nếu đang lưu giá vốn theo nghìn đồng, nhân 1000 trước khi truyền vào.

Đầu vào

TrườngÝ nghĩa
positions[].symbolMã cổ phiếu
positions[].quantitySố cổ phiếu, lớn hơn 0
positions[].costGiá vốn mỗi cổ phiếu, đồng
positions[].brokerTuỳ chọn; vị thế không ghi được gom vào "default"
positions[].note, tagsTuỳ chọn, giữ nguyên trong kết quả
cashTiền mặt bằng đồng: một số (gom vào "default") hoặc { broker: số }

Mã sai bị báo INVALID_SYMBOL kèm gợi ý trước khi hỏi giá.

Kết quả

{
  date: "2026-10-20",
  positions: [
    { symbol: "FPT", quantity: 100, cost: 120000, broker: "DNSE",
      price: 57500, value: 5750000, pnl: -6250000, pnlPct: -52.083, weight: 0.27, industry: "Công nghệ Thông tin" },
  ],
  byBroker: { DNSE: { value, cost, pnl, pnlPct, cash, nav }, TCBS: { ... }, default: { ... } },
  byIndustry: { "Ngân hàng": { value, weight }, ... },
  totals: { value, cost, pnl, pnlPct, cash, nav },
  unit: "VND",
}
  • price là giá khớp, hoặc giá tham chiếu trước lệnh khớp đầu tiên của phiên.
  • Tiền bằng đồng, pnlPct là phần trăm, weight là phân số của NAV.

Lưu và đọc lại

await vn.portfolio.save({ positions: [{ symbol: "FPT", quantity: 100, cost: 120000 }], cash: 5000000 });
const saved = await vn.portfolio.load(); // { positions: [] } khi chưa lưu gì
const summary = await vn.portfolio(saved);

save() và load() dùng storage của client. Với fileStorage() của vnstock-js/node, danh mục nằm ở ~/.vnstock-js/portfolio.json, cùng file mà CLI vnstock portfolio và tool MCP portfolio_summary dùng. Trên trình duyệt, tự viết một Storage trên IndexedDB hoặc localStorage.

import { createClient } from "vnstock-js";
import { fileStorage } from "vnstock-js/node";

const vn = createClient({ storage: fileStorage() });
PreviousAI Context
NextTheo Dõi & Cảnh Báo

Nội Dung

Đầu vàoKết quảLưu và đọc lại