استراتژی قدرت نسبی ETF و تحلیل انتساب آلفا
استراتژی قدرت نسبی ETF صندوقها را بر اساس بازدهی 20 جلسه معاملاتی نسبت به SPY رتبهبندی میکند. این تحلیل بررسی میکند که چگونه لحاظ کردن ریسکهای سیستماتیک بر آلفای استراتژی اثر
استراتژی قدرت نسبی ETF، سبد کوچکی از صندوقها را بر اساس میزان انحراف بازدهی اخیر هر یک نسبت به یک شاخص معیار رتبهبندی کرده و سپس نامهای برتر را در سبد نگهداری میکند. قاعدهای که در این نوشتار بررسی میشود، ساده است: هر 20 جلسه معاملاتی، کل مجموعه را بر اساس بازدهی 20 جلسهای منهای بازدهی SPY در همان بازه رتبهبندی کنید و دو نام برتر را در قالب «اسلیوهای» (sleeves) همپوشان نگهداری کنید. انتساب بازدهی (Attribution) جایی است که چنین استراتژیهایی محک میخورند؛ در یک نمونه منتشرشده از همین طراحی، عرض از مبدأ (intercept) که بهعنوان آلفا گزارش میشد، پس از لحاظ کردن ریسکهای سیستماتیک (exposures) که استراتژی بهطور خودکار خریداری میکرد، به 0.38 درصد در سال رسید.
نحوه عملکرد قاعده قدرت نسبی ETF
قدرت نسبی یک مقایسه است، نه یک بازدهی. صندوقی که در 20 جلسه 3 درصد رشد کرده در حالی که شاخص معیار 5 درصد رشد داشته، قدرت نسبی منفی دارد. صندوقی که 1 درصد افت کرده در حالی که شاخص معیار 4 درصد افت داشته، قدرت نسبی مثبت دارد. عددی که رتبهبندی بر اساس آن انجام میشود، بازدهی مازاد (excess return) است: تغییر درصدی صندوق در یک بازه ثابت، منهای تغییر درصدی شاخص معیار در همان بازه، که جلسه به جلسه اندازهگیری میشود.
دو انتخاب در اینجا تعیینکننده است. «دوره بازنگری» (lookback) مشخص میکند که رتبهبندی چقدر از تاریخچه را میبیند؛ 20 جلسه معاملاتی تقریباً معادل یک ماه تقویمی است. «دوره نگهداری» (holding period) تعیین میکند که یک برنده چه مدت در سبد باقی بماند. وقتی این دو برابر باشند، کل پرتفوی در یک تاریخ از ماه تغییر میکند و نتیجه نهایی به این بستگی دارد که در چه تاریخی شروع کردهاید. اسلیوهای همپوشان این وابستگی را حذف میکنند: چندین نسخه از یک قاعده را با اختلاف چند جلسه اجرا کنید، هر کدام را با بخشی از سرمایه وزندهی کنید؛ در این صورت سبد ترکیبی، بهجای شرطبندی روی یک تاریخ شروع، ترکیبی چرخشی را نگهداری میکند.
پنل زیر، مرحله رتبهبندی را روی مجموعهای از 9 ETF شامل بازار گسترده، بخشهای مختلف، بینالملل و فلزات، با استفاده از 21 قیمت پایانی روزانه (برای پوشش دقیق 20 جلسه) اجرا میکند.
کد دقیق SQL پشت هر عدد
WITH bounds AS
(
SELECT
min(d) AS first_day,
max(d) AS last_day
FROM
(
SELECT date AS d
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= today() - 120
GROUP BY d
ORDER BY d DESC
LIMIT 21
)
)
SELECT
sleeve.ticker AS etf,
sleeve.ret_pct AS return_pct,
round(sleeve.ret_pct - bench.ret_pct, 2) AS excess_vs_spy_pct
FROM
(
SELECT
ticker,
round((argMax(toFloat64(close), date) / argMin(toFloat64(close), date) - 1) * 100, 2) AS ret_pct
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('QQQ', 'IWM', 'XLK', 'XLE', 'XLF', 'XLV', 'XLU', 'GLD', 'EFA')
AND date >= (SELECT first_day FROM bounds)
AND date <= (SELECT last_day FROM bounds)
GROUP BY ticker
) AS sleeve
CROSS JOIN
(
SELECT
round((argMax(toFloat64(close), date) / argMin(toFloat64(close), date) - 1) * 100, 2) AS ret_pct
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= (SELECT first_day FROM bounds)
AND date <= (SELECT last_day FROM bounds)
) AS bench
ORDER BY excess_vs_spy_pct DESCدر صدر رتبهبندی، GLD در آن 20 جلسه 8.69% بازدهی داشته که 6.34 واحد نسبت به SPY است. در انتهای لیست، XLU در سطح -5.81 واحد قرار گرفت. هر سطر کل ایده را در دو نمودار میلهای نشان میدهد: عملکرد صندوق، و آنچه پس از کسر حرکت SPY در همان بازه باقی میماند. فاصله بین این دو میله در تمام 9 سطر یکسان است، زیرا هر صندوق در برابر یک شاخص معیار و در یک بازه زمانی واحد اندازهگیری میشود.
انتساب آلفا واقعاً چه چیزی را اندازهگیری میکند
انتساب آلفا یک رگرسیون است. سری بازدهی استراتژی را در برابر یک یا چند سری بازدهی شاخص معیار قرار دهید و یک خط مستقیم از میان دادهها ترسیم کنید. شیب خط در هر شاخص معیار، نشاندهنده میزان «در معرض بودن» (exposure) است: یعنی استراتژی چقدر با آن دارایی همبستگی دارد. عرض از مبدأ، همان چیزی است که پس از کسر این ریسکها باقی میماند و به آن آلفا میگویند. R squared عدد سوم است؛ یعنی سهمی از تغییرات استراتژی که توسط شاخصهای معیار توضیح داده میشود، که از 0٪ (شاخصها هیچچیز را توضیح نمیدهند) تا 100٪ (استراتژی همان شاخصها بهعلاوه یک عدد ثابت است) متغیر است.
اگر یک قاعده چرخشی را در برابر یک شاخص بازار گسترده رگرسیون کنید، معمولاً نوآورانه به نظر میرسد. در انتساب منتشرشده برای قاعدهای با این ساختار که در اوت 2026 بهصورت متنباز ارائه شد و روی قیمتهای مصنوعی قطعی اجرا شد، برازش تکشاخصی به R squared معادل 14.0٪ رسید. ششهفتم تغییرات استراتژی توضیحدادهنشده باقی ماند که در ظاهر به معنای اصالت است. با جایگزینی شاخصهای جایگزین (proxies) برای ریسکهایی که استراتژی واقعاً در معرض آنها بود (مانند گرایش به مومنتوم و تمرکز بخشی که یک سبد دونامی دارد)، R squared به 63.6٪ افزایش یافت و عرض از مبدأ به 0.38 درصد در سال کاهش یافت. همان سری بازدهی و همان کد، اما با مجموعهای متفاوت از مقایسهها. استراتژی در واقع در حال اجاره کردن ریسکهای شناختهشده بود.
آن مطالعه قیمتهای خود را از یک منبع ثابت تولید میکند، بنابراین خوانندهای که به فروشنده داده دسترسی ندارد میتواند تمام ارقام آن را بازتولید کند. این پروژه در زمان نگارش تنها چند روز قدمت دارد و پروژهای به این جوانی هر هفته تغییر میکند. پیش از نقلقول از هر عددی، دقیقاً همان نسخه (commit) یا نسخه منتشرشده (tagged release) را مشخص کنید: ارقام انتساب با تغییر شاخصهای جایگزین یا بازه نمونه تغییر میکنند. یادداشت ما در ابزارهای بکتست قابل بازتولید همین عادت را از زاویهای دیگر بررسی میکند.
این درس بدون نیاز به واژگان مدلهای عاملی نیز پابرجاست. شاخص معیاری که در برابر آن رگرسیون میگیرید، تعیین میکند که چقدر آلفا دارید؛ بنابراین پیش از نگاه کردن به عرض از مبدأ، آن را انتخاب کنید و بنویسید چرا مقایسه درستی است. مجموعهای که پس از دیدن نتایج انتخاب شود، تنها انتخابِ مقایسه را اندازهگیری میکند.
چه مقدار از یک ETF همان شاخص معیار است
برای دیدن مشکل، نیازی به مدل عاملی کامل نیست. بازدهی روزانه یک صندوق را در برابر بازدهی روزانه SPY در همان جلسات قرار دهید و همبستگی را به توان دو برسانید. این کار سهمی از تغییرات روزانه صندوق را نشان میدهد که یک شاخص بازار گسترده از قبل آن را پوشش داده است.
کد دقیق SQL پشت هر عدد
WITH daily AS
(
SELECT
ticker,
date,
toFloat64(close) AS px,
lagInFrame(toFloat64(close)) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_px
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('SPY', 'QQQ', 'IWM', 'XLK', 'XLE', 'XLF', 'XLV', 'XLU', 'GLD', 'EFA')
AND date >= today() - 760
)
SELECT
sleeve.ticker AS etf,
round(pow(corr(sleeve.fund_ret, bench.spy_ret), 2) * 100, 1) AS r_squared_vs_spy_pct
FROM
(
SELECT ticker, date, px / prev_px - 1 AS fund_ret
FROM daily
WHERE prev_px > 0
AND ticker != 'SPY'
) AS sleeve
INNER JOIN
(
SELECT date, px / prev_px - 1 AS spy_ret
FROM daily
WHERE prev_px > 0
AND ticker = 'SPY'
) AS bench USING (date)
GROUP BY sleeve.ticker
ORDER BY r_squared_vs_spy_pct DESCدر طول دو سال گذشته، QQQ بالاترین R squared تکشاخصی را در این مجموعه با 90.3% و GLD کمترین آن را با 3.1% داشته است. اسلیوی که از سمت بالای این نمودار تشکیل شود، تقریباً بازنویسی شاخص معیار با وزنی متفاوت است و هر عرض از مبدأ که در برابر چیزی غیر از شاخص معیار اندازهگیری شود، بهآرامی این تفاوت را جذب میکند. سمت پایین نمودار جایی است که چرخش میتواند جریان بازدهیای را اضافه کند که بازار گسترده فاقد آن است، و همچنین جایی است که یک سبد دونامی دیگر شبیه به یک پرتفوی متنوع نیست.
هر چند وقت یکبار صندوق پیشرو تغییر میکند
قاعده رتبهبندی تنها زمانی چیزی برای مرتبسازی دارد که صندوقها با هم اختلاف داشته باشند. پنل زیر بازدهی ماهانه هر صندوق را در برابر بازدهی SPY در همان ماه اندازهگیری کرده و قویترین و ضعیفترین اسلیو را برای هر ماه نگه میدارد.
کد دقیق SQL پشت هر عدد
WITH monthly AS
(
SELECT
toStartOfMonth(date) AS m,
ticker,
argMin(toFloat64(close), date) AS first_close,
argMax(toFloat64(close), date) AS last_close
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('SPY', 'QQQ', 'IWM', 'XLK', 'XLE', 'XLF', 'XLV', 'XLU', 'GLD', 'EFA')
AND date >= toStartOfMonth(today() - 400)
AND date < toStartOfMonth(today())
GROUP BY m, ticker
)
SELECT
formatDateTime(x.m, '%Y-%m') AS month,
argMax(x.ticker, x.excess_pct) AS leading_etf,
round(max(x.excess_pct), 2) AS leader_excess_pct,
round(min(x.excess_pct), 2) AS laggard_excess_pct
FROM
(
SELECT
sleeve.m AS m,
sleeve.ticker AS ticker,
(sleeve.last_close / sleeve.first_close - 1) * 100
- (bench.spy_last / bench.spy_first - 1) * 100 AS excess_pct
FROM monthly AS sleeve
INNER JOIN
(
SELECT
m,
first_close AS spy_first,
last_close AS spy_last
FROM monthly
WHERE ticker = 'SPY'
) AS bench USING (m)
WHERE sleeve.ticker != 'SPY'
) AS x
GROUP BY x.m
ORDER BY x.mدر طول 13 ماه کامل، سری در 2025-07 با پیشتازی XLK آغاز میشود. در آخرین ماه کامل، 2026-07، قویترین اسلیو XLE با 12.59 واحد نسبت به SPY بود، در حالی که ضعیفترین آن -5.7 اندازهگیری شد. فاصله بین این دو خط، همان پراکندگی (dispersion) است که قاعده رتبهبندی از آن تغذیه میکند. ماههایی که خطوط به هم نزدیک میشوند، ماههایی هستند که رتبهبندی تقریباً تصادفی است و قاعدهای که بر اساس هر رتبهبندی معامله میکند، در تمام آنها هزینه چرخش (turnover) میپردازد. مرزهای ماهانه در اینجا نیازمند دقت خاصی هستند؛ نحوه اندازهگیری بازدهی ماهانه کنوانسیونهای مربوطه را توضیح میدهد.
آیا تمرکز روی دو نام، ریسک واقعی است؟
نوسانپذیری (Volatility) سادهترین پاسخ به این پرسش است. این پنل تغییرات بازدهی روزانه هر صندوق را در همان دو سال سالانه کرده و SPY را بهعنوان میله مرجع، در کنار بدترین جلسه معاملاتی هر یک نمایش میدهد.
کد دقیق SQL پشت هر عدد
WITH daily AS
(
SELECT
ticker,
date,
toFloat64(close) AS px,
lagInFrame(toFloat64(close)) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_px
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('SPY', 'QQQ', 'IWM', 'XLK', 'XLE', 'XLF', 'XLV', 'XLU', 'GLD', 'EFA')
AND date >= today() - 760
)
SELECT
ticker AS etf,
round(stddevSamp(px / prev_px - 1) * sqrt(252) * 100, 1) AS annual_vol_pct,
round(min(px / prev_px - 1) * 100, 2) AS worst_day_pct
FROM daily
WHERE prev_px > 0
GROUP BY ticker
ORDER BY annual_vol_pct DESCXLK در سمت پرنوسان با 27.7% سالانه و بدترین جلسه معاملاتی -6.82%، و XLU در سمت کمنوسان با 15.8% قرار گرفتند. قاعدهای که همزمان دو نام را نگه میدارد، از این دامنه استفاده میکند بدون اینکه میانگینگیری کند، و افتهای عمیقتری که در سمت پرنوسان رخ میدهد، در انتساب بازدهی بهعنوان ریسک سیستماتیک (exposure) ثبت میشود، نه مهارت. یادداشت آنومالی نوسانپذیری پایین سوابق بلندمدت سمت کمنوسان همین نمودار را بررسی میکند.
چهار بررسی برای بکتست چرخش (Rotation) خود
- نشت سیگنال در همان روز: اگر رتبهبندی 20 جلسهای تا پایان جلسه محاسبه شود و خرید در همان قیمت پایانی ثبت شود، تست بر اساس اطلاعاتی معامله میکند که در لحظه معامله در اختیار نداشته است. رتبهبندی را بر اساس دادههای تا جلسه t انجام دهید، خرید را در جلسه t+1 ثبت کنید و دو نسخه را مقایسه کنید: شکاف بین آنها، اندازه نشت اطلاعات است. سوگیری نگاه به آینده (Look-ahead bias) نشان میدهد که این شکاف چقدر بزرگ میشود.
- بقا در لیست صندوقها: مجموعهای که از صندوقهای موجود امروز تشکیل شده، تمام صندوقهایی را که در طول مسیر بسته یا ادغام شدهاند حذف میکند، و صندوقهای شکستخورده معمولاً در میان محصولاتی هستند که بدترین عملکرد را داشتهاند. سوگیری بقا (Survivorship bias) دقیقاً همانطور که برای لیست سهام اعمال میشود، برای لیست ETF نیز صادق است.
- انتخاب شاخص معیار از پیش: مجموعه مقایسه را پیش از اولین رگرسیون بنویسید، شامل شاخصهای جایگزین برای ریسکهایی که انتظار دارید قاعده در معرض آنها باشد. عرض از مبدأ تنها در برابر شاخص معیاری که از قبل به آن متعهد شدهاید، معنا دارد.
- اندازهگیری مستقیم تمرکز: همان رتبهبندی را با نگهداری دو نام برتر، سپس چهار نام برتر و سپس وزن برابر کل مجموعه اجرا کنید. اگر بخش عمدهای از برتری گزارششده در نسخه دونامی نهفته است، تمرکز همان موقعیت اصلی است و رتبهبندی تنها راهی برای انتخاب نوع تمرکز است.
پرسشهای متداول
قدرت نسبی ETF چیست؟
قدرت نسبی، بازدهی یک صندوق در یک دوره بازنگری ثابت منهای بازدهی یک شاخص معیار در همان بازه است. رتبهبندی بر اساس آن، صندوقهایی را که از شاخص معیار پیشی گرفتهاند در صدر قرار میدهد، فارغ از اینکه بازدهی خالص آنها مثبت بوده باشد یا خیر.
انتساب آلفا چیست؟
این یک رگرسیون از بازدهیهای یک استراتژی در برابر یک یا چند سری بازدهی شاخص معیار است. شیبها ریسکهای سیستماتیک (exposures) استراتژی را اندازهگیری میکنند و عرض از مبدأ، بازدهی باقیمانده پس از کسر این ریسکهاست. این عرض از مبدأ همان عددی است که معمولاً بهعنوان آلفا گزارش میشود.
آیا R squared بالا به معنای بد بودن استراتژی است؟
خیر. R squared بالا به این معناست که شاخصهای معیار بخش عمدهای از تغییرات استراتژی را توضیح میدهند که بیانی درباره همپوشانی است، نه کیفیت. آنچه تغییر میکند عرض از مبدأ است: ریسکهایی که رگرسیون اکنون میتواند ببیند، دیگر بهعنوان اصالت (نوآوری) شمرده نمیشوند.
چرا بهجای یک پرتفوی، از اسلیوهای همپوشان استفاده کنیم؟
یک پرتفوی واحد که هر 20 جلسه بازتنظیم میشود، نتیجه را به تاریخ شروع وابسته میکند. اجرای چندین نسخه با اختلاف زمانی از همان قاعده، این انتخاب را میانگینگیری کرده و چرخش (turnover) را در طول ماه پخش میکند، بهجای اینکه آن را در یک تاریخ خاص متمرکز کند.
هر پنل در اینجا با کد SQL تولیدکننده آن ارائه شده است. یکی را باز کنید، لیست صندوقهای خود را جایگزین کنید و رتبهبندی را در ترمینال Strasmore دوباره اجرا کنید تا تغییر ترتیبها را مشاهده کنید.