📊 Workshop: สร้างระบบ Dashboard ตรวจจับราคาหุ้นผิดปกติด้วย Python (Z-Score Anomaly Detection)
เอกสารชุดนี้จะพาคุณสร้างเครื่องมือวิเคราะห์หุ้นที่ใช้หลักสถิติ **The 99.7% Rule** มาช่วยตัดสินใจว่าราคาหุ้นในปัจจุบัน "ถูกเกินไป" หรือ "แพงเกินไป" เมื่อเทียบกับค่าเฉลี่ยในอดีต
---
### 1. การเตรียมสภาพแวดล้อม (Prerequisites)
ก่อนเริ่ม ตรวจสอบให้แน่ใจว่าได้ติดตั้ง Library ที่จำเป็นผ่าน Terminal/Command Prompt:
```bash
pip install yfinance pandas matplotlib
```
---
### 2. โครงสร้างโค้ดฉบับสมบูรณ์ (Complete Code)
คัดลอกโค้ดด้านล่างนี้ไปวางในไฟล์ `.py` (เช่น `stock_dashboard.py`) เพื่อสร้างระบบ Dashboard
```python
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
# --- ส่วนที่ 1: ตั้งค่าและดึงข้อมูล ---
symbol = "TSLA" # เปลี่ยนชื่อหุ้นที่ต้องการวิเคราะห์ที่นี่
data = yf.download(symbol, period="1y")
# เตรียมตารางข้อมูล (Handle Multi-index)
df = pd.DataFrame()
df['Close'] = data['Close'].iloc[:, 0] if isinstance(data['Close'], pd.DataFrame) else data['Close']
# --- ส่วนที่ 2: การคำนวณทางสถิติ (The Z-Score Logic) ---
window = 20 # ใช้ค่าเฉลี่ยย้อนหลัง 20 วัน
df['Mean'] = df['Close'].rolling(window=window).mean()
df['Std'] = df['Close'].rolling(window=window).std()
# สูตรคำนวณ Z-Score: (ราคาปัจจุบัน - ค่าเฉลี่ย) / ส่วนเบี่ยงเบนมาตรฐาน
df['Z-Score'] = (df['Close'] - df['Mean']) / df['Std']
df_clean = df.dropna()
# --- ส่วนที่ 3: การสร้าง Dashboard แสดงผล ---
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10), sharex=True,
gridspec_kw={'height_ratios': [2, 1]})
# กราฟบน: ราคาหุ้นและการเคลื่อนไหว
ax1.plot(df_clean.index, df_clean['Close'], label='ราคาหุ้น (Price)', color='#2980b9')
ax1.plot(df_clean.index, df_clean['Mean'], label='ค่าเฉลี่ย 20 วัน', color='#e67e22', linestyle='--')
ax1.set_title(f'Stock Dashboard: {symbol}', fontsize=16)
ax1.legend()
# กราฟล่าง: ดัชนีวัดความผิดปกติ (Z-Score Indicator)
ax2.plot(df_clean.index, df_clean['Z-Score'], color='#8e44ad', label='Z-Score')
# วาดเส้นแบ่งโซนสถิติ
ax2.axhline(y=0, color='black', alpha=0.3)
ax2.axhline(y=2, color='orange', linestyle='--') # โซนเริ่มผิดปกติ
ax2.axhline(y=-2, color='orange', linestyle='--')
ax2.axhline(y=3, color='red', linestyle=':') # โซนวิกฤต/โอกาสทอง
ax2.axhline(y=-3, color='red', linestyle=':')
# ระบายสี Highlight เพื่อให้ดูง่าย
ax2.fill_between(df_clean.index, 2, 3, color='orange', alpha=0.2, label='Warning Zone')
ax2.fill_between(df_clean.index, -2, -3, color='orange', alpha=0.2)
ax2.fill_between(df_clean.index, 3, 5, color='red', alpha=0.1, label='Extreme Zone')
ax2.fill_between(df_clean.index, -3, -5, color='red', alpha=0.1)
ax2.set_ylim(-4, 4)
ax2.legend(loc='upper left')
plt.tight_layout()
plt.show()
```
---
### 3. คำอธิบาย: วิธีการอ่านผลลัพธ์ (How to read the Dashboard)
ระบบนี้ใช้หลักการ **Z-Score** เพื่อดูว่าราคาหุ้นปัจจุบันเบี่ยงเบนออกจากค่าเฉลี่ยมากแค่ไหน:
* **Z-Score อยู่ระหว่าง -2 ถึง 2 (โซนปกติ):** ราคาหุ้นมีการเคลื่อนไหวเป็นปกติ ไม่มีความผันผวนที่น่ากังวล
* **Z-Score ทะลุเข้าโซนสีส้ม (เกิน ±2):** ราคาเริ่มสูงหรือต่ำกว่าสถิติปกติ มีโอกาสเกิดการพักตัวหรือรีบาวด์ (โอกาสเกิดขึ้น 5%)
* **Z-Score ทะลุเข้าโซนสีแดง (เกิน ±3):** เป็นสภาวะ **"Panic"** หรือ **"Extreme"** ราคาหุ้นมีความผิดปกติขั้นสุดทางสถิติ ซึ่งมักจะเป็นจุดกลับตัวสำคัญ (โอกาสเกิดขึ้นเพียง 0.15%)
---
### 4. สรุปกลยุทธ์การตัดสินใจ
| ค่า Z-Score | สถานะทางสถิติ | ความหมาย |
| :--- | :--- | :--- |
| **มากกว่า +3.0** | Extreme Overbought | ราคาแพงเกินไปมาก (โอกาสกลับตัวลงสูง) |
| **+2.0 ถึง +3.0** | Overbought Zone | ราคาเริ่มตึงตัว ควรระวังการไล่ราคา |
| **-2.0 ถึง +2.0** | Normal Zone | ราคาเคลื่อนไหวตามปกติ |
| **-2.0 ถึง -3.0** | Oversold Zone | ราคาเริ่มถูกลง มีแรงขายมากเกินไป |
| **น้อยกว่า -3.0** | Extreme Panic | ราคาถูกเกินไปมาก (จุดพิจารณาเข้าซื้อทางสถิติ) |
---
*เอกสารนี้จัดทำเพื่อการศึกษาทางด้านการเขียนโปรแกรมและการใช้เครื่องมือทางสถิติเท่านั้น ไม่ใช่คำแนะนำในการลงทุน*
ความคิดเห็น
แสดงความคิดเห็น