Phát Hiện Cổ Phiếu Bị Thao Túng: Góc Nhìn Định Lượng
Hiện tượng cổ phiếu bị lái là gì?
Hiện tượng cổ phiếu bị lái (hay còn gọi là thao túng giá cổ phiếu) là hành vi cố ý của một nhóm nhà đầu tư hoặc cá nhân nhằm làm sai lệch cung cầu thị trường đối với một loại cổ phiếu, từ đó tạo ra biến động giá theo ý muốn để trục lợi bất chính. Việc nhận biết được cổ phiếu có bị lái hay không là một điều rất uan trọng trong hành trình đầu tư của bất kì nhà đầu tư nào khi bước chân vào thị trường.
Dấu hiệu của một cổ phiếu bị lái
Trong hàng trăm cổ phiếu được niêm yết trên sàn chứng khoán Việt Nam, các nhà đầu tư sẽ rất khó để có thể kiểm tra được xem cổ phiếu đó có bị thao túng hay không chỉ bằng cảm uan của mình. Các cổ phiếu bị lái thường được cho là có các đặc điểm sau:
Biến động giá bất thường: Giá cổ phiếu tăng hoặc giảm đột ngột, không tương xứng với tình hình kinh doanh thực tế của doanh nghiệp. Điều này có thể biểu hiện qua việc giá tăng trần hoặc giảm sàn liên tục trong thời gian ngắn.
Khối lượng giao dịch tăng đột biến: Khối lượng giao dịch tăng mạnh mẽ một cách bất thường trong thời gian ngắn, không phản ánh đúng giá trị hay thông tin công khai về doanh nghiệp. Đây có thể là dấu hiệu của việc đội lái đang đẩy hoặc xả hàng.
Tính thanh khoản thấp sau khi "lái" rời đi: Sau khi đội lái đạt được mục đích và rút lui, khối lượng giao dịch có thể giảm sút đột ngột, khiến cổ phiếu trở nên khó mua bán (mất thanh khoản), gây thiệt hại cho những nhà đầu tư nhỏ lẻ bị mắc kẹt.
Định lượng hóa dấu hiệu thao túng bằng dữ liệu
Với sứ mệnh định lượng hóa các quyết định đầu tư, XNO giới thiệu một giải pháp kiểm thử để đánh giá liệu một mã chứng khoán có dấu hiệu thao túng hay không. Phương pháp này dựa trên việc phân tích dữ liệu thị trường sẵn có thông qua API của XNO(). Trong thử nghiệm này, chúng tôi tập trung vào hai chỉ số chính: khối lượng giao dịch và biến động giá, phản ánh hai trong ba dấu hiệu nhận biết đã được đề cập.
Thu thập dữ liệu
Để thực hiện nghiên cứu, chúng tôi đã tiến hành thu thập dữ liệu lịch sử cho một danh sách các mã chứng khoán bao gồm: VIX, CEO, DIG, DXG, LDG, CII, PDR, SCR, HUT, DLG, ITA, OGC, ASM, HHS, EVG, SJF, TCH, HHG, S99, STG, SCI, GEX, MHC, DXS, HDG, NLG, DXV, DRH, TDG, VGI, SGN, VNE, PVD, PVT, PVC, PVS, SSI, VND, HCM, FTS, CTS, BVS, VCI. Tập hợp các mã này được lựa chọn ngẫu nhiên nhằm đảm bảo tính khách quan và đại diện cho thí nghiệm.
tickers = ["VIX", "CEO", "DIG", "DXG", "CEO", "LDG", "CII", "PDR", "SCR", "HUT", "DLG", "ITA", "OGC", "ASM", "HHS", "EVG", "SJF", "TCH", "HHG", "S99", "STG", "SCI", "GEX", "MHC", "DXS", "HDG", "NLG", "DXV", "DRH", "TDG", "VGI", "VGI", "SGN", "VNE", "PVD", "PVT", "PVC", "PVS", "SSI", "VND", "HCM", "FTS", "CTS", "BVS", "VCI"]
stock_data = {}
for ticker in tickers:
df = stocks.get_hist(ticker)
if not df.empty:
stock_data[ticker] = df
else:
print(f"Không có dữ liệu cho {ticker}. Đang bỏ qua.")
Không có dữ liệu cho STG. Đang bỏ qua.
Không có dữ liệu cho DXV. Đang bỏ qua.
Không có dữ liệu cho SGN. Đang bỏ qua.
Phân tích biến động giá
Để phân tích yếu tố biến động giá bất thường, chúng tôi sử dụng độ biến động trượt (rolling volatility). Chỉ số này được dựa trên cửa sổ 10 phiên ('window size = 10'). Nó cho phép đo lường mức độ biến động giá của cổ phiếu theo thời gian một cách liên tục.
for ticker, df in stock_data.items():
df['Daily_Change'] = df['Close'].pct_change()
df['Rolling_Volatility'] = df['Daily_Change'].rolling(window=10).std()
stock_data['DIG'].tail()
Phân tích khối lượng giao dịch
Đối với dữ liệu khối lượng giao dịch, XNO áp dụng phương pháp sử dụng trung bình động (moving average) và độ lệch chuẩn (standard deviation) của khối lượng giao dịch. Từ đó, chúng tôi tính toán Z-score của khối lượng giao dịch tại mỗi thời điểm, giúp nhận diện các phiên có khối lượng giao dịch bất thường tại chính thời điểm đó.
for ticker, df in stock_data.items():
window_size = 10
df['Volume_MA'] = df['volume'].rolling(window=window_size).mean()
df['Volume_Std'] = df['volume'].rolling(window=window_size).std()
df['Volume_Anomaly'] = (df['volume'] - df['Volume_MA']) / df['Volume_Std']
display(stock_data['DIG'].tail())
display(stock_data['DXG'].tail())
"Điểm Thao Túng"
XNO đã phát triển một chỉ số tổng hợp được gọi là Chỉ số Thao túng (Manipulation Score). Chỉ số này được tính toán bằng tổng giá trị tuyệt đối của độ biến động giá (rolling volatility) và giá trị tuyệt đối của điểm Z-score khối lượng giao dịch tại mỗi phiên(). Mục tiêu của chỉ số proxy này là xác định những khoảng thời gian mà cổ phiếu có thể đã chịu sự thao túng().
Để đánh dấu các sự kiện đáng ngờ, chúng tôi thiết lập một threshold dựa trên phân vị (quantile) thứ 90 của toàn bộ Chỉ số Thao túng được tính trên khung dữ liệu hiện có. Bất kỳ điểm dữ liệu nào có Chỉ số Thao túng lớn hơn ngưỡng này sẽ được gắn cờ là 'có tiềm năng thao túng' (TRUE trong cột 'Potential_Manipulation'), cho thấy đây là những thời điểm cần được xem xét kỹ lưỡng."
for ticker, df in stock_data.items():
df['Manipulation_Score'] = df['Rolling_Volatility'].abs() + df['Volume_Anomaly'].abs()
# Choose a threshold, here using the 90th percentile of the calculated scores across all data points
threshold = df['Manipulation_Score'].quantile(0.90)
df['Potential_Manipulation'] = df['Manipulation_Score'] > threshold
display(stock_data['DIG'].tail())
display(stock_data['DXG'].tail())
Kết quả
Dưới đây là danh sách tổng hợp các mốc thời gian mà mô hình của chúng tôi đã xác định là có khả năng xảy ra hành vi thao túng. Các kết quả này được lọc ra từ các điểm dữ liệu mà cột 'Potential_Manipulation' có giá trị TRUE.
for ticker, df in stock_data.items():
manipulation_df = df[df['Potential_Manipulation']]
print(f"Potential Manipulation Events for {ticker}:")
if not manipulation_df.empty:
display(manipulation_df)
else:
print(f"No potential manipulation detected for {ticker}.")
Nhìn kĩ vào từng mã, ví dụ ở đây là CEO và DIG, ta cũng có thể hiểu rõ hơn về bức tranh giá và khối lượng cũng như tại các điểm thao túng mà thuật toán đơn giản này cho rằng có thể đã có thao túng xảy ra.