ตรวจจับราคาหุ้นผิดปกติด้วย Python



 📊 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 | ราคาถูกเกินไปมาก (จุดพิจารณาเข้าซื้อทางสถิติ) |


---

*เอกสารนี้จัดทำเพื่อการศึกษาทางด้านการเขียนโปรแกรมและการใช้เครื่องมือทางสถิติเท่านั้น ไม่ใช่คำแนะนำในการลงทุน*

ความคิดเห็น