Hiểu cách tính phần bù hợp đồng, tránh hai lỗi đọc phổ biến nhất và đưa chỉ báo vào chiến lược.
Giá hợp đồng cao hơn giá giao ngay thì thị trường đang lạc quan? Tâm lý thị trường xem hợp đồng vĩnh cửu Binance cao hơn giá chỉ số bao nhiêu, nhưng nó dùng chênh lệch bằng USDT và chỉ so với 30 ngày gần nhất của chính coin đó. Hai điểm này là chỗ nhiều người đọc sai nhất.
Tâm lý thị trường (Market Sentiment, MS) là chỉ báo phần bù hợp đồng của Blave: so sánh giá đóng cửa của hợp đồng vĩnh cửu USDT-M Binance với giá chỉ số Binance, rồi đổi chênh lệch thành z-score so với 30 ngày gần nhất của coin. Giá chỉ số do Binance tính bằng cách gia quyền giá giao ngay trên nhiều sàn, không phải giá giao ngay của một sàn duy nhất. Cách tính gồm ba bước:
| Bước | Tính gì |
|---|---|
| 1. Chênh lệch | Mỗi 5 phút, giá đóng cửa hợp đồng vĩnh cửu trừ giá đóng cửa của giá chỉ số, đơn vị USDT. Lớn hơn 0 là phần bù, nhỏ hơn 0 là chiết khấu. |
| 2. Làm mượt | Lấy trung vị trượt 1 ngày của chênh lệch để lọc bỏ các cú nhảy ngắn. |
| 3. Chuẩn hóa | Dùng trung bình và độ lệch chuẩn 30 ngày gần nhất để đổi thành z-score, ra giá trị cuối cùng. |
Vì là z-score, giá trị không có giới hạn trên dưới và mọi coin đều nằm trên cùng một thang đo. Giá trị dương nghĩa là chênh lệch lớn hơn bình thường so với 30 ngày gần nhất: phe Long sẵn sàng vào lệnh ở giá cao hơn trên hợp đồng. Dữ liệu không có số lượng trader hay vị thế. Huy hiệu trạng thái trên Studio dùng các ngưỡng sau:
| Giá trị | Huy hiệu Studio | Ý nghĩa |
|---|---|---|
| ≥ +3 | Lạc quan thái quá | Chênh lệch cao hơn nhiều so với mức bình thường 30 ngày, là giá trị cực đoan |
| +2 ~ +3 | Rất lạc quan | Chênh lệch cao rõ rệt so với bình thường |
| +0.5 ~ +2 | Lạc quan | Chênh lệch cao hơn bình thường |
| −0.5 ~ +0.5 | Trung lập | Tương đương mức bình thường 30 ngày |
| ≤ −0.5 | Bi quan / Rất bi quan / Bi quan thái quá | Đối xứng với phía dương, ngưỡng −0.5, −2, −3: chênh lệch thấp hơn bình thường, hợp đồng yếu so với giá chỉ số |
Nguyên liệu của Tâm lý thị trường là khoản chênh "giá hợp đồng − giá chỉ số" tính bằng USDT, và cả quá trình tính không hề chia cho giá. Vì vậy khi tỷ lệ phần bù không đổi, giá của cùng một coin tăng càng nhiều thì chênh lệch USDT càng lớn. Giữa các coin khác nhau thì mức giá không ảnh hưởng, vì mỗi coin được chuẩn hóa theo chính nó.
Một ví dụ giả định: 30 ngày trước một coin có giá khoảng 1 USDT, hợp đồng cao hơn giá chỉ số 0.001 USDT, tức phần bù 0.1%. Sau đó giá lên 2 USDT, phần bù vẫn là 0.1% nhưng chênh lệch đã thành 0.002 USDT. Tỷ lệ phần bù không đổi, nhưng chênh lệch cao hơn trung bình 30 ngày nên Tâm lý thị trường bị đẩy lên. Nếu giá giảm mạnh trong 30 ngày thì ngược lại, giá trị bị kéo xuống.
z-score so sánh coin với trung bình 30 ngày của chính nó. Nếu hợp đồng của một coin giữ mức phần bù gần như không đổi suốt hai tháng, trung bình sẽ bị kéo lên theo và Tâm lý thị trường quay về gần 0. Lúc này 0 nghĩa là "tương đương 30 ngày gần nhất", không phải "không có phần bù".
Chiều ngược lại cũng xảy ra. Khi một coin từ phần bù lớn thu hẹp xuống phần bù nhỏ, chênh lệch thấp hơn trung bình 30 ngày và giá trị có thể thành âm, dù hợp đồng vẫn đắt hơn giá chỉ số. Cùng là +2 nhưng ở coin khác hoặc tháng khác, chênh lệch thực tế có thể khác nhau rất xa.
Hiện chưa có chiến lược chính thức nào dùng Tâm lý thị trường, nên cả ba cách dưới đây đều là minh họa, chưa backtest. Các số ±0.5 và 3 trong code mượn ngưỡng huy hiệu của Studio làm điểm xuất phát, không phải kết quả quét tham số, nên phải tự backtest trước khi dùng.
Cách viết trực tiếp nhất: vào Long khi Tâm lý thị trường vượt ngưỡng vào lệnh, và đóng về không vị thế khi xuống dưới ngưỡng thoát. Vùng đệm giữa hai ngưỡng giúp chiến lược không vào ra liên tục khi giá trị dao động quanh một mức.
ENTRY_TH = 0.5 # minh họa: ngưỡng huy hiệu Lạc quan
EXIT_TH = -0.5 # minh họa: ngưỡng huy hiệu Bi quan
def compute_signals(df, entry_th=ENTRY_TH, exit_th=EXIT_TH):
# df['MS'] = giá trị Tâm lý thị trường của coin
signal = pd.Series(np.nan, index=df.index)
signal[df['MS'] > entry_th] = 1.0 # chênh lệch cao hơn bình thường -> Long
signal[df['MS'] < exit_th] = 0.0 # chênh lệch thấp hơn bình thường -> không vị thế
return signal
Vì giá trị đã là trung vị 1 ngày, tín hiệu này đi theo thay đổi chênh lệch ở cấp ngày và không phản ứng với biến động giá trong vài phút. Nó chưa được backtest, nên ngưỡng và hướng (theo xu hướng hay ngược xu hướng) đều phải tự quét và kiểm chứng.
Giá trị chạm ±3 nghĩa là chênh lệch đã rất cực đoan so với 30 ngày gần nhất. Một cách dùng thận trọng là không coi nó là tín hiệu vào lệnh, mà thêm vào điều kiện vào lệnh của chiến lược sẵn có, tạm không mở vị thế mới khi giá trị cực đoan:
# minh họa: không vào lệnh khi |MS| >= 3 (quá lạc quan hoặc quá bi quan) too_hot = df['MS'].abs() >= 3 entry = compute_entry(df) & ~too_hot
Đây không phải tín hiệu đảo chiều và cũng chưa được backtest: Blave chưa kiểm chứng việc giá đảo chiều sau khi chạm ±3, cũng chưa kiểm chứng việc tránh các giá trị cực đoan giúp cải thiện kết quả. Ở đây chỉ dùng trạng thái "chênh lệch đã cực đoan" làm điều kiện tạm dừng mở vị thế mới. ±3 là so với 30 ngày gần nhất, nên coin có chênh lệch ổn định lâu dài chỉ cần biến động nhỏ cũng có thể chạm ±3. Thay compute_entry bằng điều kiện vào lệnh của chiến lược bạn đang có.
Tâm lý thị trường là tín hiệu chậm theo ngày, hợp làm bộ lọc nền: chỉ nhận tín hiệu Long từ chỉ báo khung ngắn (ví dụ Cường độ Taker) khi Tâm lý thị trường lớn hơn 0, và đứng ngoài khi nó về 0 hoặc thấp hơn. Dưới đây là phác thảo cấu trúc, thay compute_fast_entry bằng điều kiện của bạn:
ms = fetch_market_sentiment(SYMBOL, INTERVAL, START, END, hdrs) df['MS'] = ms['alpha'] regime_long = df['MS'] > 0 # minh họa: chỉ Long khi chênh lệch cao hơn trung bình 30 ngày fast_entry = compute_fast_entry(df) # ví dụ điều kiện Cường độ Taker khung ngắn signal = pd.Series(np.nan, index=df.index) signal[regime_long & fast_entry] = 1.0 signal[~regime_long] = 0.0
Tổ hợp này chưa được backtest và ngưỡng 0 chỉ để minh họa. Trước khi dùng thật, hãy quét tham số và xem hiệu suất sau phí.
Tâm lý thị trường chỉ có một thiết lập: chu kỳ nến (period), gồm 5min, 15min, 1h, 4h, 8h, 1d, ngắn nhất 5 phút. Nó không có tham số cửa sổ thời gian như timeframe của Săn cá voi. Chọn chu kỳ nào thì giá trị cũng đã qua trung vị 1 ngày, nên chu kỳ chỉ quyết định bao lâu đọc giá trị một lần, không loại bỏ lớp làm mượt bằng trung vị 1 ngày bên dưới.
| Chu kỳ | Phạm vi hiển thị mặc định trên Studio | Lưu ý |
|---|---|---|
5min / 15min | 5min: 3 ngày; 15min: 7 ngày | Vẽ dày nhất nhưng vẫn là thay đổi đã làm mượt theo ngày, không hợp để bắt nhịp ngắn hạn |
1h / 4h | 1h: 14 ngày; 4h: 30 ngày | Dùng khi chiến lược kiểm tra vài giờ một lần |
8h / 1d | 8h: 60 ngày; 1d: 180 ngày | Hợp để xem xu hướng tâm lý trong một khoảng thời gian dài hơn |
Hãy chọn chu kỳ theo tần suất chiến lược kiểm tra, đừng kỳ vọng chu kỳ ngắn bắt được biến động ngắn hạn. Dữ liệu bắt đầu từ 2020-01-01 (coin niêm yết sau thì từ ngày niêm yết). z-score cần 30 ngày mẫu, nên giá trị có ý nghĩa bắt đầu khoảng 2020-01-31, và 30 ngày đầu của coin mới niêm yết cũng vậy.
| Trang | Hiển thị gì |
|---|---|
| Tổng quan | Đồng hồ bán nguyệt tâm lý tổng thể (Tâm lý thị trường của mọi coin, bình quân gia quyền theo giá trị open interest tính bằng USDT) cùng hai bảng xếp hạng lạc quan và bi quan, với các cột coin, biến động 24 giờ, chỉ số và trạng thái. |
| Nhóm ngành | Xếp hạng Tâm lý thị trường theo nhóm ngành; giá trị mỗi nhóm là bình quân gia quyền theo giá trị open interest của các coin trong nhóm. |
| Lịch sử | Biểu đồ cột Tâm lý thị trường của một coin chồng lên giá, chọn chu kỳ 5min đến 1d, kèm trường stat. Người dùng không phải Pro sẽ thấy dữ liệu 7 ngày gần nhất bị hiển thị trễ. |
Đây là ý tưởng kết hợp, không phải kết luận đã kiểm chứng:
| Kết hợp | Mục đích |
|---|---|
| MS + Săn cá voi | Khi chênh lệch mở rộng, xem Săn cá voi để biết open interest có tăng bất thường cùng lúc không, giúp đánh giá phía sau phần bù có vị thế mới mở hay không. |
| MS + Cường độ Taker | Tâm lý thị trường phản ứng chậm; Cường độ Taker cho thấy lực mua bán chủ động ở khung ngắn, bù cho những biến động ngắn hạn mà nó không thấy. |
Endpoint API là GET /market_sentiment/get_alpha với symbol, period và ngày bắt đầu/kết thúc (start_date, end_date); trong Blave Agent là hàm fetch_market_sentiment. Chỉ gồm hợp đồng vĩnh cửu USDT-M của Binance, không có sàn khác. Chỉ trả về nến đã đóng, với các trường timestamp, alpha và stat, không kèm giá. Không truyền ngày bắt đầu thì lấy 365 ngày gần nhất, khoảng dài hơn 365 ngày sẽ tự bị cắt.
Đối tượng stat mô tả giá trị mới nhất, nhưng tên gọi không hoàn toàn khớp với cách tính:
| Trường | Thực tế tính gì |
|---|---|
up_prob | Mô hình hồi quy logistic huấn luyện trên dữ liệu 365 ngày gần nhất, dùng Tâm lý thị trường để dự đoán giá tăng hay giảm sau 24 giờ và trả về xác suất tăng. Dữ liệu huấn luyện bao gồm cả giai đoạn hiện tại, nên đây là ước tính trong mẫu, không phải tỷ lệ thắng ngoài mẫu. |
avg_up_return /avg_down_return | Lợi nhuận trung bình của mọi thời điểm "tăng / giảm sau 24 giờ" trong 365 ngày gần nhất, không phân theo mức Tâm lý thị trường. |
exp_value | up_prob × avg_up_return + (1 − up_prob) × avg_down_return, là số thập phân, không phải phần trăm. |
is_data_sufficient | Dữ liệu của coin có bắt đầu từ hơn 365 ngày trước hay không, không phải "mức giá trị này có đủ mẫu hay không". |
stat là ước tính trong mẫu. Mọi ngưỡng đều phải kiểm chứng bằng backtest của chính bạn.