Khi chia đều vượt trội so với tối ưu hóa
Phân bổ đều vượt qua tối ưu hóa tỷ trọng khi mẫu dữ liệu ngắn. Mô phỏng Python có seed cho thấy điểm giao này xuất hiện rồi khép lại khi mẫu lớn hơn.
Danh mục phân bổ đều thường vượt trội so với việc tối ưu hóa tỷ trọng vị thế khi mẫu dữ liệu quá ngắn để xác định lợi suất kỳ vọng. Mẫu dữ liệu ngắn là tình huống thường gặp, không phải ngoại lệ. Bộ tối ưu hóa chỉ thực hiện phép tính đúng trên một đầu vào mà không ai đo lường tốt. Danh mục 1/N, tức phân bổ đều, không cần ước tính gì cả. Vì vậy, danh mục này vẫn hoạt động tốt khi các ước tính không đáng tin cậy.
Phương pháp chia đều có thực sự vượt trội so với tối ưu hóa?
Trong một điều kiện cụ thể, câu trả lời là có. Hãy lần lượt xem xét từng khái niệm. Phân bổ đều, được viết là 1/N, chia vốn bằng nhau cho N vị thế và không cần dự báo dưới bất kỳ hình thức nào. Tối ưu hóa mean variance tìm các tỷ trọng có lợi nhuận kỳ vọng trên mỗi đơn vị phương sai ước tính cao nhất. Tiêu chí Kelly tìm các tỷ trọng tối đa hóa tốc độ tăng trưởng kép dài hạn. Với các tài sản không tương quan, kết quả của tiêu chí này rút gọn thành tỷ trọng tỷ lệ thuận với lợi nhuận vượt trội kỳ vọng của từng tài sản chia cho phương sai của tài sản đó. Hướng dẫn xác định quy mô vị thế theo tiêu chí Kelly của chúng tôi trình bày chi tiết công thức này.
Cả hai phương pháp tối ưu đều cần cùng một đầu vào: lợi nhuận kỳ vọng của từng tài sản. Đây là đại lượng mà dữ liệu mẫu ước tính kém nhất. Có thể ước tính biến động với độ chính xác chấp nhận được từ một khoảng thời gian ngắn. Nhưng không thể làm như vậy với giá trị trung bình. Khoảng cách giữa hai đại lượng đủ lớn để có thể nhận thấy trong mọi chuỗi lịch sử giá. Bảng dưới đây chọn sáu mã được nắm giữ rộng rãi, đo lường riêng từng năm từ 2015 đến 2024, rồi cho biết khoảng cách giữa ước tính năm cao nhất và thấp nhất. Phép đo được thực hiện hai lần cho mỗi mã: một lần đối với lợi nhuận trung bình hằng ngày quy đổi theo năm, và một lần đối với biến động quy đổi theo năm.
Câu lệnh SQL chính xác đằng sau mỗi con số
WITH prices AS
(
SELECT
ticker,
date,
toFloat64(max(close)) AS c
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'SPY', 'KO', 'JNJ')
AND date >= '2015-01-01'
AND date < '2025-01-01'
GROUP BY ticker, date
),
rets AS
(
SELECT
ticker,
date,
c / lagInFrame(c, 1) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
FROM prices
),
yearly AS
(
SELECT
ticker,
toYear(date) AS yr,
avg(ret) * 252 * 100 AS mean_pct,
stddevPop(ret) * sqrt(252) * 100 AS vol_pct
FROM rets
WHERE isFinite(ret)
GROUP BY ticker, yr
HAVING count() >= 200
)
SELECT
ticker,
round(max(mean_pct) - min(mean_pct), 1) AS mean_estimate_range_pct,
round(max(vol_pct) - min(vol_pct), 1) AS vol_estimate_range_pct
FROM yearly
GROUP BY ticker
ORDER BY mean_estimate_range_pct DESCĐối với NVDA, ước tính giá trị trung bình hằng năm dao động trong phạm vi 184.7 điểm phần trăm qua mười năm đó, so với phạm vi 28.6 điểm trong ước tính biến động của cùng mã qua cùng giai đoạn. Mã ổn định nhất trong bảng, KO, vẫn có ước tính giá trị trung bình hằng năm biến động 23.9 điểm. Bất kỳ cơ chế nào đưa lợi nhuận trung bình của năm trước cho một mô hình tối ưu hóa và coi đó là lợi nhuận kỳ vọng của năm nay đều đang cung cấp một con số có mức dao động lớn như vậy.
Cần mẫu dữ liệu dài bao lâu để ước tính lợi suất kỳ vọng?
Sai số chuẩn của lợi suất trung bình ước tính bằng độ biến động của tài sản chia cho căn bậc hai của độ dài mẫu tính theo năm. Ở đây là số năm, không phải số quan sát: lấy mẫu cùng một khoảng mười hai tháng theo giờ thay vì theo ngày không cải thiện độ chính xác. Với tài sản có độ biến động 20%, công thức này cho thấy một năm dữ liệu lịch sử tạo ra sai số chuẩn 20 điểm phần trăm mỗi năm. Bốn năm giúp giảm sai số xuống còn 10 điểm phần trăm. Để giảm sai số xuống còn một điểm phần trăm — mức độ chính xác cần có trước khi xếp hạng hai tài sản có lợi suất trung bình thực tế chênh nhau hai điểm phần trăm — cần tới bốn thế kỷ dữ liệu.
Độ biến động lại là trường hợp khác. Độ chính xác của ước tính này cải thiện theo số lượng quan sát thay vì khoảng thời gian theo lịch. Vì vậy, chỉ vài tháng dữ liệu theo ngày cũng đủ đưa ước tính vào phạm vi sai lệch vài điểm phần trăm. Bảng dưới đây chia lợi suất theo ngày trong hai mươi năm của một quỹ chỉ số thành các khối không chồng lấn có độ dài cố định, tính cả hai ước tính trong từng khối và cho biết các ước tính dao động giữa các khối bao xa.
Câu lệnh SQL chính xác đằng sau mỗi con số
WITH prices AS
(
SELECT
date,
toFloat64(max(close)) AS c
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2005-01-01'
AND date < '2025-01-01'
GROUP BY date
),
rets AS
(
SELECT
date,
c / lagInFrame(c, 1) OVER (ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
FROM prices
),
numbered AS
(
SELECT
ret,
row_number() OVER (ORDER BY date ASC) AS i
FROM rets
WHERE isFinite(ret)
),
sweep AS
(
SELECT
arrayJoin([21, 63, 126, 252, 504]) AS n,
i,
ret
FROM numbered
),
blocks AS
(
SELECT
n,
intDiv(i - 1, n) AS blk,
avg(ret) * 252 * 100 AS mean_pct,
stddevPop(ret) * sqrt(252) * 100 AS vol_pct
FROM sweep
GROUP BY n, blk
HAVING count() = n
)
SELECT
concat(toString(n), ' sessions') AS sample_length,
round(stddevPop(mean_pct), 1) AS mean_estimate_spread_pct,
round(stddevPop(vol_pct), 1) AS vol_estimate_spread_pct,
count() AS window_count
FROM blocks
GROUP BY n
ORDER BY n ASCVới các khối dài 21 sessions, ước tính lợi suất trung bình dao động trong phạm vi 53.7 điểm phần trăm, so với 10.9 điểm phần trăm của ước tính độ biến động được tính trên chính các khối đó. Kéo dài mỗi khối lên 504 sessions giúp biên độ dao động của ước tính trung bình thu hẹp còn 10.6 điểm phần trăm. Mức thu hẹp tuân theo quy luật căn bậc hai: mỗi lần giảm một nửa sai số cần lượng dữ liệu tăng gấp bốn lần.
Mô phỏng có seed mà bạn có thể tự chạy
Không điều gì trong số đó chứng minh sai số ước lượng đủ lớn để giúp 1/N giành chiến thắng. Mô phỏng này thì có. Công thức chỉ cần cài Python, không cần thêm gì khác: không tệp dữ liệu, không tải xuống và không gói bên thứ ba. Mô phỏng tự tạo lợi suất từ các tham số do bạn chọn, nên đáp án thực sự đã được biết trước và có thể đánh giá cả hai cách phân bổ dựa trên đáp án đó.
- Import hai module
import randomvàimport statistics, cùng vớifrom math import log. Đặt seed ở dòng kế tiếp bằngrandom.seed(20260816). - Xác định năm tài sản với lợi suất kỳ vọng hằng năm thực lần lượt là 5, 6, 7, 8 và 9%, mỗi tài sản có volatility hằng năm thực là 20% và không tương quan với nhau. Chuyển sang bước thời gian theo ngày bằng
mu_d = mu_a / 252vàsd_d = sd_a / (252 ** 0.5). - Chọn độ dài mẫu T từ dải kiểm thử
[60, 125, 250, 500, 1000, 2500, 5000]. - Tạo T lợi suất theo ngày cho mỗi tài sản bằng
random.gauss(mu_d, sd_d). Đây là toàn bộ lịch sử mà nhà quản lý được quan sát. - Ước tính giá trị trung bình của mỗi tài sản bằng
statistics.meanvà volatility bằngstatistics.stdev. Đây là toàn bộ thông tin mà optimizer biết. - Xây dựng danh mục tỷ trọng bằng nhau bằng cách phân bổ 0.2 cho mỗi trong năm tài sản. Danh mục này không sử dụng bất kỳ ước tính nào.
- Xây dựng danh mục tối ưu bằng cách đặt raw weight của từng tài sản bằng
mu_hat / (sd_hat ** 2), sau đó chia mọi weight cho tổng giá trị tuyệt đối của các raw weight. Cách này đưa hai danh mục về cùng mức gross exposure. - Tạo một chuỗi mới ngoài mẫu gồm 2520 lợi suất theo ngày cho mỗi tài sản từ các tham số thực. Cả hai cách phân bổ đều chưa từng quan sát chuỗi này.
- Đánh giá cả hai danh mục trên chuỗi đó bằng giá trị trung bình của
log(1 + r), trong đó r là tổng có trọng số của lợi suất năm tài sản trong ngày. - Lặp lại bước 4 đến bước 9 qua 2000 thử nghiệm độc lập tại mỗi T, rồi ghi nhận tỷ lệ thử nghiệm trong đó danh mục tỷ trọng bằng nhau có kết quả tốt hơn danh mục với các weight tối ưu.
Đọc dải kết quả từ T ngắn đến T dài. Ở đầu dải, danh mục tỷ trọng bằng nhau thắng trong phần lớn rõ rệt các thử nghiệm. Tỷ lệ này giảm đều khi T tăng, và ở cuối dải, các weight tối ưu thắng trong phần lớn thử nghiệm. Hai bên giao nhau ở đâu đó tại vùng giữa. Điểm giao thay đổi theo seed và theo spread giữa các giá trị trung bình thực. Tuy nhiên, xu hướng không thay đổi: dữ liệu nhiều hơn có lợi cho optimizer, còn dữ liệu ít hơn có lợi cho 1/N. Để tái lập, thay đổi số nguyên bên trong random.seed(20260816) rồi chạy lại dải kiểm thử.
Vì sao optimizer khuếch đại một ước tính lợi suất trung bình sai
Hãy xem các ước tính đi vào tỷ trọng như thế nào. Lợi suất trung bình ước tính nằm ở tử số, còn phương sai ước tính nằm ở mẫu số. Tăng gấp đôi ước tính lợi suất trung bình sẽ làm tỷ trọng tăng gấp đôi. Giảm một phần tư ước tính phương sai sẽ làm tỷ trọng tăng một phần ba. Trong một mẫu thuận lợi, hai sai lệch này thường cùng chiều: một chuỗi kết quả tốt làm lợi suất trung bình đo được tăng lên và thường làm phương sai đo được giảm xuống trong cùng khoảng thời gian. Optimizer đánh giá tài sản đó là vượt trội so với nhóm và phân bổ tỷ trọng tương ứng. Khi kiểm định ngoài mẫu, tài sản này lại chỉ là một thành viên bình thường trong nhóm. Phương pháp chia đều tỷ trọng không bị ảnh hưởng bởi mẫu thuận lợi đó.
Mô phỏng này mới chỉ phản ánh phiên bản nhẹ của vấn đề. Năm tài sản không tương quan tạo ra một ma trận hiệp phương sai đường chéo, không có gì phải nghịch đảo phức tạp. Danh mục thực tế có tương quan, còn ma trận hiệp phương sai mẫu được xây dựng từ số quan sát chỉ nhỉnh hơn số tài sản thường ở trạng thái gần suy biến. Việc lấy ma trận nghịch đảo sẽ khuếch đại các sai số nhỏ trong dữ liệu đầu vào thành những tỷ trọng rất lớn. Vì vậy, optimizer có thể tạo ra một vị thế trị giá gấp nhiều lần vốn trong một mã, đồng thời mở vị thế short đối ứng ở một tài sản thay thế gần tương đương. Ghi chú của chúng tôi về rủi ro tập trung trong danh mục phân tích tác động của tỷ trọng như vậy đối với mức drawdown.
Dữ liệu đầu vào cũng không cố định. Biểu đồ dưới đây theo dõi lợi suất trung bình hằng ngày trong một năm gần nhất, được annualize và lấy mẫu hằng tháng, của một quỹ chỉ số diện rộng cùng một cổ phiếu lớn thuộc ngành hàng tiêu dùng thiết yếu.
Câu lệnh SQL chính xác đằng sau mỗi con số
WITH prices AS
(
SELECT
ticker,
date,
toFloat64(max(close)) AS c
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('SPY', 'KO')
AND date >= '2015-10-01'
AND date < '2025-01-01'
GROUP BY ticker, date
),
rets AS
(
SELECT
ticker,
date,
c / lagInFrame(c, 1) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
FROM prices
),
trailing AS
(
SELECT
ticker,
date,
avg(ret) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 251 PRECEDING AND CURRENT ROW) * 252 * 100 AS trailing_mean_pct,
row_number() OVER (PARTITION BY ticker ORDER BY date ASC) AS i
FROM rets
WHERE isFinite(ret)
)
SELECT
toString(toStartOfMonth(date)) AS month,
round(avgIf(trailing_mean_pct, ticker = 'SPY'), 1) AS spy_trailing_mean_pct,
round(avgIf(trailing_mean_pct, ticker = 'KO'), 1) AS ko_trailing_mean_pct
FROM trailing
WHERE i >= 252
AND date >= '2017-01-01'
GROUP BY month
ORDER BY month ASCMỗi điểm trên hai đường này là một con số mà một optimizer nào đó có thể đã chấp nhận làm lợi suất kỳ vọng tại thời điểm tương ứng. Giá trị theo tháng đầu tiên của SPY là 17.7% và giá trị cuối cùng là 25.8%, với 96 giá trị ở giữa. KO bắt đầu cùng khoảng thời gian ở mức -0.4%. Một cơ chế phân bổ sử dụng chuỗi dữ liệu này theo từng tháng sẽ kế thừa mọi dao động của nó.
Bán Kelly một nửa và shrinkage có khắc phục được vấn đề không?
Các phương pháp này giúp giảm vấn đề, nhưng không giải quyết hoàn toàn. Trên thực tế, có bốn biện pháp điều chỉnh thường được sử dụng. Mỗi biện pháp hy sinh một phần tối ưu lý thuyết để giảm độ nhạy với sai số ước tính.
- Kelly một nửa giảm một nửa mọi tỷ trọng. Đường cong tăng trưởng Kelly khá phẳng quanh đỉnh và dốc hơn nhiều khi đi xuống dưới đỉnh. Vì vậy, sử dụng một nửa tỷ trọng chỉ làm mất một phần nhỏ tốc độ tăng trưởng lý thuyết, nhưng giảm đáng kể thiệt hại do đánh giá quá cao lợi thế. Nhắm mục tiêu biến động áp dụng cùng nguyên tắc cho mẫu số: quy mô vị thế được xác định từ biến đầu vào duy nhất mà một mẫu ngắn có thể cung cấp.
- Shrinkage kéo mọi mức lợi nhuận kỳ vọng ước tính về mức trung bình cross-sectional của các ước tính. Mức điều chỉnh tăng lên khi quy mô mẫu giảm. Nếu đẩy phương pháp này đến giới hạn, mọi tài sản sẽ có cùng mức lợi nhuận kỳ vọng. Khi độ biến động bằng nhau, optimizer sẽ tự trả về danh mục có tỷ trọng bằng nhau. Danh mục equal weight là danh mục đã được shrinkage hoàn toàn.
- Các ràng buộc, gồm không bán khống và giới hạn tỷ trọng cho mỗi vị thế, hạn chế mức độ mà một ước tính may mắn có thể đẩy tỷ trọng của một tài sản lên quá cao. Đây là biện pháp kiểm soát thiệt hại, không phải cách cải thiện ước tính.
- Loại bỏ hoàn toàn lợi nhuận kỳ vọng sẽ đưa đến danh mục minimum variance và risk parity, vốn chỉ sử dụng ma trận hiệp phương sai. Đây là đầu vào mà mẫu dữ liệu thực sự có thể cung cấp.
Không biện pháp nào trong bốn biện pháp trên tạo ra thông tin mà mẫu dữ liệu không chứa. Chúng chỉ thay đổi mức độ danh mục phụ thuộc vào những thông tin mà bạn có thể không thực sự có.
Khi tối ưu hóa phát huy hiệu quả
Điểm giao cắt xảy ra theo cả hai hướng. Khi T trở nên lớn so với chênh lệch giữa các giá trị trung bình thực, phân bổ được tối ưu hóa sẽ vượt lên và duy trì vị thế dẫn trước. Chênh lệch này càng lớn, điểm giao cắt càng xuất hiện sớm. Tối ưu hóa cũng là công cụ phù hợp khi đầu vào là yếu tố do dữ liệu cung cấp: hiệp phương sai và các tỷ lệ hedge thường được ước tính chính xác hơn nhiều so với lợi suất kỳ vọng.
Phân bổ tỷ trọng bằng nhau cũng có chi phí riêng. Cách này bỏ qua những thông tin bạn thực sự có. Trong một tập tài sản nhỏ, nó cũng có thể tạo ra mức độ tập trung không kém bất kỳ thuật toán tối ưu hóa nào. Hãy xem đây là đường cơ sở mà mọi phương pháp phân bổ khác phải vượt qua bằng dữ liệu không được dùng để xác định tỷ trọng. Việc ước tính tỷ trọng và chấm điểm chúng trên cùng một mẫu dữ liệu là thiên lệch nhìn trước trong backtesting dưới một hình thức khác, và luôn khiến kết quả của thuật toán tối ưu hóa trông tốt hơn thực tế. Để xây dựng một khoảng đáng tin cậy quanh lợi thế đã đo lường thay vì chỉ đưa ra một ước tính điểm, khoảng tin cậy bootstrap là công cụ tiêu chuẩn.
Câu hỏi thường gặp
Liệu danh mục tỷ trọng bằng nhau có thực sự vượt trội so với tối ưu hóa mean variance?
Trong các mẫu quan sát ngắn, thường là có. Một mô hình tối ưu cần ước tính lợi suất kỳ vọng của từng tài sản. Ước tính này có sai số chuẩn xấp xỉ độ biến động của tài sản chia cho căn bậc hai của độ dài mẫu tính theo năm. Khi sai số đó vẫn lớn hơn chênh lệch thực giữa các tài sản, mô hình tối ưu chỉ đang phân loại nhiễu. Danh mục tỷ trọng bằng nhau không có ước tính nào để bị sai.
Cần bao nhiêu quan sát để ước tính lợi suất kỳ vọng?
Nhiều hơn gần như mọi người nghĩ. Với một tài sản có độ biến động 20%, dữ liệu ngày trong một năm vẫn để lại sai số chuẩn gần 20 điểm phần trăm mỗi năm. Muốn giảm một nửa sai số này, cần kéo dài khoảng thời gian theo lịch lên gấp bốn lần. Bổ sung các quan sát trong ngày vào cùng một năm không giúp ích. Ngược lại, có thể ước tính độ biến động hữu ích chỉ từ dữ liệu vài tháng.
Kelly một nửa có đơn giản là một mức cược nhỏ hơn không?
Đó là một mức cược nhỏ hơn với các điều kiện thuận lợi hơn. Đường cong tăng trưởng Kelly khá phẳng quanh đỉnh. Vì vậy, giảm một nửa tỷ trọng chỉ làm mất một phần nhỏ tốc độ tăng trưởng lý thuyết, đồng thời gần như giảm một nửa độ biến động của quá trình tăng trưởng và thu hẹp chi phí do đánh giá quá cao lợi thế.
Danh mục 1/N là gì?
Đây là danh mục phân bổ một phần vốn bằng nhau vào mỗi trong số N vị thế và tái cân bằng theo một lịch định trước. Danh mục này không cần dự báo lợi suất hay ước tính ma trận hiệp phương sai. Vì vậy, nó là chuẩn tham chiếu phổ biến cho mọi phương pháp phân bổ tỷ trọng cần đến các ước tính đó.
Cách xây dựng các bảng
Cả ba bảng đều sử dụng giá đóng cửa hằng ngày và tính lợi suất đơn giản từ giá đóng cửa này sang giá đóng cửa kế tiếp. Các dòng trùng lặp được gộp thành một mức giá đóng cửa cho mỗi ticker tại mỗi ngày. Lợi suất trung bình được quy đổi theo năm bằng cách nhân lợi suất ngày trung bình với 252 phiên. Độ biến động được quy đổi theo năm bằng cách nhân độ lệch chuẩn ngày với căn bậc hai của 252. Bảng theo năm chỉ giữ lại một năm dương lịch khi có ít nhất 200 phiên. Bảng theo khối sử dụng các khối không chồng lấn và loại bỏ khối cuối cùng nếu khối đó không đủ độ dài. Cột số lượng cửa sổ cho biết mỗi độ dài tạo ra bao nhiêu khối. Không có cổ tức nào được đưa vào, nên đây là lợi suất giá và mức của mọi giá trị trung bình đều bị đánh giá thấp đối với các tài sản trả cổ tức. Mục đích của các bảng là thể hiện độ phân tán của các ước tính, không phải mức tuyệt đối của chúng.
Mỗi bảng ở đây đều có phần SQL chính xác bên dưới biểu đồ, và mô phỏng có kèm seed. Để thực hiện cùng một phép kiểm tra độ ổn định của ước tính trên danh sách mã của bạn, hãy yêu cầu bằng tiếng Anh đơn giản trên terminal Strasmore.