Để xem toàn cảnh thị trường chứng quyền, tôi thiết lập hệ thống với dữ liệu thị trường được tải từ dữ liệu chứng quyền (CW) của SSI và VNDIRECT. Với dữ liệu bán hàng thì dựa trên ước lượng giao dịch tự doanh, còn với nội bộ sẽ đọc thông tin tồn kho nội bộ, tính IV / HV / GARCH, ghi vào Excel và dựng một file dashboard HTML. Bài viết mô tả các file, luồng chạy, vai trò từng file, cách lấy dữ liệu qua API, quá trình xây dựng và cách vận hành.
Mục lục
1. Tổng quan: nguồn → xử lý → đầu ra
Mọi con số mô tả cùng một phiên đã đóng (ngày as-of). Chạy trước 15:00 thì lấy phiên hôm trước. Nguồn nào chưa có dữ liệu ngày đó thì lùi một ngày làm việc, tối đa 7 ngày. Trong giờ giao dịch, chế độ Realtime cập nhật phần giá mỗi 5 phút (mục 4).
| Nguồn dữ liệu | Xử lý (main.py · 9 bước) | Đầu ra |
|---|---|---|
| SSI iBoard: bảng CW (HOSE), bảng cổ phiếu VNALL, giá lịch sử 1D, số lượng niêm yết, giá trị khớp lệnh | [1] Bảng CW + chọn ngày as-of [2] Số lượng niêm yết [3] Bảng cổ phiếu cơ sở | CW Dashboard.html: 1 file tự chứa, Tab 1 Competitor, Tab 2 Client |
| VNDIRECT finfo: tự doanh mua/bán theo từng CW, theo ngày | [4] Thanh khoản, ADV [5] HV, Yang-Zhang [6] Tự doanh CW | CW Market Overview.xlsx: sheet Horizon (339 CW × 35 cột) + RawData |
| File tồn kho nội bộ (K_Prop.xlsx): tồn kho CW của issuer theo ngày, lấy qua Power Query | [7] Bảng master (IV, delta…) [8] GARCH / GJR-GARCH [9] Xuất Excel + dashboard | GARCH Volatility Result/: tham số, dự báo, backtest (7 sheet) |
| config/api_config.py: lãi suất 7%, danh sách batch, cờ chạy | Cache theo ngày: mỗi bước chậm lưu vào data/cache/*.pkl, chạy lại cùng ngày thì dùng lại | data/*.csv: dữ liệu trung gian cho dashboard và Rebuild |
2. Ba chế độ chạy
| File bấm đúp | Khi nào dùng | Làm gì | Thời gian |
|---|---|---|---|
Run CW Market Overview.batchốt ngày (Sync) | Mỗi ngày; tốt nhất sau 15:00 khi VNDIRECT đã công bố tự doanh | Tải đủ mọi nguồn, chọn ngày as-of, tính toàn bộ, ghi Excel + file GARCH, làm mới file tồn kho, dựng dashboard | Vài phút lần đầu trong ngày; nhanh hơn khi chạy lại (cache) |
Run CW Realtime.battrong phiên | Trong giờ giao dịch, khi cần giá đang khớp | Mỗi 5 phút: lấy bảng giá SSI đang chạy, tính lại IV / delta / moneyness…, dựng dashboard; trang tự tải lại | Vài giây mỗi lần cập nhật; chạy tới 15:05 |
Rebuild Dashboard.batdựng lại nhanh | Sau khi sửa cấu hình / giao diện, khi file tồn kho có ngày mới, hoặc để đưa dashboard về chế độ Sync sau phiên realtime | Không gọi API thị trường; dựng lại dashboard từ dữ liệu đã lưu (có làm mới file tồn kho) | Vài giây (+ thời gian làm mới file tồn kho) |
src/dashboard/. Xoá Rebuild Dashboard.bat không làm hỏng hai chế độ còn lại, nhưng nên giữ vì đây là cách nhanh nhất để dựng lại dashboard.3. Luồng chạy khi bấm Run
Thứ tự thực tế từ lúc bấm đúp tới lúc dashboard mở ra.
- Bấm đúp file .bat (
Run CW Market Overview.bat): chuyển về thư mục chứa file, bật UTF-8, gọi bước kiểm tra Python, rồi chạymain.py. - Kiểm tra Python (
src/ensure_python.bat): tìm Python; nếu chưa có thì tự cài Python 3.12 và các thư viện. Sau đómain.pytự cài gói còn thiếu (pandas, arch, xlwings…). - Kiểm tra workbook (
main.py): thiếuCW Market Overview.xlsxthì dừng ngay, báo “MISSING FILE”. - Pipeline 9 bước (bảng dưới).
- Dựng dashboard (
src/dashboard/build.py): làm mới file tồn kho trong Excel, tính dữ liệu cho 2 tab, ghép vào template. - In DONE và mở dashboard: cửa sổ dừng lại để đọc log;
CW Dashboard.htmltự mở.
| Bước | Việc làm | File / cache |
|---|---|---|
| [1/9] | Tải bảng CW, chọn ngày as-of, đưa giá về giá đóng cửa ngày đó | api_client, as_of · cache cw_eod |
| [2/9] | Số lượng niêm yết: đọc lại từ Horizon, chỉ tải mã mới | api_client |
| [3/9] | Bảng cổ phiếu VNALL | api_client |
| [4/9] | Giá trị khớp, ADV 20/60 phiên, ADV từ đầu năm | underlying_liquidity · cache liquidity |
| [5/9] | Giá lịch sử, HV và Yang-Zhang theo kỳ hạn gốc của CW | historical_loader · cache hv |
| [6/9] | Tự doanh luỹ kế + theo ngày cho từng CW | proprietary_trading · ghi pdt_cache.csv, pdt_daily.csv |
| [7/9] | Bảng master: IV, delta, breakeven, leverage, % phân phối | cw_processor, option_pricing |
| [8/9] | GARCH / GJR-GARCH cho từng cổ phiếu cơ sở, quy ra vol theo kỳ hạn CW | garch_pipeline, volatility_models · cache garch |
| [RT] | Snapshot Real-time nếu đã có phiên đóng mới hơn ngày as-of | realtime · ghi data/realtime/ |
| [9/9] | Ghi CSV, bảng DATA CHECK, Excel (Horizon + RawData), file GARCH | realtime, as_of, raw_data, excel_exporter, workbook_io |
build_dashboard.py, dùng lại các CSV và workbook đã có. Dùng khi vừa sửa template, cấu hình, hoặc khi file tồn kho có ngày mới.4. Chế độ Realtime trong phiên
Bảng giá của SSI trong giờ giao dịch trả về giá khớp gần nhất, giá mua/bán tốt nhất và khối lượng / giá trị từ đầu phiên. Chế độ Realtime dùng chính các dữ liệu này, kết hợp với kết quả của lần chạy chốt ngày gần nhất.
- Đọc ngày Sync gần nhất (từ
data/pdt_cache.csv) và nạp các kết quả đã lưu của ngày đó: HV, tự doanh, thanh khoản, GARCH. Chưa có thì báo cần chạyRun CW Market Overview.battrước. - Tải bảng CW và bảng VNALL của SSI (2 lần gọi API).
- Chọn giá cho từng CW: giá khớp gần nhất → nếu chưa khớp trong ngày thì trung bình giá mua/bán tốt nhất → nếu không có thì giá tham chiếu. Cổ phiếu cơ sở: giá khớp, không có thì giá tham chiếu.
- Tính lại bảng master bằng chính
cw_processor.py: IV, delta, moneyness, breakeven, leverage, trạng thái, DTE tính từ hôm nay; giá trị giao dịch lấy theo phiên đang chạy. - Ghi snapshot vào
data/realtime/(có cờ live và giờ chụp), dựng dashboard không làm mới file tồn kho để chạy nhanh. - Dashboard mở sẵn ở chế độ Real-time, góc trên ghi “LIVE hh:mm · proprietary data dd/mm · auto-refresh every 5 min” và tự tải lại khi tới lượt cập nhật.
- Lặp lại mỗi 5 phút. Mở trước 09:00 thì chờ; 11:30–13:00 nghỉ trưa; 15:05 chụp lần cuối (giá sau ATC) rồi tự dừng. Dừng tay: Ctrl+C hoặc đóng cửa sổ.
| Cập nhật theo giá trong phiên | Giữ ở ngày Sync gần nhất (dashboard ghi rõ ngày) |
|---|---|
|
|
Tần suất và giờ chạy chỉnh trong config/api_config.py (không bắt buộc): REALTIME_REFRESH_MINUTES là 5 phút, REALTIME_START là 09:00, REALTIME_END là 15:05. Không khai báo thì dùng các giá trị mặc định này.
5. Dựng dashboard
build.py gọi lần lượt từng bộ dựng; mỗi bộ thêm một phần dữ liệu vào data/cache/web_data.json, cuối cùng nhúng tất cả vào template.
- market_data.py: đọc Horizon + tự doanh + giá đóng cửa, kiểm tra cùng ngày → dữ liệu Tab 1 (
K,C,CL,CWS,RT). - client_data.py: dòng tiền nhà đầu tư theo ngày, bucket moneyness / DTE / leverage → Tab 2 (
CL2,FIRST). - inventory_refresh.py: mở file tồn kho bằng Excel, Refresh All, lưu, đóng (tối đa 600 giây). Bỏ qua ở chế độ Realtime.
- k_batches.py: lọc tiểu khoản CW, lọc nhiễu, bù ngày thiếu từ tự doanh, cảnh báo thiếu lịch sử → biểu đồ batch (
KB). - template/:
head.html(CSS) +body.html(bố cục) +app.js.html(vẽ biểu đồ) →CW Dashboard.html. Ở chế độ Realtime, trang nhận thêm cấu hình LIVE để mở sẵn Real-time và tự tải lại.
| Tab 1 · Competitor Overview | Tab 2 · Client Overview |
|---|---|
|
“Client” = nhà đầu tư toàn thị trường với mọi issuer (client mua = tự doanh issuer bán). |
6. Cây thư mục và vai trò từng file
CW_Market Overview/ ├─ Run CW Market Overview.bat chạy chốt ngày (Sync) ├─ Run CW Realtime.bat chế độ realtime trong phiên ├─ Rebuild Dashboard.bat chỉ dựng lại dashboard ├─ main.py điều phối 9 bước ├─ run_realtime.py khởi động chế độ realtime ├─ build_dashboard.py gọi bộ dựng dashboard cho Rebuild ├─ CW Market Overview.xlsx workbook chính (Horizon + RawData) ├─ K_Prop.xlsx tồn kho nội bộ (Power Query) ├─ CW Dashboard.html dashboard ├─ config/ │ └─ api_config.py mọi thiết lập ├─ src/ │ ├─ ensure_python.bat tìm / cài Python │ ├─ api_client.py gọi SSI │ ├─ as_of.py chọn ngày as-of, DATA CHECK │ ├─ step_cache.py cache theo ngày │ ├─ historical_loader.py giá lịch sử, HV, Yang-Zhang │ ├─ underlying_liquidity.py giá trị khớp, ADV │ ├─ proprietary_trading.py tự doanh VNDIRECT │ ├─ option_pricing.py Black-Scholes, IV, delta │ ├─ cw_processor.py bảng master │ ├─ volatility_models.py GARCH / GJR-GARCH, backtest │ ├─ garch_pipeline.py GARCH theo kỳ hạn CW │ ├─ realtime.py snapshot Real-time, CSV │ ├─ raw_data.py sheet RawData │ ├─ excel_exporter.py ghi Horizon, workbook GARCH │ ├─ workbook_io.py popup, backup, lưu an toàn │ ├─ inventory_refresh.py tự làm mới file tồn kho │ ├─ intraday.py chụp bảng giá trong phiên, vòng lặp 5 phút │ └─ dashboard/ │ ├─ build.py điều phối dựng dashboard │ ├─ market_data.py dữ liệu Tab 1 │ ├─ client_data.py dữ liệu Tab 2 │ ├─ k_batches.py biểu đồ batch │ └─ template/ head.html · body.html · app.js.html · ảnh base64 ├─ data/ │ ├─ pdt_cache.csv · pdt_daily.csv tự doanh luỹ kế / theo ngày │ ├─ cw_eod.csv · underlying_daily.csv giá đóng cửa CW và cơ sở │ ├─ realtime/ snapshot cho nút Real-time / chế độ realtime │ ├─ cache/ backup/ output/ │ └─ Inventory_dip_check.xlsx phân tích tồn kho "hụt rồi hồi" ├─ GARCH Volatility Result/ kết quả GARCH (7 sheet) + chi tiết backtest ├─ backup/ lịch sử code + template workbook ├─ Claude outputs/ ảnh phân tích phụ └─ logs/ (rỗng)
Vai trò chi tiết
| Nhóm | File | Vai trò |
|---|---|---|
| Chạy | Run CW Market Overview.bat | Chạy hằng ngày: kiểm tra Python → main.py → mở dashboard. |
| Chạy | Run CW Realtime.bat | Chế độ realtime: giá đang giao dịch mỗi 5 phút, dashboard tự tải lại; dừng sau 15:05. |
| Chạy | Rebuild Dashboard.bat | Chỉ dựng lại dashboard, không gọi API thị trường; vẫn tự làm mới file tồn kho. Đưa dashboard về Sync sau phiên realtime. |
| Chạy | main.py | Điều phối 9 bước: tải dữ liệu, tính toán, ghi Excel, gọi dựng dashboard. |
| Chạy | run_realtime.py | Khởi động vòng lặp realtime (gọi src/intraday.py). |
| Chạy | src/ensure_python.bat | Tìm hoặc tự cài Python 3.12 + thư viện; cài VS Code lần đầu. |
| Cấu hình | config/api_config.py | Địa chỉ API, lãi suất 7%, batch, file và tiểu khoản tồn kho, tự làm mới, REFRESH_ALL, GARCH_BACKTEST. |
| Tính toán | api_client.py | Gọi SSI: bảng CW, bảng VNALL, số lượng niêm yết từng mã. |
| Tính toán | as_of.py | Chọn ngày as-of (quy tắc 15:00, lùi tối đa 7 ngày), đưa giá về giá đóng cửa, bảng DATA CHECK. |
| Tính toán | step_cache.py | Lưu / dùng lại kết quả từng bước theo ngày. |
| Tính toán | historical_loader.py | Giá lịch sử SSI; HV và Yang-Zhang trên kỳ hạn gốc của CW. |
| Tính toán | underlying_liquidity.py | Giá trị khớp lệnh, ADV 20 / 60 phiên, ADV từ đầu năm. |
| Tính toán | proprietary_trading.py | Tự doanh VNDIRECT từng CW: luỹ kế, trong ngày, theo ngày. |
| Tính toán | option_pricing.py | Black-Scholes, giải IV (brentq), delta. |
| Tính toán | cw_processor.py | Gộp mọi nguồn thành bảng master: IV, delta, breakeven, leverage, % phân phối. |
| Tính toán | volatility_models.py | GARCH / GJR-GARCH (Student-t), backtest QLIKE, Diebold-Mariano, VaR. |
| Tính toán | garch_pipeline.py | Chạy GARCH cho từng cơ sở, quy ra vol theo kỳ hạn từng CW. |
| Tính toán | realtime.py | Snapshot Real-time; ghi cw_eod.csv, underlying_daily.csv. |
| Tính toán | raw_data.py | Sheet RawData: dữ liệu thô từng nguồn, theo ngày. |
| Tính toán | excel_exporter.py | Ghi Horizon qua Excel thật (giữ định dạng); ghi workbook GARCH. |
| Tính toán | workbook_io.py | Popup “đóng Excel”, backup 30 bản, lưu an toàn. |
| Tính toán | intraday.py | Realtime: tải bảng giá đang chạy, chọn giá (khớp → giữa mua/bán → tham chiếu), tính lại bảng master với dữ liệu Sync đã lưu, ghi data/realtime/, dựng dashboard; lặp theo lịch trong phiên. |
| Dashboard | inventory_refresh.py | Mở file tồn kho bằng Excel → Refresh All → lưu → đóng; quá 600 giây thì bỏ qua và cảnh báo. |
| Dashboard | dashboard/build.py | Điều phối dựng dashboard; đọc danh sách file tồn kho, gọi làm mới (trừ chế độ realtime); nhận cấu hình LIVE. |
| Dashboard | dashboard/market_data.py | Dữ liệu Tab 1: KPI, issuer, bucket, bảng CW, Real-time. |
| Dashboard | dashboard/client_data.py | Dữ liệu Tab 2: dòng tiền theo ngày, bucket tại ngày giao dịch. |
| Dashboard | dashboard/k_batches.py | Biểu đồ batch: đọc tồn kho, lọc tiểu khoản, lọc nhiễu, bù ngày thiếu, cảnh báo thiếu lịch sử. |
| Dashboard | template/head · body · app.js | CSS sáng/tối; bố cục 2 tab; toàn bộ JS vẽ biểu đồ SVG, bộ lọc, nút Sync / Real-time, dòng LIVE và tự tải lại. |
| Dữ liệu | K_Prop.xlsx | Tồn kho theo ngày; Power Query gộp file ngày từ thư mục SharePoint nội bộ. |
| Dữ liệu | data/*.csv | Tự doanh, giá đóng cửa CW và cơ sở — đầu vào cho dashboard và Rebuild. |
| Dữ liệu | data/cache/ | Kết quả từng bước (*.pkl) + web_data.json. Chế độ realtime dùng lại các kết quả này. |
| Dữ liệu | data/realtime/ | Snapshot thị trường mới nhất (bảng CW, giá cơ sở, meta.json có giờ chụp). |
| Đầu ra | CW Market Overview.xlsx | Workbook chính (bắt buộc): code ghi sheet Horizon (tìm cột theo tên) và RawData. |
| Đầu ra | CW Dashboard.html | Dashboard 1 file, mở bằng trình duyệt. |
| Đầu ra | GARCH Volatility Result/ | 7 sheet: Per CW, Params, Forecast, Path, Backtest, DM Test, VaR Test. |
| Lưu trữ | backup/, data/backup/ | Lịch sử code; 30 bản backup gần nhất của workbook. |
7. Lấy dữ liệu qua API SSI và VNDIRECT
Hệ thống không dùng API có tài liệu chính thức. Nó gọi các địa chỉ mà bảng giá web công khai của SSI (iBoard) và VNDIRECT (dstock) vẫn gọi để hiển thị dữ liệu. Phần này mô tả cách gọi từng địa chỉ, tham số, các trường dùng tới và cách script mẫu xử lý dữ liệu.
7.1 Nguyên tắc chung
- Phương thức GET, không cần đăng nhập hay khoá API.
- Gửi kèm header giống trình duyệt: User-Agent của Chrome trên Windows và Accept nhận JSON. Riêng VNDIRECT cần thêm hai header Referer và Origin, đều là trang dstock.vndirect.com.vn; thiếu hai header này máy chủ trả lỗi 403.
- API SSI trả về trường code có giá trị SUCCESS khi thành công; dữ liệu nằm trong trường data.
- API có phân trang (stock-info của SSI, tự doanh của VNDIRECT): lặp số trang cho tới khi hết dữ liệu.
- Đơn vị và giờ: giá lịch sử của SSI tính theo nghìn đồng (21.60 = 21.600 đ); mốc thời gian là Unix giây, nến ngày được đóng dấu 00:00 giờ Việt Nam, nên đổi sang múi giờ Asia/Ho_Chi_Minh trước khi lấy ngày.
- Ngày tháng mỗi API một kiểu: 20261007 (bảng giá SSI), 07/10/2026 (stock-info, maturityDate), 2026-10-07 (VNDIRECT).
7.2 Sáu địa chỉ đang dùng
Các địa chỉ dưới đây đều dùng giao thức https.
| # | Dữ liệu | Địa chỉ (GET) | Tham số | Trường dùng tới | Bước |
|---|---|---|---|---|---|
| 1 | Bảng chứng quyền HOSE | iboard-query.ssi.com.vn/stock/cw/hose | — | Danh sách coveredWarrantData: stockSymbol, underlyingSymbol, issuerName, exercisePrice, exerciseRatio (“1.7245:1”), firstTradingDate, lastTradingDate, maturityDate, tradingDate, refPrice, ceiling, floor, matchedPrice, best1Bid, best1Offer, nmTotalTradedQty, nmTotalTradedValue | [1], Realtime |
| 2 | Bảng cổ phiếu VNALL | iboard-query.ssi.com.vn/stock/group/VNALL | — | Danh sách mã: stockSymbol, refPrice, matchedPrice, nmTotalTradedQty, nmTotalTradedValue, tradingDate | [3], Realtime |
| 3 | Giá lịch sử nến ngày (CW và cổ phiếu) | iboard-api.ssi.com.vn/statistics/charts/history | resolution (1D), symbol, from, to (Unix giây) | Các mảng song song t, o, h, l, c, v (giá × 1000) | [1], [5], [8] |
| 4 | Thông tin một mã (số lượng niêm yết) | iboard-query.ssi.com.vn/stock/[mã] | — | listedShare | [2] |
| 5 | Lịch sử giao dịch cổ phiếu | iboard-api.ssi.com.vn/statistics/company/ssmi/stock-info | symbol, page, pageSize, fromDate, toDate (dd/mm/yyyy) | tradingDate, close, totalMatchVal (khớp lệnh — không cộng thoả thuận totalDealVal); thông tin phân trang: total, page, pageSize | [4] |
| 6 | Tự doanh theo mã CW | api-finfo.vndirect.com.vn/v4/proprietary_trading | q (lọc theo mã CW, ví dụ CACB2516, hoặc lọc theo ngày), sort (theo ngày), page, size | code, type, date, buyingVol, buyingVal, sellingVol, sellingVal; totalPages | [6] |
7.3 Chi tiết và lưu ý từng API
- Bảng CW (1) trả toàn bộ CW đang niêm yết trong 1 lần gọi. Chế độ Realtime còn dùng best1Bid / best1Offer (giá mua / bán tốt nhất) để lấy giá giữa khi mã chưa khớp lệnh. Trong giờ giao dịch, matchedPrice là giá khớp gần nhất; ngoài giờ là giá đóng cửa. Khi chưa khớp lệnh thì dùng refPrice. Tỷ lệ chuyển đổi dạng chữ “1.7245:1” → lấy số trước dấu hai chấm.
- Giá lịch sử (3) dùng chung cho mã CW và mã cổ phiếu. Hệ thống tải 1 lần cho mỗi cổ phiếu, đủ dài cho kỳ hạn CW dài nhất (+45 ngày); GARCH tải khoảng 5 năm. Nếu ngày as-of không phải hôm nay, giá CW được lấy từ nến của ngày as-of.
- listedShare (4) phải gọi từng mã. Hệ thống chỉ gọi cho mã mới, mã cũ đọc lại từ Excel.
- Stock-info (5) lấy từ 01/01 năm hiện tại tới ngày as-of. Giá trị khớp phiên cuối = “Market trading value”; trung bình 20 / 60 phiên cuối = ADV 1 tháng / 3 tháng; trung bình cả kỳ = ADV từ đầu năm.
- Tự doanh VNDIRECT (6): hệ thống lọc theo mã phía máy chủ, lọc theo ngày phía Python (từ ngày giao dịch đầu tiên tới ngày as-of), và gọi lại tối đa 3 lần nếu lỗi để không biến lỗi mạng thành số 0. Lượng CW nhà đầu tư nắm giữ ước tính = khối lượng tự doanh bán − khối lượng tự doanh mua, cộng luỹ kế. Không dùng netVol của VNDIRECT vì ngược dấu (= mua − bán).
- Kiểm tra ngày đã có dữ liệu: gọi (6), lọc theo ngày cần kiểm tra và chỉ lấy 5 bản ghi; có bản ghi nghĩa là VNDIRECT đã công bố tự doanh ngày đó. Đây là nguồn công bố muộn nhất nên quyết định ngày as-of.
7.4 Tự tìm hoặc kiểm tra lại một API
- Mở trang bảng giá (iboard.ssi.com.vn hoặc dstock.vndirect.com.vn) bằng Chrome, nhấn F12 → tab Network → lọc Fetch/XHR.
- Thao tác trên trang (chọn nhóm chứng quyền, mở biểu đồ, mở tab tự doanh) và xem các yêu cầu mới xuất hiện.
- Bấm vào một yêu cầu: tab Headers cho địa chỉ, tham số, header cần gửi; tab Preview/Response cho cấu trúc JSON.
- Chuột phải vào yêu cầu → Copy → sao chép yêu cầu dưới dạng lệnh để thử lại ngoài trình duyệt, hoặc viết lại bằng thư viện requests của Python.
- Khi API đổi: so cấu trúc JSON mới với bảng ở mục 7.2, sửa địa chỉ trong
config/api_config.pyvà tên trường trong filesrc/…tương ứng.
7.5 Cách gọi cụ thể
Mọi lần gọi đều là yêu cầu GET kèm header giống trình duyệt như mục 7.1, thời gian chờ tối đa 30 giây. Ví dụ đơn giản nhất gồm hai lần gọi:
- Gọi địa chỉ (1) để lấy bảng chứng quyền HOSE, rồi đếm số phần tử trong danh sách coveredWarrantData để biết số CW đang niêm yết.
- Gọi địa chỉ (6) với header bổ sung của VNDIRECT, lọc theo một mã CW (ví dụ CACB2516), sắp theo ngày, trang 1, 100 dòng mỗi trang; đọc totalPages để biết còn bao nhiêu trang và xem bản ghi đầu tiên để kiểm tra cấu trúc.
7.6 Script mẫu: 6 hàm tương ứng 6 địa chỉ
Script viết bằng Python, cần hai thư viện requests và pandas. Kết quả in ra màn hình và ghi CSV vào thư mục api_output cạnh file script.
| Hàm | Địa chỉ (bảng 7.2) | Làm gì |
|---|---|---|
| Hàm tiện ích | — | Gửi yêu cầu GET với header của SSI (hoặc VNDIRECT), báo lỗi nếu máy chủ trả mã lỗi HTTP, đọc kết quả JSON. |
| ssi_cw_board | (1) | Lấy toàn bộ CW trong 1 lần gọi; kiểm tra trường code bằng SUCCESS; giữ các cột mã, cơ sở, issuer, giá thực hiện, tỷ lệ, các mốc ngày, giá tham chiếu, trần, sàn, giá khớp, khối lượng và giá trị. |
| ssi_stock_board | (2) | Lấy bảng VNALL làm giá cơ sở; giữ mã, giá tham chiếu, giá khớp, khối lượng, giá trị, ngày giao dịch. |
| ssi_daily_history | (3) | Lấy nến ngày 400 ngày gần nhất (mốc thời gian Unix giây); đổi mốc sang giờ Việt Nam rồi lấy ngày; nhân giá mở, cao, thấp, đóng với 1.000 vì đơn vị gốc là nghìn đồng. |
| ssi_listed_share | (4) | Gọi theo từng mã, đọc trường listedShare. |
| ssi_stock_info | (5) | Lấy lịch sử từ 01/01 tới hôm nay (ngày dạng dd/mm/yyyy), 100 dòng mỗi trang; lặp trang cho tới khi số trang × cỡ trang ≥ tổng số dòng, nghỉ 0,05 giây giữa các trang; giữ ngày, giá đóng cửa, khối lượng và giá trị khớp lệnh, giá trị thoả thuận; sắp theo ngày. |
| vnd_proprietary | (6) | Lọc theo mã CW, sắp theo ngày, 100 dòng mỗi trang, lặp tới hết số trang (nghỉ 0,05 giây giữa các trang); chỉ giữ đúng mã và loại CW; tính lượng bán ròng = khối lượng bán − khối lượng mua (ngược dấu với netVol của VNDIRECT). |
Khi chạy thử, script lần lượt:
- Lấy bảng CW, in số mã và ngày giao dịch, đếm riêng số mã do K phát hành; ghi ra file CSV.
- Lấy bảng VNALL, in số mã; ghi ra file CSV.
- Chọn một mã CW của K làm ví dụ (nếu không có thì lấy mã đầu tiên của bảng), kèm cổ phiếu cơ sở của nó.
- Tải lịch sử 400 ngày của cổ phiếu cơ sở, in số phiên và giá đóng cửa gần nhất; ghi ra file CSV.
- In số lượng CW niêm yết của mã ví dụ.
- Tải lịch sử giao dịch từ đầu năm, tính ADV 20 phiên (tỷ đồng).
- Nghỉ 0,5 giây rồi tải tự doanh của mã ví dụ, in số ngày có dữ liệu và lượng bán ròng luỹ kế; ghi ra file CSV.
8. Quá trình xây dựng
Giai đoạn 1 được suy ra từ thứ tự các thư mục lưu code cũ (không có ngày cụ thể). Giai đoạn 2 là các thay đổi từ tháng 10/2026.
Giai đoạn 1 · Dựng lõi tính toán
- Bảng Horizon trong Excel: lấy bảng CW + cổ phiếu từ SSI, tính IV, delta, HV, breakeven, ghi vào template Excel có định dạng sẵn.
- Thêm dashboard HTML: tách phần dựng trang, xuất 1 file tự chứa.
- Cache theo bước: chạy lại trong ngày không tải lại; bỏ các câu hỏi y/n.
- Một ngày as-of cho mọi nguồn: quy tắc 15:00, lùi ngày khi tự doanh chưa công bố, đưa giá về giá đóng cửa, bảng DATA CHECK.
- Tự doanh theo ngày → Tab 2 phân tích dòng tiền nhà đầu tư.
- GARCH theo kỳ hạn CW: giới hạn persistence ≤ 0,99, backtest walk-forward, workbook GARCH riêng.
- Gộp tên issuer, lãi suất 7% chung cho mọi CW.
Giai đoạn 2 · Ổn định và nối nguồn tồn kho (10/2026)
- 05/10: rà toàn bộ mã nguồn, viết tài liệu cấu trúc; phát hiện bản đóng gói thiếu workbook chính nên “chạy không ra dữ liệu”.
- 06–07/10: main.py kiểm tra workbook ngay từ đầu; phát hiện file tồn kho xuất sai tiểu khoản từ 02/10.
- 08/10: lọc đúng tiểu khoản CW, bù ngày thiếu từ tự doanh (vẽ nét đứt + cảnh báo). Ước tính sau đó trùng khớp số thật.
- 08/10: chuyển sang file tồn kho K_Prop (Power Query): đọc ngày dạng Excel, cho phép nhiều file, log từng file.
- 08/10: K_Prop tự làm mới khi chạy; cảnh báo “History cut” khi dữ liệu tồn kho bắt đầu muộn hơn ngày batch giao dịch.
- 08/10 · bản hoàn chỉnh: chế độ Realtime trong phiên (
Run CW Realtime.bat): giá đang giao dịch mỗi 5 phút, dashboard tự tải lại, phần tự doanh giữ ngày Sync.
9. Vận hành
| Cài đặt một lần | Hằng ngày | Giờ chạy và ngày dữ liệu |
|---|---|---|
|
|
|
Cảnh báo thường gặp
| Log hiện | Nghĩa là | Làm gì |
|---|---|---|
MISSING FILE | Thiếu workbook chính | Đặt CW Market Overview.xlsx cạnh main.py (bản trong data/backup/) |
XX | Một nguồn không đúng ngày as-of (hiện trong DATA CHECK) | Chạy lại sau ít phút; kiểm tra mạng / API |
refresh did not finish | Excel chờ đăng nhập hoặc mạng chậm | Mở K_Prop → Refresh All → lưu → Rebuild |
chart history is cut | Tồn kho bắt đầu muộn hơn ngày batch giao dịch | Lùi mốc query K_Prop hoặc thêm file lịch sử |
estimated from proprietary trading | Ngày thiếu tồn kho, đang vẽ nét đứt | Chờ file ngày đó có trên nguồn rồi Rebuild |
DASHBOARD NOT BUILT | Workbook và CSV khác ngày | Chạy Run (không dùng Rebuild) |
No Sync data yet / Saved results … not found | Realtime chưa có dữ liệu Sync | Chạy Run CW Market Overview trước |
Sync date is N workdays old | Dữ liệu Sync đã cũ | Chạy Run CW Market Overview để HV / GARCH / tự doanh mới |
snapshot failed … retry next round | Lỗi mạng / API ở một lần chụp | Không cần làm gì; vòng sau tự thử lại |
no session newer than the Sync date | Hôm nay không giao dịch | Không dùng Realtime hôm đó |
10. Muốn sửa gì thì sửa ở đâu
| Thay đổi | File | Sau đó |
|---|---|---|
| Giao diện, nhãn, màu, biểu đồ | src/dashboard/template/ | Rebuild |
| Thêm chỉ số cho CW / issuer trên dashboard | market_data.py → app.js.html | Rebuild |
| Bucket / kỳ ở Tab 2 | client_data.py | Rebuild |
| Đợt phát hành mới | K_BATCHES, K_DEFAULT_BATCH trong config | Rebuild |
| Tên file / tiểu khoản tồn kho, bật tắt tự làm mới | K_INVENTORY_FILE, K_INVENTORY_ACCOUNT, K_INVENTORY_REFRESH | Rebuild |
| Khoảng ngày của K_Prop | Power Query trong K_Prop.xlsx | Rebuild |
| Thêm cột vào Excel Horizon | Header trong Excel + FIELD_MAP (excel_exporter.py) + cw_processor.py | Run |
| Địa chỉ API, header | config/api_config.py; tên trường trong src/api_client.py, proprietary_trading.py… | Run |
| Công thức IV, delta, Black-Scholes | option_pricing.py | Run, bật REFRESH_ALL |
| HV, Yang-Zhang / GARCH | historical_loader.py / volatility_models.py, garch_pipeline.py | Run, bật REFRESH_ALL |
| Lãi suất, cổ tức, gộp tên issuer | config/api_config.py | Run, bật REFRESH_ALL |
| Quy tắc chọn ngày as-of | as_of.py | Run |
| Tần suất / giờ chạy realtime | REALTIME_REFRESH_MINUTES, REALTIME_START, REALTIME_END trong config | Chạy lại Realtime |
| Cách chọn giá trong phiên | Hàm live_cw_price trong src/intraday.py | Chạy lại Realtime |


