Đi tới nội dung chính
Chuyển tới nội dung chính

Tham chiếu hàm

Bảng tra mọi hàm của SDK Quant AI Studio. Trường dữ liệu của d ở Dữ liệu và Panel; khai báo chiến lược ở Chiến lược; bộ lọc, phân tích và đầu ra ở Bộ lọc và phân tích. Trong Studio, nút Tài liệu SDK ở tab Mã mở bản tóm tắt cùng nội dung.

Quy ước chung: x, y là Panel; ở phép tính Panel, y là một số hoặc một Panel (cùng hình, hoặc Panel một hàng như d.bench.close). Ô chưa đủ dữ liệu cho kết quả NaN.

Hàm toàn cục​

HàmÝ nghĩa
strategy({…})Khai báo chiến lược backtest — Chiến lược
screen({…})Khai báo bộ lọc — Bộ lọc
research(async (ctx) => …) · research({ name, params, run })Khai báo phân tích — Phân tích
universe(…)Rổ mã — bên dưới
param.*Tham số — bên dưới
ta.*, stats.*, dates.*Chỉ báo, thống kê, ngày — bên dưới
log(…giáTrị)In ra Nhật ký chạy (Panel in tóm tắt: số mã × số phiên, giá trị phiên cuối); console.log cũng vậy
byYearMonth(panelTháng, hàng = 0)Bảng năm × tháng { xLabels: ["T1"…"T12"], yLabels: [năm], values } cho chart.heatmap; Panel theo phiên thì lấy giá trị cuối tháng
monthOfYearMean(panelTháng, hàng = 0)Thống kê theo tháng trong năm: [{ month, mean, count, positive }] (positive: tỷ lệ năm dương)
PanelDựng Panel — Tự dựng Panel

Tham số: param.*​

HàmTrên thanh tham sốGiá trị p.tên
param.int(14, { min, max, step, label })Thanh trượt số nguyên (bước 1)số nguyên
param.num(1.5, { min, max, step, label })Thanh trượt số thực (bước mặc định 1 khi giá trị ≥ 10, còn lại 0,1)số
param.pct(0.07, { min, max, step, label })Thanh trượt hiện %, bước 0,5%tỷ lệ (0,07 = 7%)
param.bool(true, { label })Công tắc Bật / Tắttrue / false
param.choice("Momentum 6-1", ["Momentum 6-1", "Biến động thấp"], { label })Ô chọnphần tử được chọn (chuỗi hoặc số)
param.symbol("FPT", { label: "Mã" })Ô nhập mã (Enter hoặc rời ô để chạy; Esc huỷ)mã chữ hoa: cổ phiếu, chỉ số, ETF, chỉ số thế giới (^GSPC)
  • label là chữ hiện trên thanh tham số — đặt tiếng Việt ngắn. Thiếu min / max: thanh pct chạy 0 → max(50%, 3 lần mặc định); int, num chạy quanh giá trị mặc định.
  • Giá trị ngoài [min, max] bị kẹp lại; int làm tròn; choice không có trong danh sách về mặc định; mã sai định dạng về mặc định.
  • Khai báo gọn bằng giá trị trần cũng được: params: { len: 14, ratio: 1.5, useStop: true } (số nguyên → int, số thực → num, đúng / sai → bool).
  • Đổi tham số trên giao diện chạy lại ngay, không tạo phiên bản mới; nút Mặc định đưa về giá trị trong code. Tối ưu tham số quét trong khoảng min–max (Tối ưu và kiểm định độ vững).

Rổ mã: universe(…)​

Cách viếtGồm
universe("ALL")Cổ phiếu mã 3 ký tự trên HOSE, HNX, UPCoM (1.519 mã ngày 19/10/2026). Backtest: theo thời điểm
universe("HOSE"), "HNX", "UPCOM"Cổ phiếu từng sàn. Backtest HOSE: theo thời điểm (từ 09/2016)
universe("VN30"), "HNX30"Thành phần hiện tại của rổ chỉ số
universe("VN100"), "VNMID", "VNSML"Thành phần theo danh sách cũ của nguồn — không nên dùng (vì sao)
universe("ETF")Chứng chỉ quỹ ETF niêm yết (E1VFVN30, FUEVFVND…)
universe("INDEX")Chỉ số: VNINDEX, VN30, HNX-Index, HNX30, UPCoM-Index và các chỉ số thế giới (^GSPC, ^IXIC, ^N225…)
universe("FUTURES")Hợp đồng tương lai VN30, VN100
universe(["FPT", "HPG"]), universe("FPT,HPG")Danh sách mã tự chọn
universe({ industry: "Ngân hàng" })Theo ngành: mọi mã có tên ngành (hoặc nhóm ngành) chứa chữ đó, không phân biệt dấu; số → mã ICB bắt đầu bằng số đó. Backtest: theo thời điểm
universe({ watchlist: "Tên" })Watchlist của bạn theo tên (cần đăng nhập; không tìm thấy: Không tìm thấy watchlist "…")

Nối thêm điều kiện (tên rổ không phân biệt hoa thường):

Phương thứcÝ nghĩa
.liquid(5e9)GTGD bình quân 20 phiên từ 5 tỷ. Backtest: xét ở từng phiên; bộ lọc: ở phiên lọc; phân tích: chỉ lọc thô (GTGD hiện tại từ 20% ngưỡng). Mặc định 5 tỷ
.exchange("HOSE", "HNX")Chỉ các sàn này
.industry("Ngân hàng", "Bảo hiểm")Chỉ các ngành này (khớp như { industry })
.exclude(["ROS", "FLC"]) · .exclude({ exchange: "UPCOM" })Bỏ mã / bỏ một sàn
.include(["VNM"])Thêm mã (kể cả ngoài rổ)
.minPrice(5)Giá hiện tại từ 5 nghìn đồng
.top(100)100 mã thanh khoản nhất: GTGD 20 phiên hiện tại; rổ theo thời điểm khi backtest: GTGD bình quân trong kỳ
.where((m) => m.marketCap > 1e13)Điều kiện tự viết trên thông tin mã hiện tại (m.exchange là "HSX" với HOSE)

Rổ chung vượt giới hạn số mã của gói thì giữ các mã thanh khoản nhất; danh sách tự chọn, watchlist vượt giới hạn thì báo lỗi (Giới hạn số mã).

Chỉ báo: ta.*​

Đầu vào giá là Panel (d.close); chỉ báo cần cao, thấp, đóng cửa nhận cả đối tượng d (hoặc d.bench cho VNINDEX). RSI, ATR, ADX làm trơn kiểu Wilder như chỉ báo trên bảng giá FireAnt.

HàmTrả vềCách tính
ta.sma(x, n = 20)PanelTrung bình n phiên
ta.ema(x, n = 20)PanelTrung bình hàm mũ, α = 2 ÷ (n + 1), khởi đầu bằng SMA n giá trị đầu
ta.wma(x, n = 20)PanelTrung bình trọng số 1, 2…n (mới nhất nặng nhất)
ta.hma(x, n = 20)PanelHull: WMA(2 × WMA(n/2) − WMA(n), √n)
ta.rma(x, n = 14)PanelLàm trơn Wilder: (trước × (n − 1) + x) ÷ n
ta.rsi(x, n = 14)Panel 0–100RSI = 100 − 100 ÷ (1 + RS), RS = trung bình tăng ÷ trung bình giảm (Wilder)
ta.macd(x, 12, 26, 9){ macd, signal, hist }macd = EMA12 − EMA26; signal = EMA9 của macd; hist = macd − signal
ta.bb(x, 20, 2){ mid, upper, lower, pctB, width }mid = SMA20; dải = mid ± 2σ (độ lệch chuẩn tổng thể); %B = (x − dưới) ÷ (trên − dưới); width = (trên − dưới) ÷ mid
ta.atr(d, 14)PanelRMA của true range = max(cao − thấp, |cao − đóng cửa trước|, |thấp − đóng cửa trước|)
ta.adx(d, 14){ adx, plusDI, minusDI }±DI = 100 × RMA(±DM) ÷ ATR; ADX = RMA của 100 × |+DI − −DI| ÷ (+DI + −DI)
ta.stoch(d, 14, 3, 3){ k, d }%K = 100 × (đóng cửa − thấp nhất 14) ÷ (cao nhất 14 − thấp nhất 14), làm trơn SMA 3; %D = SMA 3 của %K
ta.cci(d, 20)Panel(TP − SMA(TP)) ÷ (0,015 × độ lệch tuyệt đối bình quân), TP = (cao + thấp + đóng cửa) ÷ 3
ta.mfi(d, 14)Panel 0–100Money Flow Index: 100 − 100 ÷ (1 + dòng tiền dương ÷ dòng tiền âm), dòng tiền = TP × KL
ta.obv(d)PanelOn-Balance Volume: cộng KL phiên tăng, trừ KL phiên giảm
ta.vwap(d, 20)PanelVWAP trượt 20 phiên: Σ(TP × KL) ÷ ΣKL
ta.donchian(d, 20){ upper, lower, mid }Cao nhất / thấp nhất 20 phiên và trung điểm
ta.keltner(d, 20, 2, 10){ upper, lower, mid }mid = EMA20 giá đóng cửa; dải = mid ± 2 × ATR10
ta.supertrend(d, 10, 3){ line, dir }Dải (cao + thấp) ÷ 2 ± 3 × ATR10; dir = 1 xu hướng tăng, −1 giảm
ta.psar(d, 0.02, 0.2)PanelParabolic SAR, bước 0,02, tối đa 0,2
ta.roc(x, 12)Panel (%)100 × (x ÷ x 12 phiên trước − 1)
ta.williamsR(d, 14)Panel −100–0−100 × (cao nhất 14 − đóng cửa) ÷ (cao nhất 14 − thấp nhất 14)
ta.ichimoku(d, 9, 26, 52){ tenkan, kijun, spanA, spanB }tenkan, kijun = trung điểm cao – thấp 9, 26 phiên; spanA = (tenkan + kijun) ÷ 2; spanB = trung điểm 52 phiên. Chưa dịch về phía trước: mây vẽ trên biểu đồ ở phiên t là spanA.shift(26), spanB.shift(26)
ta.slope(x, 20)PanelĐộ dốc hồi quy tuyến tính 20 phiên (đơn vị giá mỗi phiên)
ta.trueRange(high, low, close), ta.typicalPrice(high, low, close)PanelTrue range; giá điển hình (cao + thấp + đóng cửa) ÷ 3

ta.atr, adx, stoch, cci, mfi, williamsR, donchian cũng nhận Panel riêng: ta.atr(d.high, d.low, d.close, 14) (mfi thêm Panel KL: ta.mfi(d.high, d.low, d.close, d.volume, 14); donchian chỉ cần cao, thấp: ta.donchian(d.high, d.low, 20)).

Mẫu hình giá: ta.patterns​

ta.patterns(d, { th, only, minVol, near, recent }) nhận diện 8 mẫu hình kinh điển trên mọi mã của d, không nhìn trước: đỉnh, đáy theo ZigZag chỉ được biết khi giá đã quay đầu đủ ngưỡng; phá vỡ là phiên đầu tiên giá đóng cửa vượt mức của mẫu (mẫu giảm giá: thủng), mỗi mẫu một lần. Mẫu dài tới 250 phiên — bộ lọc nên đặt lookback: 500.

Tuỳ chọnÝ nghĩaMặc định
thNgưỡng ZigZag xác nhận đỉnh / đáy0.08
onlyCác mẫu cần quét: "cup" (cốc tay cầm), "doubleBottom" (hai đáy W), "ascTriangle" (tam giác tăng), "invHeadShoulders" (vai đầu vai ngược), "flag" (cờ tăng), "vcp" (nền co hẹp dần), "doubleTop" (hai đỉnh M), "headShoulders" (vai đầu vai)tất cả
minVolMẫu tăng giá: phá vỡ chỉ tính khi KL phiên phá vỡ ≥ minVol × TB 20 phiên trước (mẫu giảm giá không cần KL)1.5
near"Sát điểm phá vỡ": đóng cửa còn dưới mức, cách tối đa near0.05
recent"Vừa phá vỡ": phá vỡ trong recent phiên gần nhất và giá vẫn ở phía bên kia mức5
Trả vềNội dung
breakoutPanel: 1 ở phiên phá vỡ đủ khối lượng (mẫu giảm: phiên thủng), 0 còn lại — dùng làm entry của chiến lược
pattern, namesPanel mã số mẫu hình đang có ở từng phiên (NaN khi không có) và mảng tên theo mã số
stage, stagesPanel 0 không có, 1 sát điểm phá vỡ, 2 vừa phá vỡ; mảng tên trạng thái
level, distanceMức phá vỡ của mẫu đang có; đóng cửa ÷ mức − 1 (âm là còn dưới mức)
since, volRatioSố phiên từ khi phá vỡ; KL phiên phá vỡ ÷ TB20 (khi vừa phá vỡ)
eventsMọi lần phá vỡ / thủng: { symbol, row, t, day, pattern, name, bullish, level, volRatio, start } — để nghiên cứu sự kiện

Mã số trong pattern theo thứ tự cup (0), doubleBottom (1), ascTriangle (2), invHeadShoulders (3), flag (4), vcp (5), doubleTop (6), headShoulders (7) — tức names[k]. Một mã có nhiều mẫu cùng lúc thì pattern, stage lấy mẫu có trạng thái cao hơn (vừa phá vỡ trước sát điểm phá vỡ). ta.PATTERNS là bảng thông tin từng mẫu theo khoá: { name, bullish, level } (tên, mẫu tăng giá hay không, tên mức phá vỡ như "miệng cốc", "đỉnh giữa") — dùng khi tự nghiên cứu events.

MẫuHình học (đỉnh, đáy ZigZag đã xác nhận)Mức phá vỡ
cupCốc sâu 12–50%, hai miệng lệch nhau không quá 8%, dài 25–250 phiên; tay cầm điều chỉnh không quá 18%, ở nửa trên của cốc, trong 40 phiênMiệng cốc (miệng phải)
doubleBottomHai đáy lệch không quá 5%, cách nhau 15–150 phiên; đỉnh giữa cao hơn hai đáy từ 10%Đỉnh giữa
ascTriangleHai đỉnh lệch không quá 3%; đáy sau cao hơn đáy trước từ 3%; 15–150 phiênĐỉnh cao hơn trong hai đỉnh
invHeadShouldersĐầu thấp hơn hai vai từ 3%; hai vai lệch không quá 10%; 20–180 phiênĐường viền cổ nối hai đỉnh (có thể nghiêng)
flagCán cờ tăng từ 20% trong tối đa 25 phiên; điều chỉnh không quá nửa cán, trong tối đa 20 phiênĐỉnh cán cờ
vcpBa nhịp điều chỉnh nhỏ dần (nhịp đầu từ 12%, nhịp cuối không quá 12%), các đỉnh lệch không quá 10%, 25–250 phiên, giá trên giá 200 phiên trướcĐỉnh nhịp cuối
doubleTopHai đỉnh lệch không quá 5%, cách nhau 15–150 phiên; đáy giữa thấp hơn hai đỉnh từ 10%Đáy giữa (thủng xuống)
headShouldersĐầu cao hơn hai vai từ 3%; hai vai lệch không quá 10%; 20–180 phiênĐường viền cổ nối hai đáy (thủng xuống)

ta.zigzag(d, 0.08) trả đỉnh / đáy ZigZag của từng mã: mảng theo hàng, mỗi phần tử { i, price, kind, at } (kind 1 là đỉnh, −1 là đáy; i là phiên của đỉnh / đáy, at là phiên nó được xác nhận — luôn sau i). Ví dụ dùng trong chiến lược, bộ lọc: mua khi phá vỡ mẫu hình, bộ lọc có cột chữ; code đầy đủ của các mẫu nhóm Mẫu hình (Danh sách mẫu) ở tab Mã khi mở mẫu.

Phép tính Panel​

Số học — trả Panel mới; NaN lan theo phép tính.

HàmÝ nghĩa
add(y) sub(y) mul(y) div(y)Cộng, trừ, nhân, chia; chia cho 0 → NaN
pow(y)Luỹ thừa
min(y) max(y)Nhỏ hơn / lớn hơn từng phần tử (một bên NaN → NaN)
neg() abs() sign()Đổi dấu, trị tuyệt đối, dấu (−1 / 0 / 1)
log() exp() sqrt()Logarit tự nhiên (≤ 0 → NaN), mũ, căn (< 0 → NaN)
round(chữSố = 0) clip(dưới, trên)Làm tròn, kẹp trong khoảng
map(fn)Áp hàm tự viết lên từng phần tử

So sánh và logic — kết quả 1 / 0 / NaN.

HàmÝ nghĩa
gt gte lt lte eq neq>, ≥, <, ≤, =, ≠
between(dưới, trên)Trong khoảng, gồm hai đầu
and(y) or(y) not()Logic ba trạng thái: 0 and NaN = 0, 1 or NaN = 1
where(điềuKiện, khác = NaN)Giữ giá trị khi điều kiện đúng, ngược lại lấy khác (số hoặc Panel)
isNaN() notNaN()1 nếu thiếu / có dữ liệu
fillna(v)Thay NaN bằng v
ffill(giớiHạn?)Điền tiếp giá trị gần nhất trước đó, tối đa n phiên

Theo thời gian — tính riêng từng mã, chỉ dùng quá khứ.

HàmÝ nghĩa
shift(n = 1)Giá trị n phiên trước (n ≥ 0; số âm báo lỗi nhìn trước)
diff(n = 1)x − x n phiên trước
pct(n = 1)x ÷ x n phiên trước − 1
cumsum() cumprod() cummax() cummin()Luỹ kế từ giá trị đầu tiên có số
ewm(span)Trung bình hàm mũ (như ta.ema)
highest(n) lowest(n)Lớn nhất / nhỏ nhất n phiên gần nhất (gồm phiên hiện tại)
crossAbove(y)1 ở phiên cắt lên: phiên trước ≤ y, phiên này > y
crossBelow(y)1 ở phiên cắt xuống: phiên trước ≥ y, phiên này < y
barsSince()Số phiên từ lần gần nhất điều kiện đúng (0 ở chính phiên đó; chưa từng đúng → NaN)
hold(n)Giữ trạng thái đúng thêm n phiên sau mỗi lần đúng

Cửa sổ trượt — x.rolling(n).…: cần đủ n giá trị liên tiếp không NaN.

HàmÝ nghĩa
.mean() .sum()Trung bình, tổng n phiên
.std(mẫu = false) .var(mẫu = false)Độ lệch chuẩn, phương sai (mặc định chia n; true chia n − 1)
.min() .max()Nhỏ nhất, lớn nhất
.count()Số giá trị có số trong n phiên (không cần đủ n)
.rank()Vị trí của giá trị hiện tại trong n phiên, 0 (thấp nhất) → 1 (cao nhất)
.zscore()(x − trung bình n phiên) ÷ độ lệch chuẩn n phiên

Cắt ngang — so giữa các mã trong từng phiên (bỏ mã NaN).

HàmÝ nghĩa
rank()Hạng phần trăm: 0 = thấp nhất, 1 = cao nhất; bằng nhau lấy hạng trung bình
zscore() demean()Chuẩn hoá theo trung bình, độ lệch chuẩn của các mã; trừ trung bình
bucket(q)Nhóm phân vị 1…q (q = 5: ngũ phân vị, 5 = cao nhất)
topN(n) bottomN(n)1 cho n mã lớn / nhỏ nhất mỗi phiên, 0 cho mã khác
sumAcross() meanAcross() countAcross()Tổng, trung bình, số mã có số — Panel một hàng
mean()Một số: trung bình toàn bộ Panel (chỉ dùng trong phân tích)

Lấy giá trị, cắt, đổi tần suất

HàmÝ nghĩa
last(t?)Row giá trị phiên cuối (hoặc phiên thứ t) của từng mã: .get("FPT"), .values, .toObject(), .truthySymbols() (mã có giá trị đúng)
at(ngày)Row ở phiên gần nhất trước hoặc bằng ngày (số ngày, xem dates.parse)
values("FPT") · row(i) · get(i, t)Mảng giá trị một mã (bản sao) · mảng của hàng thứ i · một ô
pick(["FPT", "HPG"]) · range(từNgày, đếnNgày) · sliceCols(từ, đến)Chọn mã · cắt theo ngày · cắt theo chỉ số phiên
symbols days rows colsDanh sách mã, ngày các phiên, số hàng, số phiên
resample("week" | "month" | "quarter" | "year") + .last() .first() .sum() .mean() .max() .min()Gộp theo tuần (bắt đầu thứ Hai), tháng, quý, năm; ngày của mỗi kỳ là phiên cuối kỳ (kỳ đang dở: phiên mới nhất)

Dựng Panel: Panel.fromRows(tênHàng, ngày, mảngCácHàng), Panel.full(tênHàng, ngày, giáTrị) — ví dụ.

Thống kê: stats.*​

Nhận mảng số (hoặc Float32Array từ row(i), values(…)), bỏ qua NaN.

HàmÝ nghĩa
stats.mean(a) stats.median(a)Trung bình, trung vị
stats.std(a) stats.variance(a)Độ lệch chuẩn, phương sai mẫu (chia n − 1)
stats.quantile(a, q)Phân vị q (0–1), nội suy tuyến tính
stats.skew(a) stats.kurtosis(a)Độ lệch; độ nhọn (phân phối chuẩn = 3, không trừ 3)
stats.corr(a, b) stats.cov(a, b)Tương quan, hiệp phương sai (chỉ các cặp cùng có số)
stats.linreg(x, y)Hồi quy y = intercept + slope × x → { slope, intercept, r2 }
stats.tstat(a)Trung bình ÷ sai số chuẩn; trị tuyệt đối trên 2 ≈ có ý nghĩa thống kê
stats.sharpe(lợiNhuậnPhiên, 250)Sharpe năm hoá = trung bình ÷ độ lệch chuẩn × √250 (lãi suất phi rủi ro 0)
stats.returns(chuỗiGiá)Lợi nhuận từng phiên (dài hơn kém 1 phần tử)
stats.drawdown(chuỗiGiá)Mức giảm từ đỉnh tại từng điểm (≤ 0)
stats.maxDrawdown(chuỗiGiá)Sụt giảm tối đa (số âm). Chuỗi có ô NaN (mã niêm yết sau đầu kỳ) cho NaN — khi đó lấy giá trị nhỏ nhất của stats.drawdown(…)
stats.drawdowns(chuỗiGiá, d.days, 10)Các đợt sụt giảm sâu nhất: { peakDay, troughDay, recoveryDay, depth, toTrough, toRecover } (recoveryDay NaN nếu chưa hồi phục)
stats.forward(chuỗiGiá, h)Lợi nhuận h phiên kế tiếp tại từng điểm — chỉ để nghiên cứu sự kiện, không làm tín hiệu
stats.hist(a, 30, [dưới, trên]?){ edges, counts } của phân phối
stats.normCdf(x) stats.normInv(p)Hàm phân phối chuẩn tắc và hàm ngược

Ngày: dates.*​

Ngày trong SDK là số ngày kể từ 01/01/1970 (d.days[t], peakDay…).

HàmÝ nghĩa
dates.parse("2020-01-15")Chuỗi → số ngày; nhận "2020-01-15", "2020", "15/01/2020"
dates.format(ngày)Số ngày → "15/01/2020" (để hiển thị)
dates.iso(ngày)Số ngày → "2020-01-15"
dates.year(ngày) dates.month(ngày) dates.day(ngày)Năm; tháng 1–12; ngày 1–31
dates.weekday(ngày)0 = Chủ nhật, 1 = thứ Hai … 6 = thứ Bảy
dates.today()Hôm nay (số ngày)

Định dạng giá trị​

Dùng trong format của cột bộ lọc, metric, biểu đồ, bảng.

Định dạngHiển thị
"percent"Nhân 100, 2 chữ số thập phân: 0,0523 → 5.23%
"price"2 chữ số thập phân (giá nghìn đồng): 57.30
"compact"Rút gọn tiền: 12.50 tỷ, 45.30 tr (từ 100 trở lên bỏ số lẻ: 350 tr, 1,250 tỷ)
"integer"Số nguyên có dấu phẩy nhóm nghìn
"ratio"2 chữ số thập phân (hệ số, P/E, Sharpe)
"number"Tự chọn số chữ số thập phân theo độ lớn
"date"Số ngày → dd/mm/yyyy
"text"Giữ nguyên chữ

Số hiển thị theo quy ước của app: dấu phẩy nhóm nghìn, dấu chấm thập phân.

Tóm tắt khai báo​

Khai báoTrườngXem
strategyname description universe period benchmark warmup params · signals | rank + select | weights · rebalance filter · portfolio risk execution costs rules · reportChiến lược
screenname universe params columns filter sort limit lookback asOf includeTodayBộ lọc
researchname params run(ctx, p) — ctx: data.bars data.symbols metric chart table md log paramsPhân tích