شاخص High-Low چیست و چگونه محاسبه میشود؟
شاخص High-Low میانگین 10روزه Record High Percent است. فرمول را با اعداد گرد ببینید و بیاموزید چرا حجم نمونه کم میتواند سیگنالی قاطع اما گمراهکننده بسازد.
شاخص High-Low معیاری برای سنجش پهنای بازار است که از دو شمارش تشکیل میشود: این شاخص میانگین متحرک ساده 10روزه Record High Percent است. Record High Percent نیز از تقسیم تعداد رکوردهای جدید 52هفتهای بر مجموع رکوردهای جدید 52هفتهای و کفهای جدید 52هفتهای و سپس ضرب حاصل در 100 به دست میآید. عدد بالاتر از 50 یعنی تعداد بیشتری از سهام در حال ثبت سقفهای جدید هستند تا کفهای جدید، و عدد پایینتر از 50 معنای عکس دارد. فرمول همینقدر کوتاه است. در ادامه، محاسبات با اعداد گرد و ایراد مربوط به حجم نمونه بررسی میشود؛ ایرادی که باعث میشود عددی ظاهراً قاطع، تنها بر پایه چند سهم شکل بگیرد.
شاخص High-Low چگونه محاسبه میشود؟
دو مرحله دارد و هر دو در یک خط جا میگیرند.
- Record High Percent برای یک جلسه معاملاتی: سهام موجود در جامعه آماری خود را که در سقف جدید 52هفتهای بستهاند بشمارید. سپس سهامی را که در کف جدید 52هفتهای بستهاند بشمارید. تعداد سقفها را بر مجموع این دو عدد تقسیم و حاصل را در 100 ضرب کنید.
- شاخص High-Low: آخرین 10 مقدار روزانه Record High Percent را میانگین بگیرید.
اعداد گرد محاسبه را روشن میکنند. در یک جلسه معاملاتی، 90 سقف جدید و 30 کف جدید ثبت میشود. مجموع سقفها و کفها 120 است و تقسیم 90 بر 120 برابر با 0٫75 میشود؛ بنابراین Record High Percent آن جلسه 75 است. حالا 10 جلسه را با این اعداد در نظر بگیرید: 75، 70، 65، 60، 55، 50، 45، 40، 35 و 30. مجموع آنها 525 است و تقسیم 525 بر 10 برابر با 52٫5 میشود. شاخص High-Low در روزی که Record High Percent همان روز 75 بوده، عدد 52٫5 را نشان میدهد.
این فاصله، هزینهای است که میانگین متحرک ایجاد میکند. حافظه 10روزه، مجموعهای را که میتواند طی یک شب از 100 به صفر برسد هموار میکند، اما در عوض با تأخیر واکنش نشان میدهد. شاخص نشان میدهد پهنای بازار طی دو هفته گذشته در چه وضعیتی بوده است. این شاخص هرگز نشان نمیدهد بعدازظهر همان روز چه اتفاقی افتاده است.
چه چیزی سقف جدید 52هفتهای محسوب میشود؟
وقتی قیمت یک سهم از تمام قیمتهایی که در 52 هفته گذشته ثبت کرده است بالاتر میرود، آن سهم به سقف جدید 52هفتهای رسیده است. ارائهدهندگان داده درباره مبنای محاسبه اختلاف دارند: برخی سقفها و کفهای درونروزی را مقایسه میکنند و برخی فقط قیمتهای پایانی را. این دو روش برای یک جلسه معاملاتی، شمارشهای متفاوتی ایجاد میکنند. مبنای تمام محاسبات این صفحه قیمتهای پایانی است. سقفها و کفهای جدید 52هفتهای خود فهرست را بررسی میکند.
پنل زیر در هر جلسه معاملاتی، هر دو نقطه افراطی را برای سبد ثابتی شامل 40 سهم بزرگ آمریکا، از 1 آوریل تا 31 ژوئیه 2026، میشمارد. این اندازه سبد، تعدادها را بهقدری کوچک نگه میدارد که بتوان آنها را دستی بررسی کرد؛ همین موضوع باعث میشود ایراد فرمول در ادامه آشکار شود.
کد دقیق SQL پشت هر عدد
WITH daily_close AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
argMax(close, window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('AAPL','MSFT','NVDA','AMZN','GOOGL','AVGO','JPM','JNJ','XOM','PG',
'KO','PEP','WMT','HD','CVX','MRK','PFE','ABBV','CSCO','ORCL',
'CRM','ADBE','MCD','NKE','VZ','T','DIS','BA','CAT','GE',
'IBM','MMM','UNH','LLY','COST','TGT','SBUX','GS','MS','LIN')
AND window_start >= toDateTime('2025-03-01 00:00:00')
AND window_start < toDateTime('2026-08-01 05:00:00')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, session_date
),
extremes AS (
SELECT cur.ticker AS ticker,
cur.session_date AS session_date,
cur.close_px AS close_px,
max(hist.close_px) AS high_52w,
min(hist.close_px) AS low_52w
FROM daily_close AS cur
INNER JOIN daily_close AS hist ON cur.ticker = hist.ticker
WHERE cur.session_date >= toDate('2026-04-01')
AND hist.session_date <= cur.session_date
AND hist.session_date > cur.session_date - 364
GROUP BY cur.ticker, cur.session_date, cur.close_px
),
daily AS (
SELECT session_date,
countIf(close_px >= high_52w) AS new_highs,
countIf(close_px <= low_52w) AS new_lows,
countIf(close_px >= high_52w) + countIf(close_px <= low_52w) AS names_at_extreme
FROM extremes
GROUP BY session_date
HAVING names_at_extreme > 0
)
SELECT session_date AS date,
formatDateTimeInJodaSyntax(session_date, 'MMM d') AS session_label,
new_highs,
new_lows
FROM daily
ORDER BY session_dateدر طول 77 جلسه معاملاتی، این دو تعداد بهندرت همزمان افزایش مییابند. در Jul 29، یعنی آخرین جلسه این بازه، 3 سهم از میان 40 سهم در سقف 52هفتهای بسته شدند و 0 سهم در کف 52هفتهای بسته شدند. در Apr 1، یعنی نخستین جلسه، این نسبت شامل 1 سقف در برابر 1 کف بود. سایر سهمهای سبد در محدوده خود قرار داشتند و هرگز وارد محاسبه نشدند.
چه عددی برای شاخص High-Low مناسب است؟
خط 50 نقطه محوری است؛ جایی که سقفها و کفها در تعادل قرار دارند. نشانه متعارف قدرت، عدد 70 است. در این سطح، تعداد سقفهای جدید در میانگین 10روزه، بیش از دو برابر تعداد کفهای جدید بوده است. نشانه متعارف ضعف، عدد 30 و تصویر معکوس آن است. بین 30 و 70، شاخص نشان میدهد نقاط افراطی بازار ترکیبی از قدرت و ضعف هستند؛ وضعیتی که بیشتر اوقات در آن قرار دارد.
پنل زیر Record High Percent روزانه را در برابر میانگین متحرک 10روزه همان شاخص و برای همان سبد ترسیم میکند. تأخیر شاخص در نمودار دیده میشود و نیازی به شرح جداگانه ندارد.
کد دقیق SQL پشت هر عدد
WITH daily_close AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
argMax(close, window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('AAPL','MSFT','NVDA','AMZN','GOOGL','AVGO','JPM','JNJ','XOM','PG',
'KO','PEP','WMT','HD','CVX','MRK','PFE','ABBV','CSCO','ORCL',
'CRM','ADBE','MCD','NKE','VZ','T','DIS','BA','CAT','GE',
'IBM','MMM','UNH','LLY','COST','TGT','SBUX','GS','MS','LIN')
AND window_start >= toDateTime('2025-03-01 00:00:00')
AND window_start < toDateTime('2026-08-01 05:00:00')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, session_date
),
extremes AS (
SELECT cur.ticker AS ticker,
cur.session_date AS session_date,
cur.close_px AS close_px,
max(hist.close_px) AS high_52w,
min(hist.close_px) AS low_52w
FROM daily_close AS cur
INNER JOIN daily_close AS hist ON cur.ticker = hist.ticker
WHERE cur.session_date >= toDate('2026-04-01')
AND hist.session_date <= cur.session_date
AND hist.session_date > cur.session_date - 364
GROUP BY cur.ticker, cur.session_date, cur.close_px
),
daily AS (
SELECT session_date,
countIf(close_px >= high_52w) AS new_highs,
countIf(close_px >= high_52w) + countIf(close_px <= low_52w) AS names_at_extreme
FROM extremes
GROUP BY session_date
HAVING names_at_extreme > 0
),
rhp AS (
SELECT session_date,
round(100 * new_highs / names_at_extreme, 1) AS record_high_pct
FROM daily
),
smoothed AS (
SELECT session_date,
record_high_pct,
round(avg(record_high_pct) OVER (ORDER BY session_date
ROWS BETWEEN 9 PRECEDING AND CURRENT ROW), 1) AS high_low_index_pct,
count() OVER (ORDER BY session_date
ROWS BETWEEN 9 PRECEDING AND CURRENT ROW) AS sessions_in_window
FROM rhp
)
SELECT session_date AS date,
formatDateTimeInJodaSyntax(session_date, 'MMM d') AS session_label,
record_high_pct,
high_low_index_pct
FROM smoothed
WHERE sessions_in_window = 10
ORDER BY session_dateبازه ترسیمشده با Record High Percent معادل 100 در Apr 15 آغاز میشود و شاخص در آن زمان 52.5 است. این بازه در 100 با مقدار Jul 29 پایان مییابد و شاخص به 64 میرسد. هر مقدار را در برابر نشانگرهای 70 و 30 بخوانید. فاصله میان دو خط، هزینه هموارسازی را نشان میدهد: در هر روز مشخص، میانگین همچنان 9 جلسه قدیمیتر را در خود دارد. 9 جلسه نخست این بازه در پنل نمایش داده نشدهاند، زیرا محاسبه میانگین 10روزه به 10 روز داده نیاز دارد.
مخرج کسر، بیشتر بازار را نادیده میگیرد
این نکتهای است که باید به خاطر سپرد. مخرج Record High Percent از سقفهای جدید بهاضافه کفهای جدید تشکیل میشود و هیچ چیز دیگری در آن نیست. سهمی که در میانه دامنه 52هفتهای خود قرار دارد، نه در صورت کسر است و نه در مخرج آن. شاخص نمیتواند میان جلسهای که در آن 900 سهم از 3000 سهم به نقطه افراطی رسیدهاند و جلسهای که فقط 9 سهم چنین وضعیتی داشتهاند تفاوت بگذارد؛ هر دو را با همان عدد دورقمی و ظاهراً قاطع نشان میدهد.
یک بورس 6000سهمی را در یک جلسه کمرمق ماه اوت در نظر بگیرید: 40 سهم سقف جدید و 20 سهم کف جدید ثبت میکنند. Record High Percent برابر است با 40 تقسیم بر 60، یعنی 66٫7؛ عددی که مانند نشانهای از رشد فراگیر بازار به نظر میرسد. اما این عدد بر اساس فقط 1٪ از نمادهای بازار محاسبه شده است. 5940 سهم دیگر هیچ نقشی در آن نداشتند.
سبد 40سهمی، نمونهای قابل شمارش از این مسئله را روی صفحه نشان میدهد. هر جلسه در این بازه، بر اساس تعداد سهمهایی که هر نوع نقطه افراطی را ثبت کردهاند، در یک دسته قرار گرفته است.
کد دقیق SQL پشت هر عدد
WITH daily_close AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
argMax(close, window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('AAPL','MSFT','NVDA','AMZN','GOOGL','AVGO','JPM','JNJ','XOM','PG',
'KO','PEP','WMT','HD','CVX','MRK','PFE','ABBV','CSCO','ORCL',
'CRM','ADBE','MCD','NKE','VZ','T','DIS','BA','CAT','GE',
'IBM','MMM','UNH','LLY','COST','TGT','SBUX','GS','MS','LIN')
AND window_start >= toDateTime('2025-03-01 00:00:00')
AND window_start < toDateTime('2026-08-01 05:00:00')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, session_date
),
extremes AS (
SELECT cur.ticker AS ticker,
cur.session_date AS session_date,
cur.close_px AS close_px,
max(hist.close_px) AS high_52w,
min(hist.close_px) AS low_52w
FROM daily_close AS cur
INNER JOIN daily_close AS hist ON cur.ticker = hist.ticker
WHERE cur.session_date >= toDate('2026-04-01')
AND hist.session_date <= cur.session_date
AND hist.session_date > cur.session_date - 364
GROUP BY cur.ticker, cur.session_date, cur.close_px
),
daily AS (
SELECT session_date,
countIf(close_px >= high_52w) AS new_highs,
countIf(close_px >= high_52w) + countIf(close_px <= low_52w) AS names_at_extreme
FROM extremes
GROUP BY session_date
HAVING names_at_extreme > 0
)
SELECT multiIf(names_at_extreme <= 3, '1 to 3 names',
names_at_extreme <= 9, '4 to 9 names',
'10 or more names') AS sample_size_bucket,
count() AS readings,
round(avg(names_at_extreme), 1) AS avg_names_in_denominator,
round(quantileDeterministic(0.5)(100 * new_highs / names_at_extreme,
cityHash64(session_date)), 1) AS median_record_high_pct,
round(quantileDeterministic(0.5)(abs(100 * new_highs / names_at_extreme - 50),
cityHash64(session_date)), 1) AS median_distance_from_50
FROM daily
GROUP BY sample_size_bucket
ORDER BY avg_names_in_denominatorدر 39 جلسهای که در دسته 1 to 3 names قرار گرفتند، کل شاخص بر میانگین 2 سهم از میان 40 سهم استوار بود. میانه Record High Percent در این جلسات 100 بود و این جلسات در میانه، 50 واحد با خط 50 فاصله داشتند. در دسته 10 or more names، که 1 جلسه آن با میانگین 10 سهم همراه بود، میانه شاخص 70 و فاصله آن از نقطه میانی 20 واحد بود.
محاسبات، دامنه عددی قابل نمایش در یک جلسه کمحجم را محدود میکنند. وقتی سه سهم در نقطه افراطی باشند، تنها مقادیر ممکن 0، 33٫3، 66٫7 و 100 هستند. با دو سهم، فقط اعداد 0، 50 و 100 ممکناند. عدد 66٫7 که بر پایه دو سقف و یک کف ساخته شده است، اعشار بیشتری از ظرفیتی دارد که حجم نمونه آن پشتیبانی میکند. راهکار ساده است: تعداد واقعی سقفها و کفها را در کنار شاخص بخوانید و هرگز فقط به خود شاخص اتکا نکنید.
پهنای بازار: شاخص High-Low در برابر advance/decline
هر دو معیار میپرسند چند سهم در حرکت بازار مشارکت دارند، اما افق زمانی آنها متفاوت است. پهنای advance/decline تمام سهمهایی را که نسبت به روز قبل افزایش یا کاهش داشتهاند میشمارد. مخرج آن کل جامعه آماری است و وضعیت یک روز را توصیف میکند. شاخص High-Low فقط سهمهایی را میشمارد که در نقطه افراطی 52هفتهای قرار دارند. مخرج آن کوچک است و جایگاه قیمتها را در مقایسه با سابقه یکساله توصیف میکند. ممکن است بازار در یک روز بهطور گسترده رشد کند، در حالی که تعداد بسیار کمی از سهمها به سقف 52هفتهای خود نزدیک باشند.
پنل زیر هر دو معیار را برای همان 10 جلسه و همان سبد هموار میکند و آنها را در یک مقیاس قرار میدهد.
کد دقیق SQL پشت هر عدد
WITH daily_close AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
argMax(close, window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('AAPL','MSFT','NVDA','AMZN','GOOGL','AVGO','JPM','JNJ','XOM','PG',
'KO','PEP','WMT','HD','CVX','MRK','PFE','ABBV','CSCO','ORCL',
'CRM','ADBE','MCD','NKE','VZ','T','DIS','BA','CAT','GE',
'IBM','MMM','UNH','LLY','COST','TGT','SBUX','GS','MS','LIN')
AND window_start >= toDateTime('2025-03-01 00:00:00')
AND window_start < toDateTime('2026-08-01 05:00:00')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, session_date
),
extremes AS (
SELECT cur.ticker AS ticker,
cur.session_date AS session_date,
cur.close_px AS close_px,
max(hist.close_px) AS high_52w,
min(hist.close_px) AS low_52w
FROM daily_close AS cur
INNER JOIN daily_close AS hist ON cur.ticker = hist.ticker
WHERE cur.session_date >= toDate('2026-04-01')
AND hist.session_date <= cur.session_date
AND hist.session_date > cur.session_date - 364
GROUP BY cur.ticker, cur.session_date, cur.close_px
),
daily AS (
SELECT session_date,
countIf(close_px >= high_52w) AS new_highs,
countIf(close_px >= high_52w) + countIf(close_px <= low_52w) AS names_at_extreme
FROM extremes
GROUP BY session_date
HAVING names_at_extreme > 0
),
prior AS (
SELECT ticker,
session_date,
close_px,
lagInFrame(close_px, 1) OVER (PARTITION BY ticker ORDER BY session_date
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close
FROM daily_close
),
breadth AS (
SELECT session_date,
round(100 * countIf(close_px > prev_close) / count(), 1) AS advancing_pct
FROM prior
WHERE session_date >= toDate('2026-04-01')
AND prev_close > 0
GROUP BY session_date
HAVING count() >= 20
),
combined AS (
SELECT d.session_date AS session_date,
round(100 * d.new_highs / d.names_at_extreme, 1) AS record_high_pct,
b.advancing_pct AS advancing_pct
FROM daily AS d
INNER JOIN breadth AS b ON d.session_date = b.session_date
),
smoothed AS (
SELECT session_date,
round(avg(record_high_pct) OVER (ORDER BY session_date
ROWS BETWEEN 9 PRECEDING AND CURRENT ROW), 1) AS high_low_index_pct,
round(avg(advancing_pct) OVER (ORDER BY session_date
ROWS BETWEEN 9 PRECEDING AND CURRENT ROW), 1) AS advancing_pct_10d,
count() OVER (ORDER BY session_date
ROWS BETWEEN 9 PRECEDING AND CURRENT ROW) AS sessions_in_window
FROM combined
)
SELECT session_date AS date,
formatDateTimeInJodaSyntax(session_date, 'MMM d') AS session_label,
high_low_index_pct,
advancing_pct_10d
FROM smoothed
WHERE sessions_in_window = 10
ORDER BY session_dateاین دو معیار در آغاز بازه ترسیمشده، در Apr 15، بهترتیب روی 52.5 برای شاخص High-Low و 52.8 برای سهم افزایشی 10روزه قرار دارند. در پایان، یعنی در Jul 29، مقادیر آنها بهترتیب 64 و 52.5 است. این بازه شامل 68 جلسه ترسیمشده است. سهم افزایشی در دامنهای محدود حرکت میکند. در یک جلسه عادی، تقریباً نیمی از سبد با قیمت بالاتر بسته میشود و میانگینگیری از 10 جلسه، خط را نزدیک میانه مقیاس نگه میدارد. شاخص High-Low چنین لنگری ندارد. اگر در طول 10 جلسه هیچ سهمی از سبد کف 52هفتهای ثبت نکند، مقدار روزانه هر جلسه 100 و میانگین نیز 100 خواهد بود.
پهنای بازار زمانی بهتر خوانده میشود که در کنار معیارهای مشارکت قرار گیرد. حجم نسبی نشان میدهد آیا امروز معاملات یک سهم در مقایسه با الگوی معمول خودش بهطور غیرعادی سنگین است یا نه. بزرگترین نمادهای صعودی و نزولی هفته نشان میدهد کدام سهمها واقعاً حرکت کردهاند و سهام با حجم غیرعادی این هفته مشخص میکند جریان معاملات به کجا رفته است.
پرسشهای متداول شاخص High-Low
عدد بالاتر از 70 در شاخص High-Low چه معنایی دارد؟
یعنی در میانگین 10 جلسه گذشته، تعداد سقفهای جدید 52هفتهای بیش از دو برابر تعداد کفهای جدید 52هفتهای بوده است. این عدد، نشانه متعارف قدرت بازار است. اما درباره تعداد سهمهایی که اصلاً به نقطه افراطی رسیدهاند چیزی نمیگوید؛ این همان عددی است که باید در کنار شاخص بررسی شود.
تفاوت Record High Percent و شاخص High-Low چیست؟
Record High Percent مقدار مربوط به یک جلسه است: تعداد سقفهای جدید تقسیم بر مجموع سقفهای جدید و کفهای جدید، ضربدر 100. شاخص High-Low میانگین متحرک ساده 10روزه همین مقدار است. اولی وضعیت امروز را توصیف میکند و دومی وضعیت دو هفته گذشته را.
آیا شاخص High-Low میتواند 0 یا 100 باشد؟
بله. اگر در 10 جلسه پیاپی هیچ سهمی در جامعه آماری کف جدید 52هفتهای ثبت نکند، مقدار روزانه هر جلسه 100 و میانگین نیز 100 خواهد بود. اگر هیچ سهمی سقف یا کف جدید ثبت نکند، مخرج کسر صفر میشود و برای آن جلسه مقدار مشخصی وجود ندارد.
آیا شاخص High-Low با پهنای advance/decline یکسان است؟
خیر. پهنای advance/decline بر کل جامعه آماری تقسیم میشود و جهت حرکت بازار را در یک روز توصیف میکند. شاخص High-Low بر گروه کوچک سهمهایی تقسیم میشود که در نقاط افراطی 52هفتهای قرار دارند و جایگاه قیمتها را در مقایسه با سابقه یکساله نشان میدهد.
معمولاً چند سهم در مخرج شاخص High-Low قرار میگیرد؟
در سبد 40سهمی که از آوریل تا ژوئیه 2026 بررسی شد، جلسات دسته 1 to 3 names بهطور میانگین 2 سهم در مخرج داشتند. شمارش در سطح کل بورس از نظر مطلق بزرگتر است، اما همچنان بخش کوچکی از کل نمادها را تشکیل میدهد. به همین دلیل، تعداد واقعی سقفها و کفها باید در کنار شاخص روی صفحه نمایش داده شود.
تمام شمارشهای این صفحه از یک پرسوجوی ذخیرهشده و نسخهبندیشده بر اساس قیمتهای پایانی به دست آمدهاند. برای مشاهده SQL پشت هر پنل، آن را باز کنید؛ یا همین مجموعه دادههای پهنای بازار را روی سبدی دلخواه در پایانه Strasmore بازسازی کنید.