GaiaEx AcademyGaiaEx Academy
การวิเคราะห์ข้อมูลด้วย Pandas, NumPy และ Matplotlib
นักพัฒนาการเขียนโปรแกรม12 min read

การวิเคราะห์ข้อมูลด้วย Pandas, NumPy และ Matplotlib

จัดการ แปลง และแสดงข้อมูลการเงินแบบนักวิเคราะห์เชิงปริมาณ

แชร์โพสต์

NumPy: เครื่องยนต์ที่ซ่อนอยู่ภายใน

การคำนวณทางการเงินที่จริงจังทุกครั้งใน Python สุดท้ายแล้วก็วิ่งผ่าน NumPy ในขณะที่ Python list มีความยืดหยุ่น แต่มันช้า — แต่ละสมาชิกเป็น Python object เต็มรูปแบบที่มี overhead จากการตรวจสอบชนิดข้อมูล NumPy array เก็บตัวเลขดิบไว้ในบล็อกหน่วยความจำที่ต่อเนื่องกัน ทำให้การคำนวณเร็วกว่าลูปแบบ 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 สำหรับงานการเงิน:

  • Vectorized operations — ใช้การคำนวณกับทั้ง array ในครั้งเดียว แทนการวนลูปทีละสมาชิก
  • Broadcasting — จัดแนว array ที่มี shape ต่างกันให้ตรงกันโดยอัตโนมัติสำหรับการคำนวณทางคณิตศาสตร์ (เช่น การลบค่าเฉลี่ยแบบ scalar ออกจากทุกสมาชิก)
  • พีชคณิตเชิงเส้นnp.linalg มีการคูณเมทริกซ์ การแยกค่า eigenvalue และตัวแก้สมการที่ใช้ในการปรับพอร์ตโฟลิโอให้เหมาะสม
  • การสุ่มตัวอย่าง — Monte Carlo simulation, bootstrap sampling และการสร้างแบบจำลองสุ่มทั้งหมดใช้ np.random

เคล็ดลับด้านประสิทธิภาพ: เลือกใช้ NumPy operation แบบ vectorized เสมอ แทนการใช้ for-loop ของ Python การปรับพอร์ตโฟลิโอ 500 สินทรัพย์ให้เหมาะสมที่ใช้เวลา 30 วินาทีด้วยลูป สามารถเสร็จได้ในเวลาไม่ถึง 50 มิลลิวินาทีด้วย NumPy แบบ vectorized — เร็วขึ้น 600 เท่า

NumPy: หน่วยความจำต่อเนื่อง + การคำนวณแบบ vectorized ndarray — dtype, shape, strides (C-contiguous) ลูปเดียวใน C/Fortran ไม่ใช่ Python bytecode นับล้านขั้น broadcasting: จัดแนว shape เพื่อคำนวณแบบ element-wise เช่น returns vector − scalar mean หรือ (n,) กับแถวเมทริกซ์ (n, m) linalg: cov, eig, solve — คณิตศาสตร์พอร์ตโฟลิโออยู่ที่นี่
Array คือทางลัดที่เร็ว broadcasting คือวิธีที่คุณรักษาโค้ดให้อ่านง่ายโดยไม่ต้องใช้ลูป

Pandas: DataFrame สำหรับข้อมูลทางการเงิน

ถ้า NumPy คือเครื่องยนต์ pandas ก็คือแดชบอร์ด มันครอบ NumPy array ไว้ในโครงสร้างที่มีป้ายชื่อและมี index ทำให้การจัดการข้อมูลทางการเงินเป็นเรื่องง่ายและสื่อความหมายได้ชัดเจน

โครงสร้างหลักสองแบบคือ:

  • Series — ข้อมูลหนึ่งคอลัมน์ที่มี index (นึกภาพเป็น time series ของราคาปิด)
  • DataFrame — ตารางของคอลัมน์หลายคอลัมน์ แต่ละคอลัมน์คือ Series ที่ใช้ index ร่วมกัน (นึกภาพเป็นข้อมูลแคนเดิลสติก 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 ของมัน เมื่อ index ของคุณเป็นชนิด datetime แล้ว คุณจะปลดล็อกการคำนวณ time series ที่ทรงพลัง:

# 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()

การคำนวณเหล่านี้จัดการกับความยุ่งเหยิงในความเป็นจริงของข้อมูลทางการเงิน — ช่องว่าง ความแตกต่างของเขตเวลา timestamp ที่ไม่สม่ำเสมอ — คุณจึงมุ่งความสนใจไปที่การวิเคราะห์ได้ แทนที่จะจัดการโครงสร้างข้อมูล

การคำนวณแบบ Rolling: ค่าเฉลี่ยเคลื่อนที่และความผันผวน

การวิเคราะห์ทางการเงินมีลักษณะเป็น windowed โดยธรรมชาติ คุณไม่ค่อยสนใจจุดข้อมูลเดี่ยวโดยลำพัง — บริบทมาจากว่าจุดนั้นสัมพันธ์กับประวัติล่าสุดอย่างไร เมธอด .rolling() ของ pandas คือเครื่องมือหลักของคุณในเรื่องนี้

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"])

การคำนวณ rolling หลักที่เทรดเดอร์ทุกคนควรรู้:

  • Simple Moving Average (SMA) — ค่าเฉลี่ยแบบถ่วงน้ำหนักเท่ากันในช่วง N periods ล่าช้าแต่มั่นคง
  • Exponential Moving Average (EMA) — ให้น้ำหนักกับข้อมูลล่าสุดมากกว่าผ่าน .ewm() ตอบสนองต่อการเปลี่ยนแปลงของราคาได้ไวกว่า
  • Rolling Volatility — ส่วนเบี่ยงเบนมาตรฐานของ returns ในช่วงหน้าต่างหนึ่ง แปลงเป็นรายปี จำเป็นสำหรับการกำหนดขนาดสถานะและงบประมาณความเสี่ยง
  • Rolling Correlation — วัดว่าสินทรัพย์สองตัวเคลื่อนที่ไปด้วยกันอย่างไรเมื่อเวลาผ่านไป สำคัญมากสำหรับการกระจายความเสี่ยงของพอร์ตโฟลิโอ

บนแพลตฟอร์มอย่าง GaiaEx คุณสามารถดึงข้อมูลแคนเดิลย้อนหลังผ่าน trading 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 — จัดกลุ่มตามสัญลักษณ์ และ ฝั่งของสถานะ เพื่อดูผลงานของ long เทียบกับ short ต่อสินทรัพย์
  • ฟังก์ชัน aggregation แบบกำหนดเอง — คำนวณ Sharpe ratio, Sortino ratio หรือ drawdown สูงสุดต่อกลุ่มสินทรัพย์
  • Pivot table — ปรับรูปแบบข้อมูลเพื่อดู returns รายเดือนตามสินทรัพย์ในรูปแบบที่เหมาะกับ heatmap โดยใช้ pd.pivot_table()
  • Resampling ร่วมกับ groupby — รวม resampling แบบอิงเวลาเข้ากับการจัดกลุ่มตามหมวดหมู่ สำหรับการวิเคราะห์ time series ของสินทรัพย์หลายตัว

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)
Pandas → การวิเคราะห์; Matplotlib → ข้อมูลเชิงลึก DataFrame index + columns rolling resample groupby Series metrics returns, vol, Sharpe matplotlib.pyplot — figure, axes, artists price volume indicators seaborn เป็นตัวเลือกเสริม — ใช้ Artist layer เดียวกัน แต่ค่าเริ่มต้นสวยกว่า
Pandas เตรียมตารางข้อมูลที่เป็นระเบียบ Matplotlib นำมันไปวางบนแกนที่คุณอธิบายและแบ่งปันได้

การนำทุกอย่างมารวมกัน: ไปป์ไลน์การวิเคราะห์แบบครบวงจร

พลังจริง ๆ จะปรากฏขึ้นเมื่อคุณเชื่อมเครื่องมือเหล่านี้เข้าเป็นไปป์ไลน์ที่ทำซ้ำได้ นี่คือเวิร์กโฟลว์ที่นักคำนวณเชิงปริมาณอาชีพใช้ทุกวัน:

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 คริปโตบน GaiaEx หรือตราสารอนุพันธ์บน CME