Bir LLM Alfa Faktörü Bulabilir mi?
Bir LLM bir saatte yüz alfa faktörü yazabilir. Gerçek fiyatların on yıllık verisinde 240 yazı-tura faktörünün puanlarını ve başarılı adayların nasıl test edileceğini inceleyin.
Bir LLM bütün gün alpha faktörleri önerebilir. Yetenekli bir modele veri sözlüğü ve bir puanlama altyapısı verildiğinde, öğle yemeğinden önce makul görünen yüz faktör ifadesi yazabilir. Asıl zor soru şudur: Aramayı gerçekleştiren sistem gürültüden kazananlar üretmek üzere tasarlanmışken, bunlardan birinin gerçekten işe yarayıp yaramadığını nasıl anlayabiliriz?
Alpha faktörü nedir?
Faktör, piyasa verilerini her tarih ve her hisse için tek bir sayıya dönüştüren kuraldır. On iki aylık fiyat değişimi bir faktördür. Borcun özkaynağa oranı da bir faktördür. Bir faktör, bir hisse evreni buna göre sıralanıp üst dilim satın alındığında, alt dilim satıldığında ve portföy belirli bir takvimle yeniden dengelendiğinde stratejiye dönüşür. Alpha, basit bir piyasa pozisyonunun zaten sağlayacağı getirinin çıkarılmasından sonra kalan getiridir.
Adaylar Sharpe oranı ile puanlanır. Bu oran, ortalama getirinin söz konusu getirinin standart sapmasına bölünmesi ve yıllıklaştırılmasıyla hesaplanır. Başka bir deyişle, dalgalanma birimi başına getiriyi ölçer. Canlı bir stratejide uzun vadeli Sharpe oranının 1 civarında olması saygın bir sonuçtur. Bir sonraki backtest 3 oranı bildirdiğinde bu husus akılda tutulmalıdır.
LLM faktör araştırması gerçekte nasıl işler?
Bu alandaki her proje aynı döngünün bir türünü çalıştırır.
- Model, puanlama altyapısının değerlendirebileceği küçük bir dilde faktör ifadeleri yazar.
- Bir backtest sistemi, her ifadeyi belirli bir fiyat ve temel veri geçmişi üzerinde puanlar.
- Belirli bir eşik değerin üzerindeki ifadeler tutulur. Diğerleri elenir.
- Tutulan ifadeler, işlenmiş örnekler olarak yeniden modelin bağlamına döner ve döngü tekrar çalışır.
Çok etmenli işlem sistemleri bu görevleri ayrı rollere böler; bir rol öneride bulunur, diğeri test eder. Altyapı gerçekten faydalıdır. Ayrıca bir yapay zekâ etmeninin ihtiyaç duyduğu piyasa verisi becerileri de kişinin ihtiyaç duyduğu becerilerin aynısıdır.
Döngünün hiçbir aşaması dürüst olmayan bir işlem değildir. Araştırma bu şekilde yürütülür. Sorun aritmetiktir ve ikinci adım birkaç kereden fazla çalıştırıldığı anda ortaya çıkar.
LLM alpha faktörü araması neden kazananlar üretir?
Tek bir fiyat geçmişi. Binlerce ucuz hipotez. Her hipotez aynı sınırlı örneklem üzerinde puanlanır ve bu örneklem önemli ölçüde tesadüf içerir. Yeterince kural test edildiğinde bazıları tesadüfe yakından uyum sağlar. Puan, uyumun hangi tür olduğunu söyleyemez. Gürültüyle eşleşen bir kural ile piyasadaki gerçek hareketle eşleşen bir kural aynı sayıyı üretir.
Aşağıdaki sıfır hipotezi 240 kez çekilmiştir. Aşağıdaki her “faktör” bir yazı tura denemesidir: hisse kodunun, ayın ve deneme numarasının özeti, 40 büyük ABD hissesini her ay iki yarıya böler. Strateji bir yarıda uzun, diğer yarıda kısa pozisyon taşır. Tasarım gereği bunun içinde hiçbir bilgi yoktur. Ocak 2016 ile Haziran 2021 arasındaki gerçek ay sonu getirileri üzerinde puanlanan 240 denemenin dağılımı şöyledir.
Her verinin arkasındaki tam SQL
WITH month_end AS (
SELECT ticker,
toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS month_start,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('AAPL','ADBE','AMZN','BA','CAT','COST','CRM','CSCO','CVX','DE',
'DUK','GE','GOOGL','HD','HON','IBM','INTC','JNJ','JPM','KO',
'LMT','MCD','MMM','MRK','MSFT','NKE','NVDA','ORCL','PEP','PFE',
'PG','QCOM','SO','T','TGT','TXN','UNP','VZ','WMT','XOM')
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2015-12-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2021-06-30')
AND toDayOfMonth(toTimeZone(window_start, 'America/New_York')) >= 22
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, month_start
),
lagged AS (
SELECT ticker,
month_start,
close_px,
lagInFrame(close_px) OVER (PARTITION BY ticker ORDER BY month_start
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_px
FROM month_end
),
monthly_return AS (
SELECT ticker, month_start, close_px / prev_px - 1 AS ret
FROM lagged
WHERE prev_px > 0
AND month_start >= toDate('2016-01-01')
),
trial AS (
SELECT arrayJoin(range(1, 241)) AS n
),
factor_month AS (
SELECT t.n AS trial_id,
m.month_start AS month_start,
avgIf(m.ret, bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 1)
- avgIf(m.ret, bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 0) AS long_short_ret
FROM monthly_return AS m
CROSS JOIN trial AS t
GROUP BY trial_id, month_start
HAVING countIf(bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 1) > 0
AND countIf(bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 0) > 0
),
scored AS (
SELECT trial_id,
avg(long_short_ret) / stddevSamp(long_short_ret) * sqrt(12) AS sharpe
FROM factor_month
GROUP BY trial_id
HAVING stddevSamp(long_short_ret) > 0
)
SELECT multiIf(sharpe < -1.2, 'below -1.2',
sharpe < -0.8, '-1.2 to -0.8',
sharpe < -0.4, '-0.8 to -0.4',
sharpe < 0.0, '-0.4 to 0.0',
sharpe < 0.4, '0.0 to 0.4',
sharpe < 0.8, '0.4 to 0.8',
sharpe < 1.2, '0.8 to 1.2',
'1.2 and above') AS sharpe_bucket,
count() AS factor_count,
round(100 * count() / 240, 1) AS share_pct
FROM scored
GROUP BY sharpe_bucket
ORDER BY min(sharpe)Dağılımın tamamı asıl noktayı gösterir. Grafikteki hiçbir unsur herhangi bir şeyi öngörmez. Buna rağmen 1 deneme üst banda (1.2 and above), aramanın 0.4% bölümüne, 1 deneme ise alt banda (below -1.2) yerleşmiştir. Şanslı tek bir deneme çalıştırıp duran bir araştırmacının elinde hem bir grafik hem de bir Sharpe oranı olurdu. Ancak bunlardan herhangi birinin keşif mi yoksa tesadüf mü olduğunu ayırt edemezdi. Buradaki getiriler ay sonu kapanışından sonraki ay sonu kapanışına kadar ölçülür. Aylık getirilerin nasıl ölçüldüğü bu hesabı açıklar.
Önemli olan, kaç deneme yaptığınızdır
Tek başına raporlanan bir backtest paydasını içermez. Aynı 240 deneme, giderek genişleyen bir arama olarak ele alındığında, her adımda şimdiye kadar denenmiş tüm kuralların ortalamasının yanında o ana kadarki en iyi puan görülür.
Her verinin arkasındaki tam SQL
WITH month_end AS (
SELECT ticker,
toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS month_start,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('AAPL','ADBE','AMZN','BA','CAT','COST','CRM','CSCO','CVX','DE',
'DUK','GE','GOOGL','HD','HON','IBM','INTC','JNJ','JPM','KO',
'LMT','MCD','MMM','MRK','MSFT','NKE','NVDA','ORCL','PEP','PFE',
'PG','QCOM','SO','T','TGT','TXN','UNP','VZ','WMT','XOM')
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2015-12-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2021-06-30')
AND toDayOfMonth(toTimeZone(window_start, 'America/New_York')) >= 22
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, month_start
),
lagged AS (
SELECT ticker,
month_start,
close_px,
lagInFrame(close_px) OVER (PARTITION BY ticker ORDER BY month_start
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_px
FROM month_end
),
monthly_return AS (
SELECT ticker, month_start, close_px / prev_px - 1 AS ret
FROM lagged
WHERE prev_px > 0
AND month_start >= toDate('2016-01-01')
),
trial AS (
SELECT arrayJoin(range(1, 241)) AS n
),
factor_month AS (
SELECT t.n AS trial_id,
m.month_start AS month_start,
avgIf(m.ret, bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 1)
- avgIf(m.ret, bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 0) AS long_short_ret
FROM monthly_return AS m
CROSS JOIN trial AS t
GROUP BY trial_id, month_start
HAVING countIf(bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 1) > 0
AND countIf(bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 0) > 0
),
scored AS (
SELECT trial_id,
avg(long_short_ret) / stddevSamp(long_short_ret) * sqrt(12) AS sharpe
FROM factor_month
GROUP BY trial_id
HAVING stddevSamp(long_short_ret) > 0
),
ladder AS (
SELECT arrayJoin([1, 2, 5, 10, 25, 50, 100, 160, 240]) AS n
)
SELECT l.n AS factors_tried,
round(max(s.sharpe), 2) AS best_sharpe,
round(avg(s.sharpe), 2) AS average_sharpe
FROM ladder AS l
CROSS JOIN scored AS s
WHERE s.trial_id <= l.n
GROUP BY factors_tried
ORDER BY factors_triedKümülatif maksimum yalnızca yükselebilir. Tuzak tam olarak budur. Test edilen ilk kuralın puanı 0.44 olmuştur. 240 denemeden sonra tablodaki en iyi puan 1.59 seviyesine çıkarken, tüm denemelerin ortalaması 0.01 seviyesinde kalmıştır. Tek bir kural bile iyileşmeden manşet sonucu iyileşmiştir. On bin ifade değerlendiren bir puanlama altyapısı, burada çizilenin çok daha sağına uzanan bu eğriyi üretir. Raporlanan sayı da eğrinin en üst noktasıdır.
Ayrılmış bir dönem kazananlara ne yapar?
Standart savunma ayrılmış örneklemdir: Bir dönemde puanlama yapılır, ardından seçilenler aramanın hiç görmediği daha sonraki bir dönemde yeniden puanlanır. Eğitim dönemindeki en iyi on iki yazı tura denemesini alın ve aynı kuralları sonraki beş yıl, yani Temmuz 2021-Haziran 2026 dönemi boyunca çalıştırın.
Her verinin arkasındaki tam SQL
WITH month_end AS (
SELECT ticker,
toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS month_start,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('AAPL','ADBE','AMZN','BA','CAT','COST','CRM','CSCO','CVX','DE',
'DUK','GE','GOOGL','HD','HON','IBM','INTC','JNJ','JPM','KO',
'LMT','MCD','MMM','MRK','MSFT','NKE','NVDA','ORCL','PEP','PFE',
'PG','QCOM','SO','T','TGT','TXN','UNP','VZ','WMT','XOM')
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2015-12-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30')
AND toDayOfMonth(toTimeZone(window_start, 'America/New_York')) >= 22
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, month_start
),
lagged AS (
SELECT ticker,
month_start,
close_px,
lagInFrame(close_px) OVER (PARTITION BY ticker ORDER BY month_start
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_px
FROM month_end
),
monthly_return AS (
SELECT ticker, month_start, close_px / prev_px - 1 AS ret
FROM lagged
WHERE prev_px > 0
AND month_start >= toDate('2016-01-01')
),
trial AS (
SELECT arrayJoin(range(1, 241)) AS n
),
factor_month AS (
SELECT t.n AS trial_id,
m.month_start AS month_start,
avgIf(m.ret, bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 1)
- avgIf(m.ret, bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 0) AS long_short_ret
FROM monthly_return AS m
CROSS JOIN trial AS t
GROUP BY trial_id, month_start
HAVING countIf(bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 1) > 0
AND countIf(bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 0) > 0
),
scored AS (
SELECT trial_id,
avgIf(long_short_ret, month_start < toDate('2021-07-01'))
/ stddevSampIf(long_short_ret, month_start < toDate('2021-07-01')) * sqrt(12) AS in_sample_sharpe,
avgIf(long_short_ret, month_start >= toDate('2021-07-01'))
/ stddevSampIf(long_short_ret, month_start >= toDate('2021-07-01')) * sqrt(12) AS out_of_sample_sharpe
FROM factor_month
GROUP BY trial_id
HAVING countIf(month_start < toDate('2021-07-01')) >= 24
AND countIf(month_start >= toDate('2021-07-01')) >= 24
)
SELECT concat('trial ', toString(trial_id)) AS factor_label,
round(in_sample_sharpe, 2) AS in_sample_sharpe,
round(out_of_sample_sharpe, 2) AS out_of_sample_sharpe
FROM scored
ORDER BY in_sample_sharpe DESC
LIMIT 12Her çubuk çifti bir kuralı temsil eder. Soldaki çubuk, kuralın rapora girmesini sağlayan puandır. Sağdaki çubuk, aynı kuralın sonraki beş yıldaki puanıdır. Sıralamada ilk olan deneme eğitim döneminde 1.59 puan almış, sonrasında -0.51 seviyesine ulaşmıştır. On ikinci deneme ise 0.74 puan almış ve ardından 0.49 seviyesine gerilemiştir.
On iki kural kendi başına küçük bir örneklemdir. Tüm 240 denemeyi eğitim puanına göre beş eşit gruba ayırıp her grubun ayrılmış örneklem puanını ortalamak daha sağlıklı bir görünüm sunar.
Her verinin arkasındaki tam SQL
WITH month_end AS (
SELECT ticker,
toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS month_start,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('AAPL','ADBE','AMZN','BA','CAT','COST','CRM','CSCO','CVX','DE',
'DUK','GE','GOOGL','HD','HON','IBM','INTC','JNJ','JPM','KO',
'LMT','MCD','MMM','MRK','MSFT','NKE','NVDA','ORCL','PEP','PFE',
'PG','QCOM','SO','T','TGT','TXN','UNP','VZ','WMT','XOM')
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2015-12-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30')
AND toDayOfMonth(toTimeZone(window_start, 'America/New_York')) >= 22
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, month_start
),
lagged AS (
SELECT ticker,
month_start,
close_px,
lagInFrame(close_px) OVER (PARTITION BY ticker ORDER BY month_start
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_px
FROM month_end
),
monthly_return AS (
SELECT ticker, month_start, close_px / prev_px - 1 AS ret
FROM lagged
WHERE prev_px > 0
AND month_start >= toDate('2016-01-01')
),
trial AS (
SELECT arrayJoin(range(1, 241)) AS n
),
factor_month AS (
SELECT t.n AS trial_id,
m.month_start AS month_start,
avgIf(m.ret, bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 1)
- avgIf(m.ret, bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 0) AS long_short_ret
FROM monthly_return AS m
CROSS JOIN trial AS t
GROUP BY trial_id, month_start
HAVING countIf(bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 1) > 0
AND countIf(bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 0) > 0
),
scored AS (
SELECT trial_id,
avgIf(long_short_ret, month_start < toDate('2021-07-01'))
/ stddevSampIf(long_short_ret, month_start < toDate('2021-07-01')) * sqrt(12) AS in_sample_sharpe,
avgIf(long_short_ret, month_start >= toDate('2021-07-01'))
/ stddevSampIf(long_short_ret, month_start >= toDate('2021-07-01')) * sqrt(12) AS out_of_sample_sharpe
FROM factor_month
GROUP BY trial_id
HAVING countIf(month_start < toDate('2021-07-01')) >= 24
AND countIf(month_start >= toDate('2021-07-01')) >= 24
),
ranked AS (
SELECT trial_id,
in_sample_sharpe,
out_of_sample_sharpe,
row_number() OVER (ORDER BY in_sample_sharpe DESC) AS in_sample_rank
FROM scored
)
SELECT multiIf(in_sample_rank <= 48, 'best fifth in training',
in_sample_rank <= 96, 'second fifth',
in_sample_rank <= 144, 'middle fifth',
in_sample_rank <= 192, 'fourth fifth',
'worst fifth in training') AS training_group,
round(avg(in_sample_sharpe), 2) AS avg_in_sample_sharpe,
round(avg(out_of_sample_sharpe), 2) AS avg_out_of_sample_sharpe
FROM ranked
GROUP BY training_group
ORDER BY min(in_sample_rank)Eğitim döneminde gruplar üstte 0.66 seviyesinden altta -0.63 seviyesine kadar uzanır. Bu geniş ve kusursuz sıralı merdiven, grupların zaten bu puana göre oluşturulması nedeniyle kaçınılmazdır. Ayrılmış örneklemde aynı iki uç grubun ortalamaları 0.01 ve 0.13 seviyesindedir. Merdiven düzleşir. Ayrılmış örneklem, optimize edilmemiş tek süreç parçasıdır. Bu nedenle dikkatli kullanılmaya değerdir.
Gerçekten işe yarayan savunmalar
Bir kez kullanılan ayrılmış örneklem. Ayrılmış örnekleme her bakış, onu eğitim verisine dönüştürür. Pencerenin sürekli ileri taşındığı ve her puanın uyumlandırmadan sonraki verilerden geldiği ileriye dönük test, tekrarlı kullanımdan sonra da geçerliliğini koruyan yöntemdir.
Çoklu test düzeltmesi. Bailey ve López de Prado tarafından 2014'te tanıtılan deflate edilmiş Sharpe oranı, gözlenen Sharpe oranını çalıştırılan deneme sayısına, örneklemin uzunluğuna, getirilerin çarpıklığına ve kuyruklarının kalınlığına göre iskonto eder. Dürüst bir deneme sayısı ile beslenen bir yöntem, on bin ifadeli bir aramadan çıkan yüksek Sharpe oranını çoğu zaman sıfıra yaklaştırır.
Elenenler de dahil olmak üzere denenen her ifadenin kaydını tutan bir denetim izi. En kritik unsur budur. Bir faktör araştırma projesinin tanımında “denetlenebilir” sözcüğünü ilginç kılan da budur. Deflate edilmiş Sharpe oranı bir deneme sayısına ihtiyaç duyar. Yalnızca kazananları kaydeden bir süreç, kendi düzeltmesinin girdisini yok etmiş olur. Elenen taslaklar, terk edilen parametre taramaları, araştırmacının yeniden başlatmaları ve puanlama kodunun önceki her sürümü bu sayıya dahil edilmelidir.
Puanın güvenilir kabul edilmesinden önce maliyet ve ileriye dönük veri yanlılığı kontrolleri. Bir faktör, temel veri alanının piyasanın erişebildiği tarih yerine veri sağlayıcının bu alanı sisteme yüklediği tarihle sıralanıyorsa backtest sonucu çok iyi, gerçek işlem sonucu ise kötü olur.
“Denetlenebilir” sözcüğü nasıl okunmalı?
Bu alanda yeni depolar neredeyse her hafta ortaya çıkar. Birkaç düzine yıldız alan proje, geçmiş performansı kanıtlanmış bir sistemden çok prototip niteliğindedir. Yıldız sayıları da koddan daha hızlı değişir. Bu nedenle bu sayfa tek bir projeyi değil, yaklaşım biçimini değerlendirir. Önünüze çıkan herhangi bir projede ilk olarak aşağıdakiler incelenmelidir.
- Her adayı ifadesi ve puanıyla birlikte zaman damgalı olarak kaydediyor mu, yoksa yalnızca tutulanları mı kaydediyor?
- Ayrılmış örneklem kullanımı puanlama altyapısı tarafından zorunlu tutuluyor mu, yoksa araştırmacının özdisiplinine mi bırakılıyor?
- Raporlanan her puanın yanında bir deneme sayısı bulunuyor mu?
- Hangi piyasa için geliştirildi? Çin A-hisseleri için ayarlanmış bir kütüphane, günlük fiyat limitlerini ve aynı seansta satın alınan hisselerin satılmasına ilişkin kısıtlamayı devralır. Bir faktörün bu kurallar altındaki davranışı ABD hisselerine doğrudan taşınamaz.
- Çalıştırıldığında sayıları yeniden üretmek mümkün mü? İncelenen tam kod sürümünü sabitlemek gerekir. Bu aşamadaki bir proje, hafta sonları arasında puanlama kodunu değiştirebilir.
Bunların hiçbiri LLM'yi faktör araştırmasında faydasız kılmaz. Hipotez üretmek gerçek bir darboğazdır ve modeller bu konuda iyidir. Değişen, yükün nereye düştüğüdür: kaç hipotezin tüketildiğinin hesabını tutma yükü araştırmacıya geçer. Canlı bir emir defteriyle karşılaşmadan önce kâğıt üzerinde işlem, backtest ile gerçekleşen işlem arasındaki farkın görünür hâle geldiği aşamadır.
LLM alpha faktörü SSS
Bir LLM alpha faktörleri bulabilir mi?
Binlerce faktör önerebilir. Ancak öneri, bulgu değildir. İddia puanlama aşamasında ortaya çıkar. Geniş bir aramadan elde edilen puan, puanın kendi başına göremediği bir seçim sorununu beraberinde getirir. İfade üzerinde yoğunlaşmadan önce ayrılmış örneklem disiplinine ve kayıt altına alınan deneme sayısına bakılmalıdır.
Deflate edilmiş Sharpe oranı nedir?
Gözlenen Sharpe oranını, gerçek bir avantaj bulunmadığı hâlde bu büyüklükte bir aramanın söz konusu sonucu üretmiş olma olasılığına dönüştüren düzeltmedir. Bailey ve López de Prado bunu 2014'te yayımlamıştır. Temel girdisi deneme sayısıdır. Denetlenmeyen bir araştırma döngüsünün sağlayamayacağı sayı da tam olarak budur.
Kaç backtest fazla sayılır?
Belirli bir eşik yoktur. Uygulanması gereken bir düzeltme vardır. 1.0 puan alan tek bir backtest ile en iyi puanı 1.0 olan on bin backtest, dünya hakkında farklı iddialardır. Yukarıdaki yazı tura denemeleri, veride hiçbir bilgi olmamasına rağmen 1.59 değerine 240 deneme boyunca ulaşmıştır.
Yayımlanan faktörler neden yayımlandıktan sonra zayıflar?
Akademik çalışmalar, yayımlanan anomalilerin ortaya çıkmalarını izleyen yıllarda nasıl zayıfladığını takip etmiştir. Kalabalıklaşma bunun için öne sürülen mekanizmalardan biridir. Kendi örneklemine aşırı uyum sağlamış özgün bir sonuç da başka bir mekanizmadır. Her ikisi de grafikte aynı biçimi oluşturur. Etkin piyasa hipotezi ilk mekanizmayı çerçevelendirir. Yukarıdaki denemeler ise ikincisini gösterir.
Buradaki her panel, gerçek ay sonu fiyatları üzerinde çalıştırılan ve altında SQL sorgusu açık olan kayıtlı bir sorgudur. Sorgulardan birini kopyalayıp deneme sayısını artırarak en iyi sayının Strasmore terminalinde yükselişini izlemek mümkündür.