Skip to main content
This section documents volume and liquidity metrics that help assess trading activity and stock tradability.

Relative Volume

RVOL
number
Relative Volume - current volume compared to 20-day average.Calculation:
avg_vol_20 = df['Volume'].tail(21).iloc[:-1].mean()
rvol = latest['Volume'] / avg_vol_20 if avg_vol_20 > 0 else 0
Example: 2.50 (current volume is 2.5x the 20-day average)Source: Calculated from OHLCV dataLocation: advanced_metrics_processor.py:65-66, 82Precision: Rounded to 2 decimal placesInterpretation:
  • RVOL < 0.5: Very low volume (illiquid day)
  • RVOL 0.8-1.2: Normal volume
  • RVOL 1.5-2.5: Above average interest
  • RVOL > 3.0: Exceptional volume (investigate catalyst)
Use Cases:
  • Breakout confirmation (high RVOL + price move = stronger signal)
  • Liquidity screening (avoid stocks with consistently low RVOL)
  • Event detection (spikes indicate news/results/corporate actions)

Volume Moving Averages

200 Days EMA Volume
number
200-day Exponential Moving Average of daily volume.Calculation:
df['EMA_Vol_200'] = df['Volume'].ewm(span=200, adjust=False).mean()
ema_vol_200_latest = df['EMA_Vol_200'].iloc[-1]
Example: 5234567 (shares)Source: Calculated from OHLCV dataLocation: advanced_metrics_processor.py:68-69, 86Precision: Rounded to 0 decimal places (integer shares)Use Cases:
  • Long-term volume trend assessment
  • Compare current volume against long-term baseline
  • Identify structural changes in trading activity
% from 52W High 200 Days EMA Volume
number
Distance from 52-week high of 200-day EMA Volume.Calculation:
ema_vol_200_52w_high = df['EMA_Vol_200'].tail(252).max()
pct_from_ema_200_52w_high = ((ema_vol_200_latest - ema_vol_200_52w_high) / ema_vol_200_52w_high) * 100 if ema_vol_200_52w_high > 0 else 0
Example: -25.30 (volume trend is 25.3% below its 52-week peak)Source: Calculated from OHLCV dataLocation: advanced_metrics_processor.py:71-73, 87Precision: Rounded to 2 decimal placesInterpretation:
  • Negative: Volume trend declining (possible loss of interest)
  • Near 0%: Volume at peak levels (high participation)
  • Positive: Volume expanding beyond historical norms
Use Case: Detect waning/increasing market interest over time

Rupee Turnover Metrics

30 Days Average Rupee Volume(Cr.)
number
Average daily rupee turnover over the past 30 days.Unit: Crores (Cr.)Calculation:
df['Turnover_Cr'] = (df['Close'] * df['Volume']) / 10000000
avg_rupee_vol_30 = df['Turnover_Cr'].tail(30).mean()
Example: 450.80Source: Calculated from OHLCV dataLocation: advanced_metrics_processor.py:62-63, 81Precision: Rounded to 2 decimal placesUse Cases:
  • Institutional liquidity threshold screening
  • Position sizing (ensure turnover supports your trade size)
  • Market impact estimation
Daily Rupee Turnover 20(Cr.)
number
20-day moving average of daily rupee turnover.Unit: Crores (Cr.)Calculation:
turnover_20 = df['Turnover_Cr'].tail(20).mean()
Example: 425.60Source: Calculated from OHLCV dataLocation: advanced_metrics_processor.py:76, 83Precision: Rounded to 2 decimal places
Daily Rupee Turnover 50(Cr.)
number
50-day moving average of daily rupee turnover.Unit: Crores (Cr.)Calculation:
turnover_50 = df['Turnover_Cr'].tail(50).mean()
Example: 410.30Source: Calculated from OHLCV dataLocation: advanced_metrics_processor.py:77, 84Precision: Rounded to 2 decimal places
Daily Rupee Turnover 100(Cr.)
number
100-day moving average of daily rupee turnover.Unit: Crores (Cr.)Calculation:
turnover_100 = df['Turnover_Cr'].tail(100).mean()
Example: 395.20Source: Calculated from OHLCV dataLocation: advanced_metrics_processor.py:78, 85Precision: Rounded to 2 decimal placesUse Case: Long-term liquidity trend analysis

Turnover Analysis

Comparing the three turnover moving averages reveals liquidity trends:
  • 20 > 50 > 100: Increasing liquidity (bullish for tradability)
  • 100 > 50 > 20: Decreasing liquidity (caution for large positions)
  • All similar: Stable liquidity environment

Liquidity Screening Guidelines

For different trading strategies:

Intraday Trading

  • Minimum RVOL: > 1.0
  • Minimum Daily Rupee Turnover 20: > 50 Cr.
  • Day Range(%): > 2% (sufficient volatility)

Swing Trading (1-2 weeks)

  • Minimum Daily Rupee Turnover 20: > 20 Cr.
  • Minimum 30 Days Average Rupee Volume: > 15 Cr.

Positional Trading (1-3 months)

  • Minimum Daily Rupee Turnover 50: > 10 Cr.
  • Consistent volume (avoid stocks with erratic RVOL)

Institutional/Large Orders

  • Minimum Daily Rupee Turnover 100: > 100 Cr.
  • 200 Days EMA Volume: High and stable
  • Market Cap: > 5,000 Cr. (cross-reference with valuation fields)

Data Sources

  1. OHLCV CSV Data (ohlcv_data/*.csv): All volume and turnover calculations
  2. Calculation Engine: advanced_metrics_processor.py with pandas operations

Processing Notes

  • EMA Calculation: Uses pandas ewm(span=periods, adjust=False).mean()
  • Turnover Formula: (Close Price × Volume) / 10,000,000 for Crore conversion
  • Default Values: All fields default to 0.0 if OHLCV data unavailable
  • Thread Pool Execution: Volume calculations run in parallel (10 workers) for performance
  • Minimum Data Requirement: At least 5 rows of OHLCV data needed per symbol

Source Code Reference

  • Volume calculations: advanced_metrics_processor.py:62-78, 81-87
  • EMA helper function: advanced_metrics_processor.py:14-15
  • Parallel processing: advanced_metrics_processor.py:125-130
  • Field merging: advanced_metrics_processor.py:132-166
  • Output schema: all_stocks_fundamental_analysis.json

Build docs developers (and LLMs) love