Skip to content

Analyse PSX Sector Performance with Python

psxdata.sectors() returns a summary of all 37 PSX sectors including advance/decline counts, turnover, and market capitalisation.

Fetch sector data

import psxdata

df = psxdata.sectors()
print(df.columns.tolist())
# ['sector_code', 'sector_name', 'advance', 'decline', 'unchanged', 'turnover', 'market_cap_b']
print(df.shape)
# (37, 7)

Top sectors by market cap

import psxdata

df = psxdata.sectors()
top10 = df.sort_values("market_cap_b", ascending=False).head(10)
print(top10[["sector_name", "market_cap_b"]])

Advance/decline ratio

import psxdata

df = psxdata.sectors()
df["ad_ratio"] = df["advance"] / (df["decline"] + 1)  # +1 avoids ZeroDivisionError
bullish = df[df["ad_ratio"] > 2][["sector_name", "advance", "decline", "ad_ratio"]]
print(bullish.sort_values("ad_ratio", ascending=False))

Find stocks in a specific sector

import psxdata
import pandas as pd

# Find tickers in a specific sector via the screener
kse100 = psxdata.tickers(index="KSE100")
quotes = [psxdata.quote(t).assign(ticker=t) for t in kse100[:20]]

screener = pd.concat(quotes, ignore_index=True)
cemento = screener[screener["sector"].str.contains("Cement", na=False)]
print(cemento[["symbol", "sector", "ldcp"]])

See also