Skip to content

Tutorial: Analyzing BIST Stocks

This tutorial walks through a complete analysis of a BIST stock using FinanceLib.

Step 1: Fetch Stock Data

from financelib import Stock

# Look up Turkish Airlines
result = Stock.search_stock("THYAO")
print(result)

# Get 6 months of historical data
stock = Stock("THYAO.IS")
df = stock.get_historical_data(period="6mo", interval="1d")
print(f"Got {len(df)} data points")
print(df.tail())

Step 2: Calculate Technical Indicators

from financelib.trading.algo_trade import rsi, macd, sma, bollinger_bands

close = df["Close"]
high = df["High"]
low = df["Low"]

# Moving averages
sma_20 = sma(close, period=20)
sma_50 = sma(close, period=50)

# RSI
rsi_14 = rsi(close, period=14)

# MACD
macd_line, signal_line = macd(close)

# Bollinger Bands
bb_upper, bb_middle, bb_lower = bollinger_bands(close)

Step 3: Generate Signals

import pandas as pd

latest = -1  # Most recent data point
current_price = float(close.iloc[latest])
current_rsi = float(rsi_14.iloc[latest])
current_macd = float(macd_line.iloc[latest])
current_signal = float(signal_line.iloc[latest])

print(f"Price: {current_price:.2f} TRY")
print(f"RSI(14): {current_rsi:.1f}")
print(f"MACD: {current_macd:.4f}")
print(f"BB Upper: {float(bb_upper.iloc[latest]):.2f}")
print(f"BB Lower: {float(bb_lower.iloc[latest]):.2f}")

# Simple signal logic
if current_rsi < 30:
    print("Signal: OVERSOLD - Potential buy opportunity")
elif current_rsi > 70:
    print("Signal: OVERBOUGHT - Consider taking profits")
elif current_macd > current_signal:
    print("Signal: BULLISH MACD crossover")
else:
    print("Signal: HOLD - No strong signal")

Step 4: Store Results

from financelib.database.sqlite import SQLite
from financelib.database.models import StockDataModel

with SQLite("bist_analysis") as db:
    data = StockDataModel(
        symbol="THYAO.IS",
        price=current_price,
        change=float(close.iloc[-1] - close.iloc[-2]),
        change_percent=float((close.iloc[-1] - close.iloc[-2]) / close.iloc[-2] * 100),
        volume=int(df["Volume"].iloc[-1]),
    )
    db.insert_stock_data(data)
    print("Analysis saved to database")

Step 5: Scan Multiple Stocks

from financelib.utils import format_currency, format_percentage

for symbol, name in Stock.COMMON_STOCKS.items():
    yahoo_symbol = f"{symbol}.IS"
    try:
        s = Stock(yahoo_symbol)
        data = s._get_stock()
        if data:
            price_str = format_currency(data["price"])
            change_str = format_percentage(data["change_percent"])
            print(f"{symbol:6s} {name:25s} {price_str:>15s} {change_str:>8s}")
    except Exception:
        pass