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

30/12/2025

15 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

Đa dạng hóa ở thị trường Việt Nam: từ khái niệm “giảm rủi ro” đến bài toán tạo lợi nhuận bền vững
28/12/2025
93 lượt đọc

Đa dạng hóa ở thị trường Việt Nam: từ khái niệm “giảm rủi ro” đến bài toán tạo lợi nhuận bền vững C

Ở thị trường Việt Nam, khái niệm đa dạng hóa thường bị hiểu rất hẹp và đôi khi sai bản chất. Phần lớn nhà đầu tư cá nhân cho rằng chỉ cần nắm giữ 10–20 cổ phiếu khác nhau, thuộc nhiều ngành khác nhau, thì danh mục đã được đa dạng hóa. Trong giai đoạn thị trường đi lên, cách làm này có vẻ hợp lý vì hầu như cổ phiếu nào cũng tăng, và sự khác biệt giữa các mã không quá quan trọng. Nhưng khi thị trường bước vào pha điều chỉnh mạnh, nhà đầu tư mới nhận ra rằng danh mục “đa dạng” của mình thực chất lại phản ứng gần như giống hệt chỉ số chung. Điều này dẫn đến một kết luận phổ biến nhưng nguy hiểm: đa dạng hóa ở Việt Nam không hiệu quả.

Backtesting, Forward testing và Walk-forward testing
27/12/2025
45 lượt đọc

Backtesting, Forward testing và Walk-forward testing C

Trong algo trading, có một nghịch lý mà gần như ai cũng gặp ít nhất một lần: bạn có một ý tưởng nghe rất logic, backtest không quá đẹp nhưng đủ ổn để tin là có edge, thậm chí forward test vài tháng đầu còn kiếm được tiền. Nhưng rồi đến một lúc nào đó, chiến lược bắt đầu đi chệch khỏi kỳ vọng. Lỗ không phải kiểu “sai logic”, mà là lỗ dai, lỗ đều, khiến bạn nghi ngờ chính khả năng đánh giá hệ thống của mình. Khi nhìn lại, rất nhiều người mới nhận ra: vấn đề không nằm ở việc chiến lược có edge hay không, mà nằm ở việc mình đã tin vào kết quả test sai chỗ.

Ba kiểu Bear Market...nếu không phân loại đúng, bạn sẽ phản ứng sai
26/12/2025
54 lượt đọc

Ba kiểu Bear Market...nếu không phân loại đúng, bạn sẽ phản ứng sai C

Bear market không đáng sợ vì nó xảy ra, mà vì đa số nhà đầu tư không hiểu mình đang đối mặt với loại bear market nào. Khi không phân loại được bản chất của cú giảm, mọi phản ứng phía sau – từ bán tháo, mua bắt đáy, đến thay đổi chiến lược – đều dễ đi chệch hướng.

Stop loss là công cụ quản lý rủi ro hay cái bẫy quen thuộc trong trading?
25/12/2025
57 lượt đọc

Stop loss là công cụ quản lý rủi ro hay cái bẫy quen thuộc trong trading? C

Trong phần lớn trường hợp, stop loss không đo lường risk, mà chỉ phản ánh đường đi ngắn hạn của giá (price path). Risk, về mặt định lượng, là xác suất và mức độ của các kết cục bất lợi trong tương lai. Còn stop loss chỉ nói rằng: giá đã đi ngược lại vị thế của bạn một đoạn nào đó. Hai khái niệm này không đồng nhất, nhưng trong thực tế trading, chúng thường bị đánh đồng.

Algo trading hay Buy & Hold...thật ra là hai bài toán rất khác nhau
23/12/2025
195 lượt đọc

Algo trading hay Buy & Hold...thật ra là hai bài toán rất khác nhau C

Buy & Hold, xét cho cùng, là một chiến lược dựa trên equity risk premium: nhà đầu tư chấp nhận biến động và drawdown để đổi lấy kỳ vọng lợi nhuận vượt trội so với tài sản phi rủi ro trong dài hạn. Khi bạn Buy & Hold chỉ số hay cổ phiếu, bạn không chỉ mua tài sản, mà mua toàn bộ phân phối rủi ro của thị trường.

Algo Trading “Best Of” Không phải danh sách mẹo, mà là một lộ trình tư duy
22/12/2025
96 lượt đọc

Algo Trading “Best Of” Không phải danh sách mẹo, mà là một lộ trình tư duy C

Khi mới tìm hiểu algo trading, rất dễ bị cuốn vào công cụ, platform, indicator hay tối ưu tham số. Nhưng đọc các “Best Of Trading Lists” của Kevin Davey, điểm nổi bật nhất không phải là nên dùng cái gì, mà là nên nghĩ như thế nào. Những danh sách này thực chất ghép lại thành một lộ trình: từ cách nhìn về trading, cách xây strategy, cho tới cách sống sót khi hệ thống không hoạt động như mong đợi.

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!