(P1) CW Market Overview

Để 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.

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ệuXử 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ạyCache 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ạidata/*.csv: dữ liệu trung gian cho dashboard và Rebuild

2. Ba chế độ chạy

File bấm đúpKhi nào dùngLàm gìThời gian
Run CW Market Overview.bat
chốt ngày (Sync)
Mỗi ngày; tốt nhất sau 15:00 khi VNDIRECT đã công bố tự doanhTả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 dashboardVài phút lần đầu trong ngày; nhanh hơn khi chạy lại (cache)
Run CW Realtime.bat
trong phiên
Trong giờ giao dịch, khi cần giá đang khớpMỗ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ạiVài giây mỗi lần cập nhật; chạy tới 15:05
Rebuild Dashboard.bat
dự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 realtimeKhô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)
Cả ba file dùng chung phần dựng dashboard trong 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.

  1. 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ạy main.py.
  2. 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.py tự cài gói còn thiếu (pandas, arch, xlwings…).
  3. Kiểm tra workbook (main.py): thiếu CW Market Overview.xlsx thì dừng ngay, báo “MISSING FILE”.
  4. Pipeline 9 bước (bảng dưới).
  5. 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.
  6. In DONE và mở dashboard: cửa sổ dừng lại để đọc log; CW Dashboard.html tự mở.
BướcViệc làmFile / 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ớiapi_client
[3/9]Bảng cổ phiếu VNALLapi_client
[4/9]Giá trị khớp, ADV 20/60 phiên, ADV từ đầu nămunderlying_liquidity · cache liquidity
[5/9]Giá lịch sử, HV và Yang-Zhang theo kỳ hạn gốc của CWhistorical_loader · cache hv
[6/9]Tự doanh luỹ kế + theo ngày cho từng CWproprietary_trading · ghi pdt_cache.csv, pdt_daily.csv
[7/9]Bảng master: IV, delta, breakeven, leverage, % phân phốicw_processor, option_pricing
[8/9]GARCH / GJR-GARCH cho từng cổ phiếu cơ sở, quy ra vol theo kỳ hạn CWgarch_pipeline, volatility_models · cache garch
[RT]Snapshot Real-time nếu đã có phiên đóng mới hơn ngày as-ofrealtime · ghi data/realtime/
[9/9]Ghi CSV, bảng DATA CHECK, Excel (Horizon + RawData), file GARCHrealtime, as_of, raw_data, excel_exporter, workbook_io
Rebuild Dashboard.bat không gọi API: chỉ chạy 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.

  1. Đọ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ạy Run CW Market Overview.bat trước.
  2. Tải bảng CW và bảng VNALL của SSI (2 lần gọi API).
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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ênGiữ ở ngày Sync gần nhất (dashboard ghi rõ ngày)
  • Giá CW, giá cơ sở, % thay đổi, trần / sàn
  • IV, delta, moneyness, breakeven, leverage, DTE
  • Giá trị giao dịch từ đầu phiên
  • Bảng toàn bộ CW, thị phần theo giá trị giao dịch, biểu đồ IV
  • Tự doanh, lượng CW nhà đầu tư nắm giữ, % phân phối (VNDIRECT chỉ công bố sau phiên)
  • Tab 2 · Client Overview
  • Tồn kho và biểu đồ phân phối theo batch
  • HV, Yang-Zhang, GARCH (tính từ giá đóng cửa)

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.

  1. 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).
  2. client_data.py: dòng tiền nhà đầu tư theo ngày, bucket moneyness / DTE / leverage → Tab 2 (CL2, FIRST).
  3. 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.
  4. 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).
  5. 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 OverviewTab 2 · Client Overview
  • 1.1 KPI thị trường
  • 1.2 Thị phần theo issuer · Định giá so với phân phối · Phân phối theo batch
  • 1.3 Treemap net mua/bán · Bảng toàn bộ CW
  • 1.4 IV từng issuer so với HV / GARCH / GJR
  • Chọn kỳ tự do + Today / 1W / 1M / 3M
  • 2.1 Sở thích sản phẩm theo moneyness, DTE, leverage
  • 2.2 Dòng tiền theo cơ sở · Dòng tiền theo ngày

“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ómFileVai trò
ChạyRun CW Market Overview.batChạy hằng ngày: kiểm tra Python → main.py → mở dashboard.
ChạyRun CW Realtime.batChế độ realtime: giá đang giao dịch mỗi 5 phút, dashboard tự tải lại; dừng sau 15:05.
ChạyRebuild Dashboard.batChỉ 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ạymain.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ạyrun_realtime.pyKhởi động vòng lặp realtime (gọi src/intraday.py).
Chạysrc/ensure_python.batTìm hoặc tự cài Python 3.12 + thư viện; cài VS Code lần đầu.
Cấu hìnhconfig/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ánapi_client.pyGọi SSI: bảng CW, bảng VNALL, số lượng niêm yết từng mã.
Tính toánas_of.pyChọ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ánstep_cache.pyLưu / dùng lại kết quả từng bước theo ngày.
Tính toánhistorical_loader.pyGiá lịch sử SSI; HV và Yang-Zhang trên kỳ hạn gốc của CW.
Tính toánunderlying_liquidity.pyGiá trị khớp lệnh, ADV 20 / 60 phiên, ADV từ đầu năm.
Tính toánproprietary_trading.pyTự doanh VNDIRECT từng CW: luỹ kế, trong ngày, theo ngày.
Tính toánoption_pricing.pyBlack-Scholes, giải IV (brentq), delta.
Tính toáncw_processor.pyGộp mọi nguồn thành bảng master: IV, delta, breakeven, leverage, % phân phối.
Tính toánvolatility_models.pyGARCH / GJR-GARCH (Student-t), backtest QLIKE, Diebold-Mariano, VaR.
Tính toángarch_pipeline.pyChạy GARCH cho từng cơ sở, quy ra vol theo kỳ hạn từng CW.
Tính toánrealtime.pySnapshot Real-time; ghi cw_eod.csv, underlying_daily.csv.
Tính toánraw_data.pySheet RawData: dữ liệu thô từng nguồn, theo ngày.
Tính toánexcel_exporter.pyGhi Horizon qua Excel thật (giữ định dạng); ghi workbook GARCH.
Tính toánworkbook_io.pyPopup “đóng Excel”, backup 30 bản, lưu an toàn.
Tính toánintraday.pyRealtime: 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.
Dashboardinventory_refresh.pyMở file tồn kho bằng Excel → Refresh All → lưu → đóng; quá 600 giây thì bỏ qua và cảnh báo.
Dashboarddashboard/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.
Dashboarddashboard/market_data.pyDữ liệu Tab 1: KPI, issuer, bucket, bảng CW, Real-time.
Dashboarddashboard/client_data.pyDữ liệu Tab 2: dòng tiền theo ngày, bucket tại ngày giao dịch.
Dashboarddashboard/k_batches.pyBiể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ử.
Dashboardtemplate/head · body · app.jsCSS 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ệuK_Prop.xlsxTồn kho theo ngày; Power Query gộp file ngày từ thư mục SharePoint nội bộ.
Dữ liệudata/*.csvTự doanh, giá đóng cửa CW và cơ sở — đầu vào cho dashboard và Rebuild.
Dữ liệudata/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ệudata/realtime/Snapshot thị trường mới nhất (bảng CW, giá cơ sở, meta.json có giờ chụp).
Đầu raCW Market Overview.xlsxWorkbook chính (bắt buộc): code ghi sheet Horizon (tìm cột theo tên) và RawData.
Đầu raCW Dashboard.htmlDashboard 1 file, mở bằng trình duyệt.
Đầu raGARCH 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.

Lưu ý trước khi dùng. Đây không phải API chính thức nên có thể đổi định dạng hoặc chặn bất cứ lúc nào, và không có cam kết dịch vụ. Hãy gọi vừa phải (nghỉ 0,03–0,05 giây giữa các lần gọi), chỉ dùng cho mục đích tham khảo, nội bộ, và tham khảo điều khoản sử dụng của SSI và VNDIRECT trước khi dùng cho mục đích khác. Bài viết chỉ mô tả cách hệ thống hoạt động, không khuyến nghị khai thác dữ liệu ngoài phạm vi cho phép.

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ớiBước
1Bảng chứng quyền HOSEiboard-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
2Bảng cổ phiếu VNALLiboard-query.ssi.com.vn/stock/group/VNALL—Danh sách mã: stockSymbol, refPrice, matchedPrice, nmTotalTradedQty, nmTotalTradedValue, tradingDate[3], Realtime
3Giá lịch sử nến ngày (CW và cổ phiếu)iboard-api.ssi.com.vn/statistics/charts/historyresolution (1D), symbol, from, to (Unix giây)Các mảng song song t, o, h, l, c, v (giá × 1000)[1], [5], [8]
4Thông tin một mã (số lượng niêm yết)iboard-query.ssi.com.vn/stock/[mã]—listedShare[2]
5Lịch sử giao dịch cổ phiếuiboard-api.ssi.com.vn/statistics/company/ssmi/stock-infosymbol, 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]
6Tự doanh theo mã CWapi-finfo.vndirect.com.vn/v4/proprietary_tradingq (lọc theo mã CW, ví dụ CACB2516, hoặc lọc theo ngày), sort (theo ngày), page, sizecode, 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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.py và tên trường trong file src/… 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:

  1. 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.
  2. 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:

  1. 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.
  2. Lấy bảng VNALL, in số mã; ghi ra file CSV.
  3. 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ó.
  4. 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.
  5. In số lượng CW niêm yết của mã ví dụ.
  6. Tải lịch sử giao dịch từ đầu năm, tính ADV 20 phiên (tỷ đồng).
  7. 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

  1. 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.
  2. Thêm dashboard HTML: tách phần dựng trang, xuất 1 file tự chứa.
  3. 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.
  4. 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.
  5. Tự doanh theo ngày → Tab 2 phân tích dòng tiền nhà đầu tư.
  6. GARCH theo kỳ hạn CW: giới hạn persistence ≤ 0,99, backtest walk-forward, workbook GARCH riêng.
  7. 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)

  1. 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”.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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ầnHằng ngàyGiờ chạy và ngày dữ liệu
  1. Máy Windows có Excel, Excel đăng nhập tài khoản công ty.
  2. Đặt CW Market Overview.xlsx và K_Prop.xlsx cạnh main.py.
  3. Trong K_Prop, lùi mốc ngày của Power Query để có đủ lịch sử; nếu nguồn không còn file cũ thì dùng thêm file lịch sử.
  4. K_Prop tải từ email/Teams: Properties → Unblock.
  5. Chạy thử Rebuild Dashboard.bat, đọc log.
  1. Trong phiên (tuỳ chọn): bấm đúp Run CW Realtime.bat, để cửa sổ mở; dashboard tự cập nhật mỗi 5 phút, tự dừng sau 15:05.
  2. Sau 15:00, khi tự doanh đã công bố: bấm đúp Run CW Market Overview.bat để chốt ngày. Không cần mở K_Prop.
  3. Đợi DONE. — bước làm mới K_Prop có thể mất vài phút.
  4. Đọc log: DATA CHECK toàn OK, không có WARNING. Dashboard tự mở.
  • Run trước 15:00 → giá đóng cửa phiên hôm trước.
  • Run sau 15:00 → phiên hôm nay, nếu tự doanh đã công bố; chưa có thì lùi 1 ngày.
  • Realtime → giá đang khớp, cập nhật 5 phút/lần; số tự doanh giữ ngày Sync.
  • “Time” trên dashboard là giờ dựng file; “LIVE hh:mm” là giờ chụp bảng giá.

Cảnh báo thường gặp

Log hiệnNghĩa làLàm gì
MISSING FILEThiếu workbook chínhĐặt CW Market Overview.xlsx cạnh main.py (bản trong data/backup/)
XXMộ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 finishExcel chờ đăng nhập hoặc mạng chậmMở K_Prop → Refresh All → lưu → Rebuild
chart history is cutTồn kho bắt đầu muộn hơn ngày batch giao dịchLùi mốc query K_Prop hoặc thêm file lịch sử
estimated from proprietary tradingNgày thiếu tồn kho, đang vẽ nét đứtChờ file ngày đó có trên nguồn rồi Rebuild
DASHBOARD NOT BUILTWorkbook và CSV khác ngàyChạy Run (không dùng Rebuild)
No Sync data yet / Saved results … not foundRealtime chưa có dữ liệu SyncChạy Run CW Market Overview trước
Sync date is N workdays oldDữ liệu Sync đã cũChạy Run CW Market Overview để HV / GARCH / tự doanh mới
snapshot failed … retry next roundLỗi mạng / API ở một lần chụpKhông cần làm gì; vòng sau tự thử lại
no session newer than the Sync dateHôm nay không giao dịchKhông dùng Realtime hôm đó

10. Muốn sửa gì thì sửa ở đâu

Thay đổiFileSau đó
Giao diện, nhãn, màu, biểu đồsrc/dashboard/template/Rebuild
Thêm chỉ số cho CW / issuer trên dashboardmarket_data.py → app.js.htmlRebuild
Bucket / kỳ ở Tab 2client_data.pyRebuild
Đợt phát hành mớiK_BATCHES, K_DEFAULT_BATCH trong configRebuild
Tên file / tiểu khoản tồn kho, bật tắt tự làm mớiK_INVENTORY_FILE, K_INVENTORY_ACCOUNT, K_INVENTORY_REFRESHRebuild
Khoảng ngày của K_PropPower Query trong K_Prop.xlsxRebuild
Thêm cột vào Excel HorizonHeader trong Excel + FIELD_MAP (excel_exporter.py) + cw_processor.pyRun
Địa chỉ API, headerconfig/api_config.py; tên trường trong src/api_client.py, proprietary_trading.py…Run
Công thức IV, delta, Black-Scholesoption_pricing.pyRun, bật REFRESH_ALL
HV, Yang-Zhang / GARCHhistorical_loader.py / volatility_models.py, garch_pipeline.pyRun, bật REFRESH_ALL
Lãi suất, cổ tức, gộp tên issuerconfig/api_config.pyRun, bật REFRESH_ALL
Quy tắc chọn ngày as-ofas_of.pyRun
Tần suất / giờ chạy realtimeREALTIME_REFRESH_MINUTES, REALTIME_START, REALTIME_END trong configChạy lại Realtime
Cách chọn giá trong phiênHàm live_cw_price trong src/intraday.pyChạy lại Realtime
0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments