
Pandas، NumPy، اور Matplotlib کے ساتھ ڈیٹا تجزیہ
مالیاتی ڈیٹا کو صاف کریں، تبدیل کریں، اور کوانٹ کی طرح ویژولائز کریں
NumPy: ہڈ کے نیچے کا انجن
Python میں ہر سنجیدہ مالیاتی حساب بالآخر NumPy کے ذریعے چلتا ہے۔ جبکہ Python لسٹس لچکدار ہیں، وہ سست ہیں—ہر عنصر ٹائپ چیکنگ اوور ہیڈ کے ساتھ ایک مکمل Python آبجیکٹ ہے۔ NumPy arrays خام نمبروں کو مسلسل میموری بلاکس میں محفوظ کرتی ہیں، جس سے وہ آپریشنز فعال ہوتے ہیں جو خالص Python لوپس سے 100 گنا تیز چلتے ہیں۔
عمل میں فرق یہ ہے:
import numpy as np
# Create an array of 1 million random daily returns
returns = np.random.normal(0.0005, 0.02, 1_000_000)
# Vectorized operations — no loops needed
cumulative = np.cumprod(1 + returns) # Growth of $1
sharpe = returns.mean() / returns.std() * np.sqrt(252)
max_drawdown = np.min(cumulative / np.maximum.accumulate(cumulative) - 1)
print(f"Sharpe Ratio: {sharpe:.3f}")
print(f"Max Drawdown: {max_drawdown:.2%}")
مالیات کے لیے کلیدی NumPy تصورات:
- ویکٹرائزڈ آپریشنز — عنصر بہ عنصر لوپ کرنے کے بجائے پوری arrays پر ایک ساتھ ریاضی لاگو کریں۔
- Broadcasting — مختلف shapes کی arrays کو ریاضی کے لیے خود بخود ہم آہنگ کرنا (مثلاً ہر عنصر سے ایک اسکیلر اوسط منہا کرنا)۔
- Linear algebra —
np.linalgمیٹرکس ملٹیپلیکیشن، eigenvalue decomposition، اور solvers فراہم کرتا ہے جو پورٹ فولیو آپٹیمائزیشن میں استعمال ہوتے ہیں۔ - رینڈم سیمپلنگ — مونٹے کارلو سیمولیشنز، بوٹ اسٹریپ سیمپلنگ، اور اسٹوکاسٹک ماڈلنگ سب
np.randomپر انحصار کرتے ہیں۔
پرفارمنس ٹِپ: ہمیشہ Python for-loops پر ویکٹرائزڈ NumPy آپریشنز کو ترجیح دیں۔ 500 اثاثوں پر ایک پورٹ فولیو آپٹیمائزیشن جو لوپس کے ساتھ 30 سیکنڈ لیتی ہے، ویکٹرائزڈ NumPy کے ساتھ 50 ملی سیکنڈ سے کم میں مکمل ہو سکتی ہے — 600 گنا تیزی۔
Pandas: مالیاتی ڈیٹا کے لیے DataFrames
اگر NumPy انجن ہے، تو pandas ڈیش بورڈ ہے۔ یہ NumPy arrays کو لیبل شدہ، انڈیکس شدہ ساخت میں لپیٹتا ہے جو مالیاتی ڈیٹا کی جوڑ توڑ کو بدیہی اور اظہار خیز بناتا ہے۔
دو بنیادی ساختیں یہ ہیں:
- Series — ایک انڈیکس کے ساتھ ڈیٹا کا ایک اکیلا کالم (سوچیں: بندش کی قیمتوں کی ایک ٹائم سیریز)۔
- DataFrame — کالمز کی ایک ٹیبل، ہر ایک Series، ایک مشترکہ انڈیکس رکھتے ہوئے (سوچیں: OHLCV کینڈل اسٹک ڈیٹا)۔
ڈیٹا لوڈ کرنا اور اس کا معائنہ کرنا سیدھا سادا ہے:
import pandas as pd
# Read from CSV
df = pd.read_csv("btc_daily.csv", parse_dates=["date"], index_col="date")
# Or from JSON (common in API responses)
df = pd.read_json("https://api.example.com/candles?symbol=ETH")
# Quick inspection
print(df.shape) # (365, 5)
print(df.dtypes) # Column types
print(df.describe()) # Statistical summary
print(df.tail()) # Last 5 rows
جو چیز pandas کو مالیات کے لیے ناگزیر بناتی ہے وہ اس کا DatetimeIndex ہے۔ ایک بار جب آپ کا انڈیکس datetime-typed ہو جاتا ہے، آپ طاقتور ٹائم-سیریز آپریشنز کو کھول لیتے ہیں:
# Slice by date range
q1_data = df["2025-01":"2025-03"]
# Resample daily data to weekly OHLC
weekly = df["close"].resample("W").ohlc()
# Forward-fill missing data (weekends, holidays)
df = df.asfreq("D").ffill()
یہ آپریشنز مالیاتی ڈیٹا کی گندی حقیقتوں کو ہینڈل کرتے ہیں—خالی جگہیں، ٹائم زون کے فرق، بے قاعدہ ٹائم اسٹیمپس—تاکہ آپ ڈیٹا پلمبنگ کے بجائے تجزیے پر توجہ دے سکیں۔
رولنگ حسابات: موونگ ایوریجز اور اتار چڑھاؤ
مالیاتی تجزیہ فطری طور پر ونڈوڈ ہے۔ آپ کو شاید ہی کبھی کسی ایک ڈیٹا پوائنٹ کی تنہائی میں پرواہ ہو—سیاق و سباق اس بات سے آتا ہے کہ یہ حالیہ تاریخ سے کیسے متعلق ہے۔ Pandas کا .rolling() میتھڈ یہاں آپ کا بنیادی ٹول ہے۔
import pandas as pd
import numpy as np
# Assume df has a "close" column with DatetimeIndex
df["sma_20"] = df["close"].rolling(20).mean()
df["sma_50"] = df["close"].rolling(50).mean()
df["ema_12"] = df["close"].ewm(span=12).mean()
# Daily returns and rolling volatility
df["returns"] = df["close"].pct_change()
df["vol_30d"] = df["returns"].rolling(30).std() * np.sqrt(365)
# Bollinger Bands
df["bb_upper"] = df["sma_20"] + 2 * df["close"].rolling(20).std()
df["bb_lower"] = df["sma_20"] - 2 * df["close"].rolling(20).std()
# Rolling correlation between two assets
df["corr_btc_eth"] = df["btc_returns"].rolling(60).corr(df["eth_returns"])
ہر تاجر کو جو کلیدی رولنگ حسابات جاننے چاہیے:
- Simple Moving Average (SMA) — N دورانیوں پر برابر وزنی اوسط۔ پیچھے رہ جانے والی مگر مستحکم۔
- Exponential Moving Average (EMA) —
.ewm()کے ذریعے حالیہ ڈیٹا کو زیادہ وزن دیتی ہے۔ قیمت کی تبدیلیوں کے لیے زیادہ حساس۔ - رولنگ اتار چڑھاؤ — ایک ونڈو پر returns کا معیاری انحراف، سالانہ کیا گیا۔ پوزیشن سائزنگ اور رسک بجٹس کے لیے ضروری۔
- رولنگ باہمی تعلق — پیمائش کرتا ہے کہ دو اثاثے وقت کے ساتھ کیسے ساتھ حرکت کرتے ہیں۔ پورٹ فولیو تنویع کے لیے اہم۔
GaiaEx جیسے پلیٹ فارمز پر، آپ ٹریڈنگ API کے ذریعے تاریخی کینڈل ڈیٹا نکال سکتے ہیں، اسے ایک pandas DataFrame میں لوڈ کر سکتے ہیں، اور ان انڈیکیٹرز کو سیکنڈوں میں کیلکولیٹ کر سکتے ہیں—جبکہ آپ کے اثاثے آپ کے MPC والٹ میں محفوظ رہتے ہیں۔
پورٹ فولیو تجزیے کے لیے GroupBy اور Aggregation
جب آپ متعدد اثاثوں کا انتظام کر رہے ہوں، .groupby() ضروری بن جاتا ہے۔ یہ آپ کو زمرے کے مطابق ڈیٹا کو تقسیم کرنے، حسابات لاگو کرنے، اور نتائج کو یکجا کرنے دیتا ہے—split-apply-combine پیٹرن۔
# DataFrame with multiple assets
trades = pd.DataFrame({
"symbol": ["BTC", "ETH", "BTC", "SOL", "ETH", "BTC"],
"side": ["buy", "buy", "sell", "buy", "sell", "buy"],
"pnl": [120.5, -45.2, 89.0, 210.3, 55.8, -30.1],
"volume": [5000, 3200, 4800, 1500, 2900, 5100],
})
# Performance by asset
summary = trades.groupby("symbol").agg(
total_pnl=("pnl", "sum"),
avg_pnl=("pnl", "mean"),
trade_count=("pnl", "count"),
total_volume=("volume", "sum"),
win_rate=("pnl", lambda x: (x > 0).mean()),
)
print(summary.sort_values("total_pnl", ascending=False))
پورٹ فولیو کام کے لیے اعلیٰ درجے کے aggregation پیٹرنز:
- Multi-level groupby — ہر اثاثے کے لیے لانگ بمقابلہ شارٹ کارکردگی دیکھنے کے لیے symbol اور side کے مطابق گروپ کریں۔
- حسب ضرورت aggregation فنکشنز — ہر اثاثہ گروپ کے لیے شارپ ریشوز، سورٹینو ریشوز، یا میکس ڈرا ڈاؤن کیلکولیٹ کریں۔
- Pivot tables —
pd.pivot_table()استعمال کرتے ہوئے heatmap-دوستانہ فارمیٹ میں اثاثے کے مطابق ماہانہ returns دیکھنے کے لیے ڈیٹا کو ری شیپ کریں۔ - Groupby کے ساتھ Resampling — کئی-اثاثوں کی ٹائم-سیریز تجزیے کے لیے وقت-پر مبنی resampling کو categorical گروپنگ کے ساتھ ملائیں۔
Matplotlib: قیمت کی حرکت اور سگنلز کو چارٹ کرنا
ویژولائزیشن کے بغیر ڈیٹا محض نمبر ہیں۔ Matplotlib آپ کے تجزیے کو ایسے چارٹس میں تبدیل کرتا ہے جو خام ڈیٹا میں غیر مرئی پیٹرنز کو ظاہر کرتے ہیں۔
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
fig, axes = plt.subplots(3, 1, figsize=(14, 10),
sharex=True, gridspec_kw={"height_ratios": [3, 1, 1]})
# Price + Moving Averages
axes[0].plot(df.index, df["close"], label="Close", linewidth=1.2)
axes[0].plot(df.index, df["sma_20"], label="SMA 20", linestyle="--")
axes[0].fill_between(df.index, df["bb_upper"], df["bb_lower"],
alpha=0.1, color="blue", label="Bollinger Bands")
axes[0].set_ylabel("Price (USD)")
axes[0].legend(loc="upper left")
# Volume bars
colors = ["green" if c > o else "red"
for c, o in zip(df["close"], df["open"])]
axes[1].bar(df.index, df["volume"], color=colors, alpha=0.7)
axes[1].set_ylabel("Volume")
# Rolling Volatility
axes[2].plot(df.index, df["vol_30d"], color="purple")
axes[2].set_ylabel("30d Volatility")
axes[2].axhline(y=0.8, color="red", linestyle=":", alpha=0.5)
axes[2].xaxis.set_major_formatter(mdates.DateFormatter("%b %Y"))
plt.tight_layout()
plt.savefig("analysis_dashboard.png", dpi=150)
plt.show()
یہ ایک پروفیشنل تین پینل ڈیش بورڈ پیدا کرتا ہے: اوپر Bollinger Bands کے ساتھ قیمت کی حرکت، درمیان میں حجم، اور نیچے اتار چڑھاؤ۔ یہ لے آؤٹ اس چیز کی عکاسی کرتا ہے جو آپ پروفیشنل ٹریڈنگ ٹرمینلز پر دیکھیں گے۔
شماریاتی ویژولائزیشن کے لیے، seaborn Matplotlib پر اعلیٰ درجے کے فنکشنز کے ساتھ بنایا گیا ہے:
import seaborn as sns
# Return distribution
sns.histplot(df["returns"].dropna(), bins=100, kde=True)
# Correlation heatmap across assets
corr_matrix = portfolio_returns.corr()
sns.heatmap(corr_matrix, annot=True, cmap="RdYlGn", center=0)سب کچھ ملانا: ایک مکمل تجزیاتی پائپ لائن
حقیقی طاقت اس وقت ابھرتی ہے جب آپ ان ٹولز کو ایک دوبارہ قابل استعمال پائپ لائن میں زنجیر کرتے ہیں۔ یہاں ایک ورک فلو ہے جو پروفیشنل کوانٹس روزانہ استعمال کرتے ہیں:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def analyze_asset(symbol: str, df: pd.DataFrame) -> dict:
"""Full analysis pipeline for a single asset."""
df["returns"] = df["close"].pct_change()
df["log_returns"] = np.log(df["close"] / df["close"].shift(1))
return {
"symbol": symbol,
"total_return": (df["close"].iloc[-1] / df["close"].iloc[0]) - 1,
"annual_vol": df["returns"].std() * np.sqrt(365),
"sharpe": df["returns"].mean() / df["returns"].std() * np.sqrt(365),
"max_drawdown": (df["close"] / df["close"].cummax() - 1).min(),
"skewness": df["returns"].skew(),
"kurtosis": df["returns"].kurtosis(),
}
# Analyze multiple assets
results = [analyze_asset(sym, data) for sym, data in assets.items()]
summary = pd.DataFrame(results).set_index("symbol")
print(summary.round(4))
یہ پائپ لائن خام قیمت ڈیٹا لیتی ہے اور ہر اثاثے کے لیے ایک جامع رسک-ریٹرن پروفائل تیار کرتی ہے۔ یہاں سے، آپ ان میٹرکس کو ایک پورٹ فولیو آپٹیمائزر میں کھلا سکتے ہیں، تخصیص کی سفارشات پیدا کر سکتے ہیں، یا ری بیلنسنگ سگنلز ٹرگر کر سکتے ہیں۔
pandas-NumPy-Matplotlib اسٹیک وہ بنیاد ہے جس پر Python مالیات میں باقی سب کچھ تعمیر ہوتا ہے۔ ان تین لائبریریوں پر عبور حاصل کریں اور آپ کے پاس کسی بھی مارکیٹ کا تجزیہ کرنے، کوئی بھی انڈیکیٹر بنانے، اور کسی بھی حکمت عملی کو ویژولائز کرنے کی مہارتیں ہوں گی—چاہے آپ NYSE پر equities ٹریڈ کر رہے ہوں، GaiaEx پر کرپٹو، یا CME پر ڈیریویٹوز۔