# borsapy.index

Index class for market index data - yfinance-like API.

View Source

      1"""Index class for market index data - yfinance-like API."""
      2
      3from datetime import datetime
      4from typing import Any
      5
      6import pandas as pd
      7
      8from borsapy._providers.bist_index import get_bist_index_provider
      9from borsapy._providers.tradingview import get_tradingview_provider
     10from borsapy.technical import TechnicalMixin
     11
     12# Known market indices with their names
     13INDICES = {
     14    # Main indices
     15    "XU100": "BIST 100",
     16    "XU050": "BIST 50",
     17    "XU030": "BIST 30",
     18    "XUTUM": "BIST Tüm",
     19    # Participation (Katılım) indices
     20    "XKTUM": "BIST Katılım Tüm",
     21    "XK100": "BIST Katılım 100",
     22    "XK050": "BIST Katılım 50",
     23    "XK030": "BIST Katılım 30",
     24    "XKTMT": "BIST Katılım Model Portföy",
     25    # Sector indices
     26    "XBANK": "BIST Banka",
     27    "XUSIN": "BIST Sınai",
     28    "XUMAL": "BIST Mali",
     29    "XHOLD": "BIST Holding ve Yatırım",
     30    "XUTEK": "BIST Teknoloji",
     31    "XGIDA": "BIST Gıda",
     32    "XTRZM": "BIST Turizm",
     33    "XULAS": "BIST Ulaştırma",
     34    "XSGRT": "BIST Sigorta",
     35    "XMANA": "BIST Metal Ana",
     36    "XKMYA": "BIST Kimya",
     37    "XMADN": "BIST Maden",
     38    "XELKT": "BIST Elektrik",
     39    "XTEKS": "BIST Tekstil",
     40    "XILTM": "BIST İletişim",
     41    # Thematic indices
     42    "XSRDK": "BIST Sürdürülebilirlik",
     43    "XKURY": "BIST Kurumsal Yönetim",
     44    "XYLDZ": "BIST Yıldız",
     45    "XBANA": "BIST Banka Dışı Likit 10",
     46    "XSPOR": "BIST Spor",
     47    "XGMYO": "BIST GYO",
     48    "XTUMY": "BIST Tüm-100",
     49    "XYORT": "BIST Yatırım Ortaklıkları",
     50    "XSDNZ": "BIST Seçme Divident",
     51}
     52
     53
     54class Index(TechnicalMixin):
     55    """
     56    A yfinance-like interface for Turkish market indices.
     57
     58    Examples:
     59        >>> import borsapy as bp
     60        >>> xu100 = bp.Index("XU100")
     61        >>> xu100.info
     62        {'symbol': 'XU100', 'name': 'BIST 100', 'last': 9500.5, ...}
     63        >>> xu100.history(period="1mo")
     64                         Open      High       Low     Close      Volume
     65        Date
     66        2024-12-01    9400.00  9550.00  9380.00  9500.50  1234567890
     67        ...
     68
     69        # Available indices
     70        >>> bp.indices()
     71        ['XU100', 'XU050', 'XU030', 'XBANK', ...]
     72    """
     73
     74    def __init__(self, symbol: str):
     75        """
     76        Initialize an Index object.
     77
     78        Args:
     79            symbol: Index symbol (e.g., "XU100", "XU030", "XBANK").
     80        """
     81        self._symbol = symbol.upper()
     82        self._tradingview = get_tradingview_provider()
     83        self._bist_index = get_bist_index_provider()
     84        self._info_cache: dict[str, Any] | None = None
     85        self._components_cache: list[dict[str, Any]] | None = None
     86
     87    @property
     88    def symbol(self) -> str:
     89        """Return the index symbol."""
     90        return self._symbol
     91
     92    @property
     93    def info(self) -> dict[str, Any]:
     94        """
     95        Get current index information.
     96
     97        Returns:
     98            Dictionary with index data:
     99            - symbol: Index symbol
    100            - name: Index full name
    101            - last: Current value
    102            - open: Opening value
    103            - high: Day high
    104            - low: Day low
    105            - close: Previous close
    106            - change: Value change
    107            - change_percent: Percent change
    108            - update_time: Last update timestamp
    109        """
    110        if self._info_cache is None:
    111            # Use TradingView API to get quote (same endpoint works for indices)
    112            quote = self._tradingview.get_quote(self._symbol)
    113            quote["name"] = INDICES.get(self._symbol, self._symbol)
    114            quote["type"] = "index"
    115            self._info_cache = quote
    116        return self._info_cache
    117
    118    @property
    119    def components(self) -> list[dict[str, Any]]:
    120        """
    121        Get constituent stocks of this index.
    122
    123        Returns:
    124            List of component dicts with 'symbol' and 'name' keys.
    125            Empty list if index components are not available.
    126
    127        Examples:
    128            >>> import borsapy as bp
    129            >>> xu030 = bp.Index("XU030")
    130            >>> xu030.components
    131            [{'symbol': 'AKBNK', 'name': 'AKBANK'}, ...]
    132            >>> len(xu030.components)
    133            30
    134        """
    135        if self._components_cache is None:
    136            self._components_cache = self._bist_index.get_components(self._symbol)
    137        return self._components_cache
    138
    139    @property
    140    def component_symbols(self) -> list[str]:
    141        """
    142        Get just the ticker symbols of constituent stocks.
    143
    144        Returns:
    145            List of stock symbols.
    146
    147        Examples:
    148            >>> import borsapy as bp
    149            >>> xu030 = bp.Index("XU030")
    150            >>> xu030.component_symbols
    151            ['AKBNK', 'AKSA', 'AKSEN', ...]
    152        """
    153        return [c["symbol"] for c in self.components]
    154
    155    def history(
    156        self,
    157        period: str = "1mo",
    158        interval: str = "1d",
    159        start: datetime | str | None = None,
    160        end: datetime | str | None = None,
    161    ) -> pd.DataFrame:
    162        """
    163        Get historical index data.
    164
    165        Args:
    166            period: How much data to fetch. Valid periods:
    167                    1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, ytd, max.
    168                    Ignored if start is provided.
    169            interval: Data interval. Valid intervals:
    170                      1m, 5m, 15m, 30m, 1h, 1d, 1wk, 1mo.
    171            start: Start date (string or datetime).
    172            end: End date (string or datetime). Defaults to today.
    173
    174        Returns:
    175            DataFrame with columns: Open, High, Low, Close, Volume.
    176            Index is the Date.
    177
    178        Examples:
    179            >>> idx = Index("XU100")
    180            >>> idx.history(period="1mo")  # Last month
    181            >>> idx.history(period="1y")  # Last year
    182            >>> idx.history(start="2024-01-01", end="2024-06-30")
    183        """
    184        # Parse dates
    185        start_dt = self._parse_date(start) if start else None
    186        end_dt = self._parse_date(end) if end else None
    187
    188        # Use TradingView provider (same API works for indices)
    189        return self._tradingview.get_history(
    190            symbol=self._symbol,
    191            period=period,
    192            interval=interval,
    193            start=start_dt,
    194            end=end_dt,
    195        )
    196
    197    def _parse_date(self, date: str | datetime) -> datetime:
    198        """Parse a date string to datetime."""
    199        if isinstance(date, datetime):
    200            return date
    201        for fmt in ["%Y-%m-%d", "%Y/%m/%d", "%d-%m-%Y", "%d/%m/%Y"]:
    202            try:
    203                return datetime.strptime(date, fmt)
    204            except ValueError:
    205                continue
    206        raise ValueError(f"Could not parse date: {date}")
    207
    208    def _get_ta_symbol_info(self) -> tuple[str, str]:
    209        """Get TradingView symbol and screener for TA signals.
    210
    211        Returns:
    212            Tuple of (tv_symbol, screener) for TradingView Scanner API.
    213        """
    214        return (f"BIST:{self._symbol}", "turkey")
    215
    216    def scan(
    217        self,
    218        condition: str,
    219        period: str = "3mo",
    220        interval: str = "1d",
    221    ) -> "pd.DataFrame":
    222        """Scan index components for technical conditions.
    223
    224        Convenience method for scanning all stocks in this index.
    225
    226        Args:
    227            condition: Condition string (e.g., "rsi < 30", "price > sma_50")
    228            period: Historical data period for indicator calculation
    229            interval: Data interval
    230
    231        Returns:
    232            DataFrame with matching symbols and their data
    233
    234        Examples:
    235            >>> import borsapy as bp
    236            >>> xu030 = bp.Index("XU030")
    237            >>> xu030.scan("rsi < 30")
    238            >>> xu030.scan("price > sma_50 and rsi > 50")
    239            >>> xu030.scan("sma_20 crosses_above sma_50")
    240        """
    241        from borsapy.scanner import scan
    242
    243        return scan(self.component_symbols, condition, period, interval)
    244
    245    def __repr__(self) -> str:
    246        return f"Index('{self._symbol}')"
    247
    248
    249def indices(detailed: bool = False) -> list[str] | list[dict[str, Any]]:
    250    """
    251    Get list of available market indices.
    252
    253    Args:
    254        detailed: If True, return list of dicts with symbol, name, and count.
    255                  If False (default), return just the symbol list.
    256
    257    Returns:
    258        List of index symbols, or list of dicts if detailed=True.
    259
    260    Examples:
    261        >>> import borsapy as bp
    262        >>> bp.indices()
    263        ['XU100', 'XU050', 'XU030', 'XBANK', 'XUSIN', ...]
    264        >>> bp.indices(detailed=True)
    265        [{'symbol': 'XU100', 'name': 'BIST 100', 'count': 100}, ...]
    266    """
    267    if not detailed:
    268        return list(INDICES.keys())
    269
    270    # Get component counts from provider
    271    provider = get_bist_index_provider()
    272    available = provider.get_available_indices()
    273
    274    # Create lookup for counts
    275    count_map = {item["symbol"]: item["count"] for item in available}
    276
    277    result = []
    278    for symbol, name in INDICES.items():
    279        result.append({
    280            "symbol": symbol,
    281            "name": name,
    282            "count": count_map.get(symbol, 0),
    283        })
    284    return result
    285
    286
    287def all_indices() -> list[dict[str, Any]]:
    288    """
    289    Get all indices from BIST with component counts.
    290
    291    This returns all 79 indices available in the BIST data,
    292    not just the commonly used ones in indices().
    293
    294    Returns:
    295        List of dicts with 'symbol', 'name', and 'count' keys.
    296
    297    Examples:
    298        >>> import borsapy as bp
    299        >>> bp.all_indices()
    300        [{'symbol': 'X030C', 'name': 'BIST 30 Capped', 'count': 30}, ...]
    301    """
    302    provider = get_bist_index_provider()
    303    return provider.get_available_indices()
    304
    305
    306def index(symbol: str) -> Index:
    307    """
    308    Get an Index object for the given symbol.
    309
    310    This is a convenience function that creates an Index object.
    311
    312    Args:
    313        symbol: Index symbol (e.g., "XU100", "XBANK").
    314
    315    Returns:
    316        Index object.
    317
    318    Examples:
    319        >>> import borsapy as bp
    320        >>> xu100 = bp.index("XU100")
    321        >>> xu100.history(period="1mo")
    322    """
    323    return Index(symbol)

INDICES = {'XU100': 'BIST 100', 'XU050': 'BIST 50', 'XU030': 'BIST 30', 'XUTUM': 'BIST Tüm', 'XKTUM': 'BIST Katılım Tüm', 'XK100': 'BIST Katılım 100', 'XK050': 'BIST Katılım 50', 'XK030': 'BIST Katılım 30', 'XKTMT': 'BIST Katılım Model Portföy', 'XBANK': 'BIST Banka', 'XUSIN': 'BIST Sınai', 'XUMAL': 'BIST Mali', 'XHOLD': 'BIST Holding ve Yatırım', 'XUTEK': 'BIST Teknoloji', 'XGIDA': 'BIST Gıda', 'XTRZM': 'BIST Turizm', 'XULAS': 'BIST Ulaştırma', 'XSGRT': 'BIST Sigorta', 'XMANA': 'BIST Metal Ana', 'XKMYA': 'BIST Kimya', 'XMADN': 'BIST Maden', 'XELKT': 'BIST Elektrik', 'XTEKS': 'BIST Tekstil', 'XILTM': 'BIST İletişim', 'XSRDK': 'BIST Sürdürülebilirlik', 'XKURY': 'BIST Kurumsal Yönetim', 'XYLDZ': 'BIST Yıldız', 'XBANA': 'BIST Banka Dışı Likit 10', 'XSPOR': 'BIST Spor', 'XGMYO': 'BIST GYO', 'XTUMY': 'BIST Tüm-100', 'XYORT': 'BIST Yatırım Ortaklıkları', 'XSDNZ': 'BIST Seçme Divident'}
class Index(borsapy.technical.TechnicalMixin): View Source

     55class Index(TechnicalMixin):
     56    """
     57    A yfinance-like interface for Turkish market indices.
     58
     59    Examples:
     60        >>> import borsapy as bp
     61        >>> xu100 = bp.Index("XU100")
     62        >>> xu100.info
     63        {'symbol': 'XU100', 'name': 'BIST 100', 'last': 9500.5, ...}
     64        >>> xu100.history(period="1mo")
     65                         Open      High       Low     Close      Volume
     66        Date
     67        2024-12-01    9400.00  9550.00  9380.00  9500.50  1234567890
     68        ...
     69
     70        # Available indices
     71        >>> bp.indices()
     72        ['XU100', 'XU050', 'XU030', 'XBANK', ...]
     73    """
     74
     75    def __init__(self, symbol: str):
     76        """
     77        Initialize an Index object.
     78
     79        Args:
     80            symbol: Index symbol (e.g., "XU100", "XU030", "XBANK").
     81        """
     82        self._symbol = symbol.upper()
     83        self._tradingview = get_tradingview_provider()
     84        self._bist_index = get_bist_index_provider()
     85        self._info_cache: dict[str, Any] | None = None
     86        self._components_cache: list[dict[str, Any]] | None = None
     87
     88    @property
     89    def symbol(self) -> str:
     90        """Return the index symbol."""
     91        return self._symbol
     92
     93    @property
     94    def info(self) -> dict[str, Any]:
     95        """
     96        Get current index information.
     97
     98        Returns:
     99            Dictionary with index data:
    100            - symbol: Index symbol
    101            - name: Index full name
    102            - last: Current value
    103            - open: Opening value
    104            - high: Day high
    105            - low: Day low
    106            - close: Previous close
    107            - change: Value change
    108            - change_percent: Percent change
    109            - update_time: Last update timestamp
    110        """
    111        if self._info_cache is None:
    112            # Use TradingView API to get quote (same endpoint works for indices)
    113            quote = self._tradingview.get_quote(self._symbol)
    114            quote["name"] = INDICES.get(self._symbol, self._symbol)
    115            quote["type"] = "index"
    116            self._info_cache = quote
    117        return self._info_cache
    118
    119    @property
    120    def components(self) -> list[dict[str, Any]]:
    121        """
    122        Get constituent stocks of this index.
    123
    124        Returns:
    125            List of component dicts with 'symbol' and 'name' keys.
    126            Empty list if index components are not available.
    127
    128        Examples:
    129            >>> import borsapy as bp
    130            >>> xu030 = bp.Index("XU030")
    131            >>> xu030.components
    132            [{'symbol': 'AKBNK', 'name': 'AKBANK'}, ...]
    133            >>> len(xu030.components)
    134            30
    135        """
    136        if self._components_cache is None:
    137            self._components_cache = self._bist_index.get_components(self._symbol)
    138        return self._components_cache
    139
    140    @property
    141    def component_symbols(self) -> list[str]:
    142        """
    143        Get just the ticker symbols of constituent stocks.
    144
    145        Returns:
    146            List of stock symbols.
    147
    148        Examples:
    149            >>> import borsapy as bp
    150            >>> xu030 = bp.Index("XU030")
    151            >>> xu030.component_symbols
    152            ['AKBNK', 'AKSA', 'AKSEN', ...]
    153        """
    154        return [c["symbol"] for c in self.components]
    155
    156    def history(
    157        self,
    158        period: str = "1mo",
    159        interval: str = "1d",
    160        start: datetime | str | None = None,
    161        end: datetime | str | None = None,
    162    ) -> pd.DataFrame:
    163        """
    164        Get historical index data.
    165
    166        Args:
    167            period: How much data to fetch. Valid periods:
    168                    1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, ytd, max.
    169                    Ignored if start is provided.
    170            interval: Data interval. Valid intervals:
    171                      1m, 5m, 15m, 30m, 1h, 1d, 1wk, 1mo.
    172            start: Start date (string or datetime).
    173            end: End date (string or datetime). Defaults to today.
    174
    175        Returns:
    176            DataFrame with columns: Open, High, Low, Close, Volume.
    177            Index is the Date.
    178
    179        Examples:
    180            >>> idx = Index("XU100")
    181            >>> idx.history(period="1mo")  # Last month
    182            >>> idx.history(period="1y")  # Last year
    183            >>> idx.history(start="2024-01-01", end="2024-06-30")
    184        """
    185        # Parse dates
    186        start_dt = self._parse_date(start) if start else None
    187        end_dt = self._parse_date(end) if end else None
    188
    189        # Use TradingView provider (same API works for indices)
    190        return self._tradingview.get_history(
    191            symbol=self._symbol,
    192            period=period,
    193            interval=interval,
    194            start=start_dt,
    195            end=end_dt,
    196        )
    197
    198    def _parse_date(self, date: str | datetime) -> datetime:
    199        """Parse a date string to datetime."""
    200        if isinstance(date, datetime):
    201            return date
    202        for fmt in ["%Y-%m-%d", "%Y/%m/%d", "%d-%m-%Y", "%d/%m/%Y"]:
    203            try:
    204                return datetime.strptime(date, fmt)
    205            except ValueError:
    206                continue
    207        raise ValueError(f"Could not parse date: {date}")
    208
    209    def _get_ta_symbol_info(self) -> tuple[str, str]:
    210        """Get TradingView symbol and screener for TA signals.
    211
    212        Returns:
    213            Tuple of (tv_symbol, screener) for TradingView Scanner API.
    214        """
    215        return (f"BIST:{self._symbol}", "turkey")
    216
    217    def scan(
    218        self,
    219        condition: str,
    220        period: str = "3mo",
    221        interval: str = "1d",
    222    ) -> "pd.DataFrame":
    223        """Scan index components for technical conditions.
    224
    225        Convenience method for scanning all stocks in this index.
    226
    227        Args:
    228            condition: Condition string (e.g., "rsi < 30", "price > sma_50")
    229            period: Historical data period for indicator calculation
    230            interval: Data interval
    231
    232        Returns:
    233            DataFrame with matching symbols and their data
    234
    235        Examples:
    236            >>> import borsapy as bp
    237            >>> xu030 = bp.Index("XU030")
    238            >>> xu030.scan("rsi < 30")
    239            >>> xu030.scan("price > sma_50 and rsi > 50")
    240            >>> xu030.scan("sma_20 crosses_above sma_50")
    241        """
    242        from borsapy.scanner import scan
    243
    244        return scan(self.component_symbols, condition, period, interval)
    245
    246    def __repr__(self) -> str:
    247        return f"Index('{self._symbol}')"

A yfinance-like interface for Turkish market indices.

Examples:

> > > import borsapy as bp xu100 = bp.Index("XU100") xu100.info {'symbol': 'XU100', 'name': 'BIST 100', 'last': 9500.5, ...} xu100.history(period="1mo") Open High Low Close Volume Date 2024-12-01 9400.00 9550.00 9380.00 9500.50 1234567890 ...

> > >     # Available indices
> > >     >>> bp.indices()
> > >     ['XU100', 'XU050', 'XU030', 'XBANK', ...]

Index(symbol: str) View Source

    75    def __init__(self, symbol: str):
    76        """
    77        Initialize an Index object.
    78
    79        Args:
    80            symbol: Index symbol (e.g., "XU100", "XU030", "XBANK").
    81        """
    82        self._symbol = symbol.upper()
    83        self._tradingview = get_tradingview_provider()
    84        self._bist_index = get_bist_index_provider()
    85        self._info_cache: dict[str, Any] | None = None
    86        self._components_cache: list[dict[str, Any]] | None = None

Initialize an Index object.

Args: symbol: Index symbol (e.g., "XU100", "XU030", "XBANK").

symbol: str View Source

    88    @property
    89    def symbol(self) -> str:
    90        """Return the index symbol."""
    91        return self._symbol

Return the index symbol.

info: dict[str, typing.Any] View Source

     93    @property
     94    def info(self) -> dict[str, Any]:
     95        """
     96        Get current index information.
     97
     98        Returns:
     99            Dictionary with index data:
    100            - symbol: Index symbol
    101            - name: Index full name
    102            - last: Current value
    103            - open: Opening value
    104            - high: Day high
    105            - low: Day low
    106            - close: Previous close
    107            - change: Value change
    108            - change_percent: Percent change
    109            - update_time: Last update timestamp
    110        """
    111        if self._info_cache is None:
    112            # Use TradingView API to get quote (same endpoint works for indices)
    113            quote = self._tradingview.get_quote(self._symbol)
    114            quote["name"] = INDICES.get(self._symbol, self._symbol)
    115            quote["type"] = "index"
    116            self._info_cache = quote
    117        return self._info_cache

Get current index information.

Returns: Dictionary with index data: - symbol: Index symbol - name: Index full name - last: Current value - open: Opening value - high: Day high - low: Day low - close: Previous close - change: Value change - change_percent: Percent change - update_time: Last update timestamp

components: list[dict[str, typing.Any]] View Source

    119    @property
    120    def components(self) -> list[dict[str, Any]]:
    121        """
    122        Get constituent stocks of this index.
    123
    124        Returns:
    125            List of component dicts with 'symbol' and 'name' keys.
    126            Empty list if index components are not available.
    127
    128        Examples:
    129            >>> import borsapy as bp
    130            >>> xu030 = bp.Index("XU030")
    131            >>> xu030.components
    132            [{'symbol': 'AKBNK', 'name': 'AKBANK'}, ...]
    133            >>> len(xu030.components)
    134            30
    135        """
    136        if self._components_cache is None:
    137            self._components_cache = self._bist_index.get_components(self._symbol)
    138        return self._components_cache

Get constituent stocks of this index.

Returns: List of component dicts with 'symbol' and 'name' keys. Empty list if index components are not available.

Examples:

> > > import borsapy as bp xu030 = bp.Index("XU030") xu030.components [{'symbol': 'AKBNK', 'name': 'AKBANK'}, ...] len(xu030.components) 30

component_symbols: list[str] View Source

    140    @property
    141    def component_symbols(self) -> list[str]:
    142        """
    143        Get just the ticker symbols of constituent stocks.
    144
    145        Returns:
    146            List of stock symbols.
    147
    148        Examples:
    149            >>> import borsapy as bp
    150            >>> xu030 = bp.Index("XU030")
    151            >>> xu030.component_symbols
    152            ['AKBNK', 'AKSA', 'AKSEN', ...]
    153        """
    154        return [c["symbol"] for c in self.components]

Get just the ticker symbols of constituent stocks.

Returns: List of stock symbols.

Examples:

> > > import borsapy as bp xu030 = bp.Index("XU030") xu030.component_symbols ['AKBNK', 'AKSA', 'AKSEN', ...]

def history( self, period: str = '1mo', interval: str = '1d', start: datetime.datetime | str | None = None, end: datetime.datetime | str | None = None) -> pandas.core.frame.DataFrame: View Source

    156    def history(
    157        self,
    158        period: str = "1mo",
    159        interval: str = "1d",
    160        start: datetime | str | None = None,
    161        end: datetime | str | None = None,
    162    ) -> pd.DataFrame:
    163        """
    164        Get historical index data.
    165
    166        Args:
    167            period: How much data to fetch. Valid periods:
    168                    1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, ytd, max.
    169                    Ignored if start is provided.
    170            interval: Data interval. Valid intervals:
    171                      1m, 5m, 15m, 30m, 1h, 1d, 1wk, 1mo.
    172            start: Start date (string or datetime).
    173            end: End date (string or datetime). Defaults to today.
    174
    175        Returns:
    176            DataFrame with columns: Open, High, Low, Close, Volume.
    177            Index is the Date.
    178
    179        Examples:
    180            >>> idx = Index("XU100")
    181            >>> idx.history(period="1mo")  # Last month
    182            >>> idx.history(period="1y")  # Last year
    183            >>> idx.history(start="2024-01-01", end="2024-06-30")
    184        """
    185        # Parse dates
    186        start_dt = self._parse_date(start) if start else None
    187        end_dt = self._parse_date(end) if end else None
    188
    189        # Use TradingView provider (same API works for indices)
    190        return self._tradingview.get_history(
    191            symbol=self._symbol,
    192            period=period,
    193            interval=interval,
    194            start=start_dt,
    195            end=end_dt,
    196        )

Get historical index data.

Args: period: How much data to fetch. Valid periods: 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, ytd, max. Ignored if start is provided. interval: Data interval. Valid intervals: 1m, 5m, 15m, 30m, 1h, 1d, 1wk, 1mo. start: Start date (string or datetime). end: End date (string or datetime). Defaults to today.

Returns: DataFrame with columns: Open, High, Low, Close, Volume. Index is the Date.

Examples:

> > > idx = Index("XU100") idx.history(period="1mo") # Last month idx.history(period="1y") # Last year idx.history(start="2024-01-01", end="2024-06-30")

def scan( self, condition: str, period: str = '3mo', interval: str = '1d') -> pandas.core.frame.DataFrame: View Source

    217    def scan(
    218        self,
    219        condition: str,
    220        period: str = "3mo",
    221        interval: str = "1d",
    222    ) -> "pd.DataFrame":
    223        """Scan index components for technical conditions.
    224
    225        Convenience method for scanning all stocks in this index.
    226
    227        Args:
    228            condition: Condition string (e.g., "rsi < 30", "price > sma_50")
    229            period: Historical data period for indicator calculation
    230            interval: Data interval
    231
    232        Returns:
    233            DataFrame with matching symbols and their data
    234
    235        Examples:
    236            >>> import borsapy as bp
    237            >>> xu030 = bp.Index("XU030")
    238            >>> xu030.scan("rsi < 30")
    239            >>> xu030.scan("price > sma_50 and rsi > 50")
    240            >>> xu030.scan("sma_20 crosses_above sma_50")
    241        """
    242        from borsapy.scanner import scan
    243
    244        return scan(self.component_symbols, condition, period, interval)

Scan index components for technical conditions.

Convenience method for scanning all stocks in this index.

Args: condition: Condition string (e.g., "rsi < 30", "price > sma_50") period: Historical data period for indicator calculation interval: Data interval

Returns: DataFrame with matching symbols and their data

Examples:

> > > import borsapy as bp xu030 = bp.Index("XU030") xu030.scan("rsi < 30") xu030.scan("price > sma_50 and rsi > 50") xu030.scan("sma_20 crosses_above sma_50")

def indices(detailed: bool = False) -> list[str] | list[dict[str, typing.Any]]: View Source

    250def indices(detailed: bool = False) -> list[str] | list[dict[str, Any]]:
    251    """
    252    Get list of available market indices.
    253
    254    Args:
    255        detailed: If True, return list of dicts with symbol, name, and count.
    256                  If False (default), return just the symbol list.
    257
    258    Returns:
    259        List of index symbols, or list of dicts if detailed=True.
    260
    261    Examples:
    262        >>> import borsapy as bp
    263        >>> bp.indices()
    264        ['XU100', 'XU050', 'XU030', 'XBANK', 'XUSIN', ...]
    265        >>> bp.indices(detailed=True)
    266        [{'symbol': 'XU100', 'name': 'BIST 100', 'count': 100}, ...]
    267    """
    268    if not detailed:
    269        return list(INDICES.keys())
    270
    271    # Get component counts from provider
    272    provider = get_bist_index_provider()
    273    available = provider.get_available_indices()
    274
    275    # Create lookup for counts
    276    count_map = {item["symbol"]: item["count"] for item in available}
    277
    278    result = []
    279    for symbol, name in INDICES.items():
    280        result.append({
    281            "symbol": symbol,
    282            "name": name,
    283            "count": count_map.get(symbol, 0),
    284        })
    285    return result

Get list of available market indices.

Args: detailed: If True, return list of dicts with symbol, name, and count. If False (default), return just the symbol list.

Returns: List of index symbols, or list of dicts if detailed=True.

Examples:

> > > import borsapy as bp bp.indices() ['XU100', 'XU050', 'XU030', 'XBANK', 'XUSIN', ...] bp.indices(detailed=True) [{'symbol': 'XU100', 'name': 'BIST 100', 'count': 100}, ...]

def all_indices() -> list[dict[str, typing.Any]]: View Source

    288def all_indices() -> list[dict[str, Any]]:
    289    """
    290    Get all indices from BIST with component counts.
    291
    292    This returns all 79 indices available in the BIST data,
    293    not just the commonly used ones in indices().
    294
    295    Returns:
    296        List of dicts with 'symbol', 'name', and 'count' keys.
    297
    298    Examples:
    299        >>> import borsapy as bp
    300        >>> bp.all_indices()
    301        [{'symbol': 'X030C', 'name': 'BIST 30 Capped', 'count': 30}, ...]
    302    """
    303    provider = get_bist_index_provider()
    304    return provider.get_available_indices()

Get all indices from BIST with component counts.

This returns all 79 indices available in the BIST data, not just the commonly used ones in indices().

Returns: List of dicts with 'symbol', 'name', and 'count' keys.

Examples:

> > > import borsapy as bp bp.all_indices() [{'symbol': 'X030C', 'name': 'BIST 30 Capped', 'count': 30}, ...]

def index(symbol: str) -> Index: View Source

    307def index(symbol: str) -> Index:
    308    """
    309    Get an Index object for the given symbol.
    310
    311    This is a convenience function that creates an Index object.
    312
    313    Args:
    314        symbol: Index symbol (e.g., "XU100", "XBANK").
    315
    316    Returns:
    317        Index object.
    318
    319    Examples:
    320        >>> import borsapy as bp
    321        >>> xu100 = bp.index("XU100")
    322        >>> xu100.history(period="1mo")
    323    """
    324    return Index(symbol)

Get an Index object for the given symbol.

This is a convenience function that creates an Index object.

Args: symbol: Index symbol (e.g., "XU100", "XBANK").

Returns: Index object.

Examples:

> > > import borsapy as bp xu100 = bp.index("XU100") xu100.history(period="1mo")