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