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

30/12/2025

666 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

Understanding Market Sentiment: Đọc vị thị trường để đưa ra quyết định giao dịch chính xác
21/04/2026
1,077 lượt đọc

Understanding Market Sentiment: Đọc vị thị trường để đưa ra quyết định giao dịch chính xác C

Trong giao dịch, rất nhiều người dành phần lớn thời gian để học cách đọc biểu đồ, học mô hình nến, học RSI, MACD, Bollinger Bands hay Fibonacci. Những thứ đó đều hữu ích. Nhưng sau một thời gian đủ dài, gần như ai cũng sẽ gặp cùng một vấn đề: biết tín hiệu nhưng vẫn vào sai lệnh, thấy mô hình đúng mà kết quả vẫn không như kỳ vọng. Lý do nằm ở chỗ thị trường không vận hành chỉ bằng kỹ thuật. Thị trường vận hành bằng kỳ vọng, định vị dòng tiền và cảm xúc tập thể. Nói cách khác, nếu chỉ đọc chart mà không đọc được tâm lý thị trường, chúng ta mới chỉ nhìn thấy “hình dạng” của giá, chứ chưa hiểu “động cơ” khiến giá vận động.

Vì sao trader thua không phải vì thiếu kiến thức, mà vì thiếu kỷ luật?
14/04/2026
495 lượt đọc

Vì sao trader thua không phải vì thiếu kiến thức, mà vì thiếu kỷ luật? C

Jesse Livermore là một trong những cái tên kinh điển nhất trong lịch sử trading. Điều khiến ông trở thành huyền thoại không chỉ nằm ở những thương vụ lớn, mà nằm ở cách ông quan sát thị trường và đúc kết ra các nguyên tắc giao dịch vượt thời gian. Dù thị trường ngày nay đã có thuật toán, dữ liệu lớn, phái sinh, margin, HFT và rất nhiều công cụ hiện đại, những bài học của Livermore vẫn còn nguyên giá trị, bởi bản chất sâu nhất của thị trường chưa từng thay đổi: con người vẫn bị chi phối bởi tham lam, sợ hãi, hy vọng và cái tôi.

Trading không phải là đoán đúng, mà là xây dựng lợi thế
14/04/2026
528 lượt đọc

Trading không phải là đoán đúng, mà là xây dựng lợi thế C

Đọc bài review của Steve Burns về cuốn The Man Who Solved the Market: Jim Simons, QM Capital thấy đây không chỉ là câu chuyện về một cá nhân xuất chúng, mà là một cách nhìn rất khác về thị trường tài chính. Jim Simons không bước vào thị trường với tư duy “hôm nay mua mã nào” hay “ngày mai thị trường tăng hay giảm”. Ông bước vào thị trường với niềm tin rằng: trong giá cả có những mẫu hình lặp lại, và nếu có đủ dữ liệu, đủ năng lực toán học, đủ công nghệ và đủ kỷ luật, con người có thể tìm ra lợi thế từ những mẫu hình đó.

Những mô hình nhiều nến đáng chú ý trong giao dịch chứng khoán và phái sinh Việt Nam - Phần 2
14/04/2026
555 lượt đọc

Những mô hình nhiều nến đáng chú ý trong giao dịch chứng khoán và phái sinh Việt Nam - Phần 2 C

Ở Phần 1, chúng ta đã nói về cách hình thành các mô hình giá phổ biến. Sang Phần 2, trọng tâm không còn là “mô hình đó trông như thế nào”, mà là mô hình nào có thể tạo tín hiệu tăng, mô hình nào cảnh báo tín hiệu giảm, và quan trọng hơn là trader nên đọc chúng ra sao trong thực chiến.

Cách hình thành các mô hình giá phổ biến trong phân tích kỹ thuật - Phần I
14/04/2026
756 lượt đọc

Cách hình thành các mô hình giá phổ biến trong phân tích kỹ thuật - Phần I C

Trong phân tích kỹ thuật, mô hình giá không chỉ là những đường kẻ trên biểu đồ. Mỗi mô hình thực chất là một “bản ghi” về tâm lý thị trường: bên mua đang mạnh lên hay yếu đi, bên bán đang phân phối hay mất kiểm soát, dòng tiền đang tích lũy hay rút ra. Khi nhìn một mô hình, điều quan trọng không phải là cố tìm cho giống hình mẫu trong sách, mà là hiểu được câu chuyện cung – cầu đang diễn ra phía sau.

Techniques for Trading Patterns: 4 Kỹ thuật quan trọng trong giao dịch chứng khoán và phái sinh Việt Nam
14/04/2026
540 lượt đọc

Techniques for Trading Patterns: 4 Kỹ thuật quan trọng trong giao dịch chứng khoán và phái sinh Việt Nam C

Trong giao dịch tài chính, đặc biệt là ở thị trường chứng khoán Việt Nam và phái sinh VN30, phần lớn trader thường bắt đầu bằng việc tìm kiếm tín hiệu vào lệnh. Họ học các mô hình giá, đường trung bình, RSI, MACD, Bollinger Bands, volume, nến Nhật và rất nhiều chỉ báo khác. Tuy nhiên, vấn đề không nằm ở việc thiếu tín hiệu. Vấn đề lớn hơn là trader không biết tín hiệu nào đáng tin, vào lệnh ở đâu, sai thì thoát ở đâu, và khi nào nên kiên nhẫn chờ giá điều chỉnh thay vì mua đuổ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!