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

30/12/2025

102 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

Lộ trình theo đuổi sự nghiệp trong ngành Tài chính: Không phải chọn “ngành hot”, mà là chọn con đường bạn chịu được lâu dài
13/01/2026
30 lượt đọc

Lộ trình theo đuổi sự nghiệp trong ngành Tài chính: Không phải chọn “ngành hot”, mà là chọn con đường bạn chịu được lâu dài C

Ngành tài chính luôn có một sức hút rất đặc biệt. Lương cao, môi trường chuyên nghiệp, tiếp xúc với tiền, quyền lực và những quyết định lớn. Nhưng cũng chính vì vậy mà tài chính là một trong những ngành khiến người mới vào dễ… chọn sai nhất. Không phải vì họ kém năng lực, mà vì họ chọn con đường dựa trên hình ảnh bề ngoài, thay vì hiểu rõ bản thân và bản chất từng vai trò.

Momentum Indicators: Hiểu đúng “động lượng” – thứ quyết định khi nào nên vào lệnh và khi nào nên đứng ngoài
13/01/2026
27 lượt đọc

Momentum Indicators: Hiểu đúng “động lượng” – thứ quyết định khi nào nên vào lệnh và khi nào nên đứng ngoài C

Khi nói đến momentum indicators, rất nhiều trader – đặc biệt là người mới – thường mặc định rằng đây là công cụ để đoán hướng giá. Điều này dẫn đến một loạt cách dùng sai phổ biến như “RSI quá mua thì short”, “MACD cắt xuống thì bán”. Nhưng nếu nhìn sâu hơn một chút, bạn sẽ thấy momentum indicator chưa bao giờ được thiết kế để trả lời câu hỏi giá sẽ đi lên hay đi xuống. Nhiệm vụ của nó là trả lời một câu hỏi khác quan trọng không kém: chuyển động giá hiện tại còn bao nhiêu sức để tiếp diễn.

Biến động bạn không “nhìn thấy”: vì sao volatility là thứ dễ hiểu sai nhất trên thị trường
13/01/2026
27 lượt đọc

Biến động bạn không “nhìn thấy”: vì sao volatility là thứ dễ hiểu sai nhất trên thị trường C

Trong đầu tư và trading, volatility (biến động) là một trong những khái niệm được nhắc đến nhiều nhất. Ai cũng nói về nó: “thị trường đang biến động cao”, “vol thấp quá nên khó trade”, “vol sắp nổ”… Nhưng có một sự thật rất ít người dừng lại để nghĩ cho kỹ: volatility là thứ không thể nhìn thấy trực tiếp.

Phái sinh tại Việt Nam: Không phải công cụ “đánh nhanh thắng nhanh”, mà là tấm gương phản chiếu rủi ro hệ thống
07/01/2026
171 lượt đọc

Phái sinh tại Việt Nam: Không phải công cụ “đánh nhanh thắng nhanh”, mà là tấm gương phản chiếu rủi ro hệ thống C

Khi thị trường phái sinh Việt Nam ra đời vào năm 2017 với sản phẩm đầu tiên là hợp đồng tương lai VN30, rất nhiều người nhìn nó như một “sòng bài mới”: T+0, đòn bẩy cao, kiếm tiền hai chiều, không cần vốn lớn. Cách nhìn đó không hoàn toàn sai, nhưng nếu dừng lại ở đó thì ta đã bỏ lỡ bản chất quan trọng nhất của phái sinh: đây là nơi rủi ro của toàn hệ thống được biểu hiện rõ ràng và nhanh nhất.

Edge trong trading: từ khái niệm trừu tượng đến lợi thế có thể sống sót qua chu kỳ thị trường
05/01/2026
75 lượt đọc

Edge trong trading: từ khái niệm trừu tượng đến lợi thế có thể sống sót qua chu kỳ thị trường C

Trong trading, “edge” thường được nhắc đến như một thứ gì đó rất mơ hồ: một cảm giác thị trường, một mô hình quen mắt, hay một bộ quy tắc “đã từng kiếm tiền”. Nhưng nếu tiếp cận thị trường dưới góc độ định lượng, edge không phải là cảm giác, càng không phải là niềm tin. Edge là một đặc tính thống kê của hành động giao dịch, chỉ có thể được xác nhận khi quan sát trên một tập mẫu đủ lớn và đủ đa dạng về điều kiện thị trường.

Chiến lược giao dịch Price Action: Cách đọc biểu đồ giá để hiểu thị trường
03/01/2026
108 lượt đọc

Chiến lược giao dịch Price Action: Cách đọc biểu đồ giá để hiểu thị trường C

Price Action thường bị hiểu nhầm như một tập hợp các mô hình nến hoặc vài đường kẻ hỗ trợ – kháng cự. Thực tế, nếu chỉ dừng ở đó thì Price Action không khác gì một dạng technical analysis tối giản. Bản chất sâu hơn của Price Action là một hệ quy chiếu để hiểu cách thị trường vận hành, nơi giá không còn là kết quả ngẫu nhiên của tin tức, mà là biểu hiện trực tiếp của hành vi con người, dòng tiền và cấu trúc thanh khoản.

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!