(P2) CW Dashboard

Một tổ chức phát hành chứng quyền có bảo đảm (CW) không chỉ bán CW mà còn phải nắm giữ cổ phiếu cơ sở để phòng hộ, trả phí giao dịch và chịu chi phí vốn. Muốn biết sổ CW thực sự lãi hay lỗ, cần cộng đủ các mảnh này theo từng ngày, từng đợt phát hành và từng mã cơ sở. Bài viết mô tả cách tính CW PnL Dashboard từ kiến trúc, phương pháp tính, giao diện và những bài học khi vận hành.

1. Bài toán: P&L của một sổ chứng quyền

Khi phát hành CW mua, tổ chức phát hành ở vị thế bán (short) quyền chọn. Để trung hoà rủi ro giá, họ mua cổ phiếu cơ sở theo delta (delta hedging). Lãi lỗ của sổ vì vậy gồm bốn cấu phần:

Cấu phầnÝ nghĩaKý hiệu trong bài
Bán CW (Market Making)Tiền thu từ bán CW trừ chi phí mua lại; phần đã chốt và phần còn treo theo giá hiện tạiCW Realized / CW Unrealized
Cổ phiếu phòng hộ (Hedge)Lãi lỗ mua bán cổ phiếu cơ sở và chênh lệch giá trên lượng đang nắmHedge Realized / Hedge Unrealized
Phí giao dịch (NFI)Phí mua bán CW và cổ phiếuFee
Chi phí vốn (COF)Chi phí của khoản vốn dùng để nắm giữ cổ phiếu phòng hộCOF

Câu hỏi quản trị thường gặp: sổ đang lãi bao nhiêu, đợt phát hành nào hiệu quả, mã cơ sở nào kéo lùi kết quả, vị thế đang lệch delta bao nhiêu, và lãi lỗ đến từ phòng hộ tốt hay chỉ do giá CW trên sàn biến động. Dashboard trả lời các câu hỏi này trên một màn hình.

2. Kiến trúc: tách engine và dashboard

Hệ thống chia làm hai phần độc lập: (1) Engine tính toán nặng và ghi kết quả vào một cơ sở dữ liệu; (2) Dashboard chỉ đọc kết quả đó, cộng gộp theo bộ lọc người dùng chọn và tính thêm các chỉ số rủi ro tại thời điểm xem.

NguồnXử lýĐầu ra
Giao dịch nội bộ: lệnh bán/mua CW, lệnh mua/bán cổ phiếu phòng hộ theo tiểu khoảnEngine P&L toàn kỳ (chạy riêng): tính realized/unrealized theo từng mã, từng ngày; COF theo ngày lịch; giá Black-Scholes với IV nội bộCơ sở dữ liệu kết quả (SQLite): số luỹ kế theo ngày × mã, COF, VN30, điều chỉnh quyền, CW đã tất toán
Điều khoản CW: giá thực hiện, tỷ lệ chuyển đổi, ngày đáo hạn, lịch sử điều chỉnh khi có sự kiện quyềnServer dashboard (Python, thư viện chuẩn): đọc DB ở chế độ chỉ đọc, lọc, cộng gộp, tính GreeksAPI JSON cho 5 tab
Giá đóng cửa cổ phiếu và CW từ nguồn dữ liệu thị trường; nhiều nguồn dự phòng nối tiếp nhauTrang HTML (Chart.js): vẽ biểu đồ, bảng, bộ lọcDashboard mở bằng trình duyệt

Lợi ích của cách tách này:

  • Dashboard không bao giờ ghi vào dữ liệu gốc, nhiều người có thể mở cùng lúc mà không sợ làm hỏng số.
  • Engine chạy xong là số mới hiện ngay: server nhận biết file kết quả đã thay đổi (theo thời điểm sửa file) và tự đọc lại, không cần khởi động lại.
  • Logic P&L nằm ở một nơi duy nhất. Dashboard không tự tính lại realized/unrealized nên không có hai phiên bản số liệu.

Luồng một lần xem

  1. Người dùng bấm đúp file khởi động. Script tìm Python đi kèm, khởi chạy server, đợi server trả lời rồi mới mở trình duyệt (tránh lỗi “This site can’t be reached”).
  2. Trang gọi /api/meta để lấy danh sách đợt phát hành, mã cơ sở, trader phụ trách và ngày dữ liệu mới nhất.
  3. Mỗi tab gọi API riêng: /api/overview, /api/pnl-analytics, /api/positions, /api/iv-surface. Bộ lọc được gửi kèm dưới dạng tham số.
  4. Server cộng gộp, tính Greeks và trả JSON; trang vẽ lại biểu đồ. Nếu người dùng đổi bộ lọc liên tục, trang chỉ vẽ kết quả của lần bấm cuối.

3. Hai cách đo P&L: Kế toán và Theoretical

Điểm khác biệt quan trọng nhất của dashboard là đo P&L theo hai góc nhìn song song. Hai cách chỉ khác nhau ở cách định giá lượng CW đang lưu hành (vẫn còn nợ nhà đầu tư).

Kế toán (TOI / PBT)Theoretical P&L
CW đang lưu hành định giá theoGiá khớp lệnh trên sàn HOSEGiá lý thuyết Black-Scholes với IV định giá nội bộ
Phản ánhSố liệu sổ sách, đối chiếu báo cáo tài chínhHiệu quả kinh tế của sổ phòng hộ delta-neutral
Điểm yếuGiá CW trên sàn có thể lệch xa giá trị hợp lý (thanh khoản mỏng, cung cầu ngắn hạn), làm P&L dao động mà rủi ro thực không đổiPhụ thuộc giả định IV; IV nội bộ sai thì P&L sai
P&L Kế toán = CW Realized + CW Unrealized (giá thị trường) + Hedge Realized + Hedge Unrealized − Phí − COF
Theoretical P&L = CW Realized + CW Unrealized (giá BS) + Hedge Realized + Hedge Unrealized − Phí − COF

Phần lãi lỗ chưa thực hiện theo giá BS được tính như sau:

CW Unrealized (Pricing) = (Giá bán bình quân − Giá BS theo IV nội bộ) × KL CW đang lưu hành
Ví dụ minh hoạ (số giả định): bán 1 triệu CW với giá bình quân 1.200 đ. Cuối ngày giá khớp trên sàn là 1.500 đ, nhưng giá BS với IV nội bộ chỉ 1.250 đ. Theo kế toán, phần chưa thực hiện là (1.200 − 1.500) × 1.000.000 = −300 triệu. Theo Buyback là (1.200 − 1.250) × 1.000.000 = −50 triệu. Chênh 250 triệu đến từ việc giá trên sàn đang cao hơn giá trị lý thuyết, không phải do phòng hộ kém.

Tab Overview luôn hiển thị cả hai để đối chiếu. Tab P&L Analytics dùng một trong hai, người dùng chọn ở tab Settings (lưu theo trình duyệt).

4. Cách cộng dồn P&L, COF và ROI

4.1 Từ số theo mã đến số toàn sổ

Engine ghi số luỹ kế cho từng cặp (mã, ngày). Dashboard cộng mọi mã theo ngày giao dịch, rồi trải ra ngày lịch (ngày nghỉ giữ số của phiên trước) để khớp với COF vốn được tính theo ngày lịch.

Chỉ tiêuCông thức
P&L CW luỹ kếCW Realized + CW Unrealized
P&L cổ phiếu luỹ kếHedge Realized + Hedge Unrealized
Phí luỹ kếPhí CW + phí cổ phiếu
Vốn sử dụngGiá vốn cổ phiếu phòng hộ + phí − dòng tiền ròng từ bán CW
PBT luỹ kếP&L CW + P&L cổ phiếu − phí − COF luỹ kế
Theoretical P&L luỹ kếPBT − CW Unrealized (thị trường) + CW Unrealized (BS)
Một quy tắc nhỏ nhưng quan trọng: nếu một mã không có dòng dữ liệu ở một ngày giao dịch, giá trị ngày đó là 0 chứ không kéo số của ngày trước xuống. Engine luôn ghi dòng khi mã còn vị thế, nên “không có dòng” nghĩa là thật sự không còn gì.

4.2 Phân bổ COF khi lọc

COF thật được engine tính cho cả đợt phát hành. Khi người dùng lọc một mã cơ sở hoặc một trader, dashboard phân bổ COF theo tỷ trọng giá vốn cổ phiếu phòng hộ của nhóm đang lọc trong đợt. Ngày đợt chưa có vốn phòng hộ thì chia theo số lượng CW. Không lọc gì thì tổng đúng bằng COF của engine.

COF nhóm lọc (ngày t) = Σ theo đợt [ COF đợt(t) × Giá vốn phòng hộ của nhóm(t) / Giá vốn phòng hộ của đợt(t) ]

4.3 Waterfall theo kỳ

Chọn một kỳ bất kỳ, biểu đồ thác nước tách thay đổi P&L thành từng cấu phần. Mỗi thanh là chênh lệch giữa cuối kỳ và ngay trước kỳ:

P&L đầu kỳ → + CW Realized → + CW Unrealized → + Hedge Realized → + Hedge Unrealized → − Phí → − COF → P&L cuối kỳ

Khi lọc theo đợt phát hành, dữ liệu được cắt từ ngày bắt đầu của đợt. Nếu đợt sau dùng chung tiểu khoản phòng hộ với đợt trước, phần dữ liệu từ ngày đợt sau bắt đầu sẽ bị loại khỏi đợt trước, để phần phòng hộ của hai đợt không tính lẫn vào nhau.

4.4 ROI

ROI(t) = (P&L luỹ kế(t) − P&L đầu kỳ) / Vốn bình quân từ đầu kỳ đến t × 100%

Vốn bình quân là trung bình mở rộng (expanding mean) của |vốn sử dụng|. ROI chỉ được tính khi vốn bình quân vượt một ngưỡng tối thiểu, tránh chia cho số rất nhỏ ở những ngày đầu.

4.5 Bảng P&L Summary

Bảng theo dạng báo cáo kết quả kinh doanh: TOI (CW + cổ phiếu, mỗi phần tách realized/unrealized) → OPEX → COF → PBT → Theoretical P&L. Mỗi cột là thay đổi trong ngày, tuần (ISO) hoặc tháng; hiển thị 12 tháng gần nhất; bên phải ghim các cột YTD từng năm và Toàn kỳ. Đơn vị tỷ đồng, số âm trong ngoặc đơn.

5. Greeks và rủi ro vị thế

Với mỗi CW còn lưu hành, dashboard định giá bằng mô hình Black-Scholes (Black và Scholes, 1973) cho quyền chọn kiểu châu Âu, rồi quy về vị thế của tổ chức phát hành.

Đại lượngCách tính
Thời gian còn lại T(Ngày đáo hạn − ngày xem) / 365, tính theo ngày lịch
Moneyness(S − K) / K; CW mua ITM khi > 0
Giá thực hiện K, tỷ lệ chuyển đổi CRLấy theo điều khoản hiệu lực tại ngày xem: nếu đã qua ngày giao dịch không hưởng quyền thì dùng K và CR sau điều chỉnh
Lãi suất phi rủi ro rMột tham số cấu hình chung cho mọi CW
Δ, Γ, ΘCông thức Black-Scholes chuẩn; Θ tính theo ngày lịch

Vì tổ chức phát hành bán CW, với OI là số CW đang lưu hành:

Chỉ sốCông thứcCách đọc
Delta CW (đồng)−OI × Δ / CR × SLượng cổ phiếu tương đương mà vị thế CW đang short, quy ra tiền
Delta ExposureDelta CW + giá trị cổ phiếu phòng hộÂm = sổ đang thiếu phòng hộ (net short); dương = phòng hộ dư
Gamma (1%)½ × (−OI × Γ / CR) × (S × 1%)²Lãi lỗ bậc hai khi cổ phiếu biến động 1%; thường âm với bên bán quyền chọn
Theta−OI × Θ / CRĐồng/ngày; dương = sổ hưởng lợi khi thời gian trôi
Book HedgingGiá vốn + lãi lỗ chưa thực hiện của cổ phiếu phòng hộGiá trị thị trường của sổ cổ phiếu
Tỷ lệ phân phốiOI / Khối lượng phát hànhBao nhiêu phần trăm CW đã đến tay nhà đầu tư
Lưu ý khi tự lập trình: nhiều thư viện trả delta, gamma, theta cho một quyền chọn trên một cổ phiếu. Với CW cần chia cho tỷ lệ chuyển đổi trước khi nhân với số lượng CW. Bỏ sót bước này sẽ phóng đại rủi ro lên CR lần.

6. Chọn biến động (IV) để định giá

Greeks rất nhạy với biến động σ. Dashboard chọn σ theo thứ tự ưu tiên:

  1. IV định giá nội bộ: lịch IV do bộ phận định giá khai báo cho từng CW, áp dụng từ một ngày hiệu lực.
  2. IV quét thị trường: giá trị gần nhất do một tiến trình riêng tính từ giá CW trên bảng giá.
  3. IV giải ngược từ giá đóng cửa CW: phương pháp chia đôi (bisection) trên khoảng [0,1%; 500%], với giá quyền chọn = giá CW × CR.
  4. Giá trị mặc định khi không có dữ liệu nào.

Tab IV Surface dựng bốn góc nhìn cho từng mã cơ sở: smile (IV theo moneyness), term structure (IV của CW gần ATM nhất ở các mốc 1M, 3M, 6M, 9M, 1Y), heatmap moneyness × kỳ hạn, và IV lịch sử (trung bình các CW theo ngày).

Heatmap hiện lấy CW có moneyness gần mốc nhất chứ không nội suy, nên một CW có thể xuất hiện ở nhiều ô. Nếu cần một bề mặt IV liên tục, nên nội suy (ví dụ theo total variance) hoặc khớp một mô hình tham số.

7. Giao diện 5 tab

TabNội dungĐiều khiển
Overview5 thẻ KPI (Total P&L, Delta Exposure, Gamma 1%, Theta, Book Hedging) · PBT luỹ kế · Sổ phòng hộ so với VN30 · Bảng P&L SummaryNgày / Tuần / Tháng; lăn chuột để zoom, kéo để trượt, nhấp đúp để về toàn kỳ
P&L AnalyticsWaterfall · P&L luỹ kế · ROI · Bảng phân rã theo mã cơ sở → từng CW (Live/Expired)Kỳ từ–đến, đợt phát hành, mã cơ sở, trạng thái, trader; sắp xếp mọi cột
PositionsTỷ lệ phân phối theo thời gian · Cơ cấu sổ phòng hộ (donut) · Delta Exposure theo mã (thanh hai chiều xanh/đỏ) · Bảng vị thế: moneyness, TTM, OI, khối lượng phát hành, tỷ lệ phân phối, vốn, Greeks, giao dịchNgày xem, đợt, mã cơ sở, trader, ITM/OTM, ô tìm mã
IV SurfaceHeatmap · Smile · Term structure · IV lịch sửChọn mã cơ sở
SettingsChọn phương pháp P&L cho tab P&L AnalyticsLưu trong trình duyệt

Một vài chi tiết giúp dùng hằng ngày dễ hơn: link có thể mở thẳng tab và kỳ (ví dụ ?tab=pnl&start=2026-07-01&end=2026-09-30); bảng P&L Summary ghim cột tên và cột tổng khi cuộn ngang; mã chỉ còn cổ phiếu phòng hộ (CW đã đáo hạn) vẫn hiện một dòng để không bỏ sót delta; số âm hiển thị trong ngoặc đơn và tô đỏ.

8. Vận hành hằng ngày

BướcViệc làm
1Sau phiên, chạy engine P&L để cập nhật cơ sở dữ liệu kết quả.
2Bấm đúp file khởi động dashboard. Trình duyệt tự mở khi server sẵn sàng; cửa sổ dòng lệnh cần để mở suốt lúc dùng.
3Kiểm tra góc trên: “Số liệu tới <ngày>” phải là phiên mới nhất. Rê chuột để xem giờ engine chạy.
4Nếu server đang chạy sẵn, chỉ cần bấm nút làm mới trên trang sau khi engine chạy xong.

Lỗi thường gặp

Hiện tượngNguyên nhân và cách xử lý
Mọi tab báo “Chưa có dữ liệu P&L”Server không tìm thấy cơ sở dữ liệu kết quả → chạy engine, kiểm tra đường dẫn trong file cấu hình
Bộ lọc trống, Greeks bằng 0Thiếu file điều khoản CW, hoặc không lấy được giá đóng cửa (mất mạng)
Greeks bất thườngCW chưa có IV nội bộ và không có IV quét → bổ sung IV, khởi động lại server
Giao diện vỡ, không có biểu đồMáy không truy cập được CDN chứa thư viện giao diện
Sửa file cấu hình phụ mà số không đổiMột số file chỉ được đọc lúc khởi động → tắt và mở lại server

9. Bài học khi tự xây dựng

Những điểm dưới đây rút ra trong quá trình rà soát và vận hành, hữu ích cho ai muốn xây công cụ tương tự:

  • Giữ mã nguồn cùng sản phẩm. Chỉ phát hành bản đã biên dịch thì người kế nhiệm không sửa được, và sản phẩm bị khoá vào đúng một phiên bản Python.
  • Đóng gói môi trường chạy. Mang theo bản Python nhúng giúp người dùng không phải cài đặt, nhưng cần giữ thư mục này luôn có sẵn trên máy (đặc biệt khi đồng bộ qua dịch vụ lưu trữ đám mây ở chế độ “chỉ tải khi mở”).
  • Không để giá trị mặc định chạy âm thầm. Khi phải dùng IV mặc định, nên đánh dấu rõ trên giao diện để người đọc biết Greeks của mã đó chỉ mang tính tham khảo.
  • Mọi số phải cùng một ngày. IV, giá và thời gian đến đáo hạn nên tính theo cùng ngày dữ liệu, kể cả khi xem vào cuối tuần.
  • Một nơi cho mỗi định nghĩa. Danh sách đợt phát hành, tham số lãi suất… chỉ nên khai báo ở một chỗ; khai báo hai nơi dễ khiến người dùng tưởng đã đổi mà hệ thống vẫn dùng giá trị cũ.
  • Dọn cấu hình không dùng. Tham số không có tác dụng nên xoá, tránh tạo cảm giác đã điều chỉnh giả định.
  • Bảo mật mặc định. Dữ liệu vị thế và P&L là thông tin nhạy cảm: server nên chỉ mở cho máy cục bộ, hoặc có xác thực nếu cần chia sẻ trong mạng nội bộ.
  • Giảm phụ thuộc mạng ngoài. Đóng gói sẵn thư viện giao diện thay vì tải từ CDN giúp dashboard vẫn chạy khi mạng bị hạn chế.

10. Ghi chú bản quyền và miễn trừ

  • Nội dung, sơ đồ và ví dụ trong bài do tác giả tự biên soạn. Số liệu trong ví dụ là giả định để minh hoạ, không phản ánh vị thế hay kết quả kinh doanh thực tế của bất kỳ tổ chức nào.
  • Mô hình Black-Scholes và các công thức Greeks là kiến thức tài chính công khai (Black, F. & Scholes, M., 1973, *The Pricing of Options and Corporate Liabilities*, Journal of Political Economy).
  • Giao diện dùng các thư viện mã nguồn mở theo giấy phép của chúng: Chart.js, chartjs-plugin-zoom, Hammer.js, Tailwind CSS (MIT); phông Manrope (SIL Open Font License); bộ biểu tượng Material Symbols (Apache 2.0). Phần xử lý dùng Python, NumPy, pandas, SciPy (BSD) và SQLite (public domain).
  • SSI, VNDIRECT, HOSE, VN30 và các tên khác được nhắc đến là nhãn hiệu hoặc tên gọi thuộc chủ sở hữu tương ứng, chỉ dùng để mô tả.
  • Bài viết mang tính chia sẻ kỹ thuật, không phải khuyến nghị đầu tư hay tư vấn tài chính.

Tags: ,

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments