Kiểm định Market Efficiency bằng Python: Run Test của Bachelier

30/12/2025

240 lượt đọc

Khi làm trading định lượng, một câu hỏi rất căn bản nhưng thường bị bỏ qua là: thị trường mình đang nghiên cứu có thực sự cho phép tồn tại edge hay không? Trước khi xây momentum, mean reversion hay bất kỳ mô hình ML nào, việc kiểm tra mức độ “ngẫu nhiên” của chuỗi lợi suất là bước rất nên làm.

Một trong những kiểm định cổ điển, đơn giản nhưng vẫn có giá trị thực tiễn là Run Test, được đề xuất bởi Louis Bachelier – người đặt nền móng cho tài chính định lượng từ đầu thế kỷ 20.

Ý tưởng của Run Test

Một run là một chuỗi các lợi suất cùng dấu liên tiếp.

Ví dụ:

.....→ một positive run dài 5

.– – – → một negative run dài 3

Nếu thị trường hiệu quả theo nghĩa yếu, dấu của lợi suất ngày hôm nay không cung cấp thông tin cho ngày mai. Khi đó:

  1. Số run sẽ gần với kỳ vọng ngẫu nhiên
  2. Run dài bất thường sẽ rất hiếm

Ngược lại, nếu tồn tại positive serial autocorrelation, ta sẽ thấy:

  1. Ít run hơn kỳ vọng
  2. Các chuỗi tăng/giảm kéo dài → môi trường thuận lợi cho momentum

Bước 1: Import thư viện và dữ liệu

import warnings
warnings.filterwarnings('ignore')

import numpy as np
import pandas as pd
from scipy.stats import norm

Trong ví dụ này, ta dùng dữ liệu giá cổ phiếu Netflix (NFLX). Bạn có thể lấy từ Yahoo Finance hoặc bất kỳ nguồn nào khác.

df = pd.read_csv('NFLX.csv', encoding='UTF-8')

Bước 2: Tính daily returns

df['daily_return'] = df['Close'][1:].values / df['Close'][:-1] - 1
df['runs'] = "X"

Ở đây ta chỉ quan tâm dấu của lợi suất, không phải độ lớn. Điều này rất quan trọng:

Run test không đo volatility hay magnitude, mà đo cấu trúc chuỗi của dấu lợi suất.

Bước 3: Xác định các positive và negative runs

if np.sign(df['daily_return'].iloc[0]) == 1:
df['runs'].iloc[0] = "P1"
positive_run = 1
negative_run = 0
positive_returns = 1
negative_returns = 0
else:
df['runs'].iloc[0] = "N1"
positive_run = 0
negative_run = 1
positive_returns = 0
negative_returns = 1

Ta khởi tạo run đầu tiên dựa trên dấu của lợi suất ngày đầu.

Sau đó duyệt toàn bộ chuỗi thời gian:

for i in range(0, df.shape[0] - 1):

if np.sign(df['daily_return'].iloc[i+1]) == 1:
positive_returns += 1

if df['runs'].iloc[i][:1] == "P":
df['runs'].iloc[i+1] = "P" + str(positive_run)
else:
positive_run += 1
df['runs'].iloc[i+1] = "P" + str(positive_run)

else:
negative_returns += 1

if df['runs'].iloc[i][:1] == "N":
df['runs'].iloc[i+1] = "N" + str(negative_run)
else:
negative_run += 1
df['runs'].iloc[i+1] = "N" + str(negative_run)

Cuối cùng:

print("Positive returns P =", positive_returns)
print("Negative returns N =", negative_returns)
print("Runs U =", positive_run + negative_run)

Ở đây:

  1. P = số ngày lợi suất dương
  2. N = số ngày lợi suất âm
  3. U = tổng số run quan sát được

Bước 4: Thống kê kiểm định Run Test

Theo lý thuyết, nếu lợi suất là ngẫu nhiên:

Kỳ vọng số run:

x = (2 * positive_returns * negative_returns /
(positive_returns + negative_returns)) + 1

Độ lệch chuẩn:

s = np.sqrt(
(2 * positive_returns * negative_returns *
(2 * positive_returns * negative_returns -
(positive_returns + negative_returns))) /
((positive_returns + negative_returns)**2 *
((positive_returns + negative_returns) - 1))
)

Thống kê Z:


u = positive_run + negative_run
Z = (u - x - 0.5) / s
ABSZ = np.abs(Z)

Bước 5: Kiểm định giả thuyết


alpha = 0.05
score = norm.ppf(1 - alpha / 2)

if ABSZ > score:
print("Reject H0: returns are not random")
else:
print("Fail to reject H0: returns appear random")

Trong ví dụ này, kết quả là: Không thể bác bỏ giả thuyết rằng lợi suất là ngẫu nhiên

Diễn giải kết quả cho đúng (rất quan trọng)

Kết quả này không nói rằng:

  1. Không thể kiếm tiền từ Netflix
  2. Momentum hay mean reversion là vô nghĩa

Nó chỉ nói rằng:

  1. Ở tần suất ngày
  2. Xét theo dấu lợi suất
  3. Không có bằng chứng mạnh về phụ thuộc chuỗi

Market efficiency không phải đúng/sai, mà là theo mức độ, theo tần suất, theo đặc điểm thống kê.

Một thị trường có thể:

  1. Ngẫu nhiên về dấu
  2. Nhưng vẫn có volatility clustering
  3. Hoặc skew / tail risk
  4. Hoặc structure ở weekly / monthly horizon

Run Test dùng để làm gì trong thực tế?

Trong practice, run test thường dùng để:

  1. Kiểm tra giả định ban đầu trước khi build model
  2. Tránh “tự vẽ pattern” bằng mắt
  3. Lọc thị trường / timeframe không phù hợp cho momentum

Nó không phải công cụ tạo alpha, mà là công cụ tránh ảo tưởng alpha.

Kết luận

Run test của Bachelier là một ví dụ rất hay cho tư duy định lượng: trước khi hỏi “mô hình nào kiếm tiền?”, hãy hỏi “dữ liệu này có cho phép tồn tại edge không?”.

Trong nhiều trường hợp, việc biết khi nào không nên kỳ vọng cấu trúc còn quan trọng hơn việc cố gắng tìm ra cấu trúc bằng mọi giá.

Chia sẻ bài viết

Đánh giá

Hãy là người đầu tiên nhận xét bài viết này!

Đăng ký nhận tin

Nhập Email để nhận được bản tin mới nhất từ QM Capital.

Bài viết liên quan

PAMM vs Copy Trading: Nhà đầu tư Việt Nam nên hiểu gì trước khi “gửi niềm tin” cho một người giao dịch hộ?
15/02/2026
21 lượt đọc

PAMM vs Copy Trading: Nhà đầu tư Việt Nam nên hiểu gì trước khi “gửi niềm tin” cho một người giao dịch hộ? C

Với nhà đầu tư Việt Nam, PAMM và Copy Trading thường được quảng bá chung một nhóm: “đầu tư thụ động”, “không cần biết phân tích”, “chỉ cần chọn người giỏi”. Nhưng nếu nhìn kỹ, hai mô hình này khác nhau ngay ở điểm nền tảng nhất: PAMM là bạn ủy quyền cho người khác giao dịch trên một tài khoản chung, còn Copy Trading là bạn vẫn giữ tài khoản của mình và chỉ sao chép lệnh. Nghe thì giống nhau, nhưng trong thực tế nó tạo ra hai cảm giác hoàn toàn khác: PAMM giống như “gửi tiền cho người khác lái xe hộ”, còn Copy Trading giống “ngồi xe của mình nhưng bật chế độ chạy theo xe dẫn đường”. Một khi bạn hiểu sự khác nhau về quyền kiểm soát, bạn sẽ thấy phần lớn câu chuyện “an toàn hơn” hay “nguy hiểm hơn” đều xoay quanh đúng điểm này.

Cổ phiếu “penny” ở Việt Nam 2026: Cơ hội thật, bẫy thật và cách tiếp cận thực tế để không biến mình thành “thanh khoản cho người khác”
15/02/2026
12 lượt đọc

Cổ phiếu “penny” ở Việt Nam 2026: Cơ hội thật, bẫy thật và cách tiếp cận thực tế để không biến mình thành “thanh khoản cho người khác” C

Ở Việt Nam, khái niệm “penny stock” thường không được định nghĩa theo kiểu một mốc giá cứng như trong vài thị trường khác, nhưng trong thực tế nhà đầu tư vẫn hiểu khá giống nhau: đó là nhóm cổ phiếu giá thấp, thường thuộc doanh nghiệp vốn hóa nhỏ, thanh khoản có thể “lúc có lúc không”, và biến động giá thường mạnh hơn phần còn lại của thị trường. Có những mã giá thấp vì doanh nghiệp thật sự yếu, kết quả kinh doanh xấu kéo dài, bị suy giảm niềm tin nên giá bị “đè” xuống. Nhưng cũng có những mã giá thấp vì giai đoạn thị trường xấu làm định giá co lại, hoặc doanh nghiệp nhỏ nhưng đang trong quá trình tái cấu trúc, có câu chuyện hồi phục. Chính sự lẫn lộn giữa hai nhóm này tạo ra cảm giác “đi tìm vàng trong cát”, khiến penny trở thành thứ cực kỳ hấp dẫn với nhà đầu tư thích cảm giác “mua rẻ”.

Xu hướng Algorithmic Trading 2026
11/02/2026
69 lượt đọc

Xu hướng Algorithmic Trading 2026 C

Nếu nhìn lại 3–5 năm gần đây, algorithmic trading đã thay đổi rất nhiều. Trước đây, chỉ cần một chiến lược có equity curve đẹp trên backtest là đủ để nhiều người tin rằng mình đã tìm ra “công thức in tiền”. Nhưng bước sang 2026, môi trường thị trường buộc người làm algo phải trưởng thành hơn. Biến động cao hơn, dòng tiền luân chuyển nhanh hơn, và sự cạnh tranh cũng dày đặc hơn. Điều này khiến lợi thế không còn nằm ở việc bạn có một mô hình phức tạp hay không, mà nằm ở việc hệ thống của bạn có thực sự sống sót được trong điều kiện xấu hay không.

Tâm Lý Tài Chính: Hiểu Các Thiên Kiến Trong Giao Dịch và Ứng Dụng Thực Tế Tại Thị Trường Việt Nam
10/02/2026
90 lượt đọc

Tâm Lý Tài Chính: Hiểu Các Thiên Kiến Trong Giao Dịch và Ứng Dụng Thực Tế Tại Thị Trường Việt Nam C

Tâm lý tài chính (Behavioral Finance) là một lĩnh vực nghiên cứu tâm lý học và kinh tế học, giúp giải thích tại sao những nhà đầu tư, dù có kỹ năng hay kiến thức, vẫn thường xuyên đưa ra các quyết định tài chính không hợp lý. Đặc biệt, tâm lý tài chính không đồng ý với giả thuyết của lý thuyết tài chính truyền thống, cho rằng mọi quyết định trong thị trường đều được đưa ra một cách hợp lý và tối ưu. Trái lại, tâm lý tài chính nhìn nhận rằng con người thường xuyên bị chi phối bởi cảm xúc, và điều này có thể dẫn đến những sai lầm trong giao dịch.

Market Flow Trading: Nhìn dòng chảy thị trường Việt Nam để giao dịch hiệu quả hơn
09/02/2026
96 lượt đọc

Market Flow Trading: Nhìn dòng chảy thị trường Việt Nam để giao dịch hiệu quả hơn C

Market flow trading, hiểu đơn giản, không phải là cố đoán xem giá sẽ lên hay xuống, mà là quan sát dòng tiền và hành vi giao dịch đang thực sự diễn ra. Thay vì hỏi “cổ phiếu này rẻ hay đắt”, market flow đặt câu hỏi: ai đang mua, ai đang bán, và họ có đang quyết liệt hay không.

Python hay C++ trong Quantitative Finance: chọn ngôn ngữ theo bài toán
08/02/2026
219 lượt đọc

Python hay C++ trong Quantitative Finance: chọn ngôn ngữ theo bài toán C

Trong quantitative finance, câu hỏi Python hay C++ xuất hiện rất sớm, thường ngay khi người ta bắt đầu viết những dòng code đầu tiên cho trading. Điều thú vị là câu hỏi này không bao giờ có câu trả lời dứt khoát, và chính việc nó tồn tại suốt nhiều năm cho thấy một điều: hai ngôn ngữ này không thay thế nhau, mà phục vụ những mục đích rất khác nhau. Nếu chỉ nhìn ở mức bề mặt, người ta thường nói Python dễ nhưng chậm, C++ khó nhưng nhanh. Nhưng trong công việc quant thực tế, sự khác biệt quan trọng hơn nhiều nằm ở bạn đang giải quyết loại vấn đề gì, và ở giai đoạn nào của pipeline.

video-image

Truy Cập Miễn Phí Thư Viện Bot Tín Hiệu Giao Dịch Tự Động

Được nghiên cứu và phát triển bởi các chuyên gia từ QMTrade và cộng đồng nhà đầu tư chuyên nghiệp.

Truy cập ngay!