Tính toán và chạy thử chiến lược
Mục lục
Trang này viết cho vnstock_mcp v1.0.0rc1, bản thử nghiệm. Tên hàm, tham số và cột dữ liệu có thể còn đổi trước ngày phát hành; khi cài, ghi rõ số phiên bản như ở trang Cài đặt. Bản đang phát hành chính thức là v0.4.0, xem tài liệu bản đó.
Nhóm tool quant_* gọi vnstock_quant 1.0.0rc1 trên máy bạn. Trợ lý không tự viết mã tính chỉ báo hay vòng lặp
backtest: nó gọi đúng hàm của thư viện, và mỗi lần gọi để lại mã Python tương đương. Cần cài vnstock-mcp[quant].
Nhóm tính năng nào mở ở cấp nào, lượt thử của bản Cộng đồng và quy mô mỗi lần chạy thử do vnstock_quant quyết
định: Quyền dùng và hạn mức. vnstock-mcp không tự đếm lượt.
Nối bước bằng call_id
Bảng dài không chép qua cuộc trò chuyện. Mỗi kết quả có call_id, và bước sau nhận nó theo hai cách:
data: một bảng đã có trong phiên ("c3") hoặc bảng đã lưu theo tên ("fpt_1y"), thay chosymbol.refs: tham số của hàm lấy từ kết quả trước.
Cách viết trong refs | Lấy gì |
|---|---|
"c4" | Cả kết quả. Bảng một cột số thành mảng, nhiều cột số thành ma trận; kết quả mô hình lấy khoá trùng tên tham số |
"c4.weights" | Khoá weights của một kết quả mô hình |
"c5.FPT" | Một cột của bảng |
"c5.mean" | Trung bình từng cột của bảng |
"c6.daily_returns" | Chuỗi lợi suất ngày của một lần backtest |
Kết quả mô hình có mảng dài (chuỗi lợi suất, đường tài sản) chỉ hiện phần cuối cho trợ lý; bản đủ nằm trong call_id.
Các tool
| Tool | Gọi vnstock_quant | Nhóm tính năng |
|---|---|---|
quant_ta | vq.ta.compute: 58 chỉ báo; length là chu kỳ (SMA20 → length=20) | ta_basic (10 chỉ báo), ta |
quant_fa | vq.fa.ratios(vq.fa.Dataset.load(...)): chỉ số tài chính từ BCTC gốc, có công thức | fa_basic, fa, fa_advanced |
quant_risk | vq.risk: Sharpe, Sortino, beta, VaR, CVaR, mức sụt giảm, summary | risk |
quant_returns | Bảng lợi suất ngày nhiều mã, các phiên chung | risk |
quant_portfolio | vq.portfolio: lợi suất, rủi ro, hiệp phương sai, tối ưu tỷ trọng, quỹ mở | portfolio |
quant_valuation | vq.valuation: DDM, P/E hợp lý, lợi suất và tăng trưởng hàm ý | portfolio |
quant_prices | vq.prices: giá điều chỉnh theo sự kiện doanh nghiệp, bảng hệ số | risk |
quant_micro | vq.micro: phân loại bên chủ động, nến khối lượng, CVD, VPIN, biến động thực hiện | risk |
quant_backtest | vq.backtest.call: chạy thử chiến lược và các công cụ đi kèm | bt_basic, bt, bt_portfolio, bt_optimize |
quant_catalog | Tra chỉ báo, chỉ số, thước đo, công thức, tham số (JSON Schema) | Không cần |
quant_entitlement | Cấp quyền và lượt thử còn lại, không trừ lượt | Không cần |
Tool không mở ở cấp của bạn thì không xuất hiện; quant_ta chỉ liệt kê chỉ báo bạn dùng được.
Chỉ báo và rủi ro
quant_ta(indicator="rsi", symbol="FPT", lookback="1Y", length=14, source="ssi")
quant_ta(indicator="macd", data="c1") # trên bảng giá đã có
quant_risk(method="summary", symbol="FPT", benchmark="VNINDEX", source="ssi")
quant_risk(method="sharpe_ratio", data="c1") # tính từ cột closeChỉ số tài chính
quant_fa(symbols="FPT", period="year", source="fhsc", price_source="ssi",
ids=["RT_PRT_ROE", "RT_VALUE_PE", "RT_VALUE_PB"])sourcelà nguồn báo cáo tài chính,price_sourcelà nguồn giá dùng cho chỉ số định giá. Hai nguồn có thể khác nhau.- Chỉ tải báo cáo của
periodđược hỏi. Lần đầu mỗi mã có thể quá một phút (xem Lời gọi lâu). - Cột
reasonnói vì sao một chỉ số thiếu.MISSING_MARKET: thiếu giá hoặc số cổ phiếu. Open API chưa có số cổ phiếu theo ngày, nên P/E, P/B, EPS trảMISSING_MARKET, trừ khi bạn bậtestimate_shares=true: thư viện ước số cổ phiếu từ vốn điều lệ. Đó là số ước tính, có thể lệch nhiều sau đợt phát hành; trợ lý được dặn nói rõ điều này, vàprovenanceghi lại. MISSING_INPUT: báo cáo thiếu dòng chi tiết mà công thức cần.- Công thức từng chỉ số:
quant_catalog(module="fa", name="RT_PRT_ROE").
Danh mục nhiều mã
quant_returns(symbols="FPT,VCB,HPG", lookback="1Y", source="ssi") → c1
quant_portfolio(method="covariance", refs={"returns": "c1"}) → c2
quant_portfolio(method="max_sharpe", args={"rf": 0.0},
refs={"cov": "c2", "mu": "c1.mean"}) → c3
quant_portfolio(method="concentration", refs={"weights": "c3.weights"})Tỷ trọng theo thứ tự cột của bảng lợi suất. Tham số của từng hàm: quant_catalog(module="portfolio", name="max_sharpe").
Kết quả mô hình đúng trên giả định đưa vào; khi mọi mã có lợi suất kỳ vọng không vượt rf, thư viện báo Sharpe tối đa
không xác định thay vì trả một tỷ trọng vô nghĩa.
Giá điều chỉnh
quant_prices(method="from_vnstock", symbol="FPT", start="2025-01-01", end="2025-12-31",
source="ssi", events_source="ssi")
quant_prices(method="adjust", data="c4", events="c5") # trên bảng phiên và bảng sự kiện đã lấyfrom_vnstock đọc hai loại dữ liệu: phiên giao dịch (source) và lịch sự kiện (events_source), mỗi loại một nguồn.
Kết quả tính theo VND. warnings cho biết sự kiện nào lệch với giá tham chiếu của sàn và bảng giá có thiếu giá trần,
giá sàn không; hãy đọc trước khi dùng. Một năm dữ liệu có thể mất hơn một phút.
Vi cấu trúc trên khớp lệnh
market_equity(symbol="FPT", method="trades", source="dnse") → c6
quant_micro(method="bars", data="c6", params={"by": "volume", "size": 50000}) → c7
quant_micro(method="vpin", data="c7") # VPIN cần nến khối lượng có buy_volume, sell_volume
quant_micro(method="cvd", data="c6")Chạy thử chiến lược
quant_backtest(tool=..., args=..., refs=..., data=... hoặc symbol=...) gọi một trong các công cụ của
vq.backtest:
tool | Làm gì |
|---|---|
list_profiles, list_brokers, list_presets, list_indicators | Hồ sơ thị trường (lô, bước giá, biên độ, chu kỳ thanh toán, thuế bán), biểu phí tham khảo, chế độ khớp lệnh, chỉ báo dùng được trong luật |
eval_rule_dsl, check_rule_dsl_causality | Dịch bảng quy tắc thành tín hiệu; kiểm luật có nhìn trước tương lai không |
detect_limit_events | Tìm phiên trần, sàn |
run_backtest | Một mã |
run_portfolio | Nhiều mã, tái cân bằng theo tỷ trọng |
sweep, walk_forward | Dò tham số; kiểm trên đoạn dữ liệu chưa dùng để chọn tham số |
monte_carlo, deflated_sharpe_ratio | Độ tin cậy của kết quả; Sharpe đã hiệu chỉnh cho số lần thử |
portfolio_analytics, run_fixture_demo | Phân tích kết quả danh mục; chạy mẫu có sẵn |
Luật vào, ra viết bằng bảng quy tắc dsl trên chỉ báo, không phải đếm số phiên để viết danh sách tín hiệu:
quant_backtest(tool="run_backtest", symbol="HPG", lookback="1Y", source="ssi", args={"dsl": {
"entry_rules": [{"left": {"ind": "sma", "params": {"length": 10}}, "op": "cross_above",
"right": {"ind": "sma", "params": {"length": 30}}}],
"exit_rules": [{"left": {"ind": "sma", "params": {"length": 10}}, "op": "cross_below",
"right": {"ind": "sma", "params": {"length": 30}}}]}}) → c8
quant_backtest(tool="monte_carlo", refs={"returns": "c8.daily_returns"})
quant_backtest(tool="deflated_sharpe_ratio", refs={"returns": "c8.daily_returns"}, args={"num_trials": 20})symbollấy giá quavnstock;datadùng bảng giá đã có, kể cả bảng bạn nhập từ tệp. Khi nhiều bước cần cùng một bảng giá (xem tín hiệu bằngeval_rule_dslrồi mới chạy thử), lấy giá một lần bằngmarket_equityrồi truyềndatacho các bước, để mọi bước tính trên đúng một bảng.- Tín hiệu tự viết vẫn dùng được:
entries,exitstrongargs, hoặc lấy từ kết quả củaeval_rule_dslquarefs={"entries": "c7.entries", "exits": "c7.exits"}. run_portfolionhậnassets: mỗi mục cósymbol(hoặcdata) vàdslhayentries/exits; córebalancethì tín hiệu là tuỳ chọn.- Tham số đầy đủ của từng công cụ:
quant_catalog(module="backtest", name="run_backtest"). warningscủa kết quả ghi giả định cần biết, ví dụ biểu phí chưa xác minh.
Kết quả backtest là chạy thử trên dữ liệu quá khứ và giả định bạn đưa vào, không phải lợi nhuận kỳ vọng,
không phải khuyến nghị đầu tư. Dùng walk_forward, monte_carlo, deflated_sharpe_ratio để thấy
kết quả có phụ thuộc vào việc dò tham số quá kỹ hay không.
Lời gọi lâu
Mặc định mỗi tool chờ 60 giây (VNSTOCK_MCP_TIMEOUT). Lời gọi tải nhiều dữ liệu, như quant_fa lần đầu hay
quant_prices nhiều năm, có thể lâu hơn. Khi đó trợ lý nhận lỗi StillRunning: phép tính vẫn chạy trên máy và kết quả
được giữ lại. Gọi lại đúng tham số đó thì lời gọi mới chờ chính phép tính đang chạy, không gửi thêm yêu cầu tới
nguồn, nên không làm bạn vượt giới hạn tần suất của nguồn. Với tool không giữ kết quả, lỗi nói rõ điều đó và gợi ý thu
hẹp khoảng thời gian.
