</>
#
WEALTH CODE CURRICULUM

บทที่ 4: Read Market Data
วิเคราะห์ความเสี่ยงและข้อมูลตลาด

"กำไรที่น่าหลงใหล มักซ่อนความเสี่ยงที่โหดร้ายเสมอ"

เรียนรู้การดึงข้อมูลประวัติราคาสินทรัพย์ และคำนวณสถิติความเสี่ยง (Volatility & Drawdown) ด้วย Python

{}

เส้นทางการเรียนรู้ (120 นาที)

10m

CASE

รถไฟเหาะของตลาดหุ้น

20m

CONCEPT

Return, Volatility & Max Drawdown

25m

CODE ALONG

สอน Pandas หาเปอร์เซ็นต์ความเปลี่ยนแปลง

45m

BUILD

สร้าง Market Analysis Dashboard

15m

DEFEND

ทดสอบจำลองวิกฤต (Stress Test)

05m

EXIT

คุณทนความผันผวนได้แค่ไหน?

?
CASE STUDY

รถไฟเหาะของตลาดหุ้น

นาย A นำเงิน 1 ล้าน ไปซื้อหุ้น

เพื่อนบอกว่าหุ้นตัวนี้ได้กำไรเฉลี่ย 15% ต่อปี
เขาจึงนำเงินเก็บทั้งหมดมาลงทุน

วิกฤตมาเยือน (เดือนที่ 6)

เศรษฐกิจพัง หุ้นตกหนัก!
เงิน 1 ล้าน ลดลงเหลือ 600,000 บาท (ขาดทุน 40%)

นาย A ทนไม่ไหว กดขายทิ้งเพื่อรักษาเงิน 6 แสนไว้

ปีต่อมาหุ้นกลับมาฟื้นตัวเป็น 1.2 ล้าน แต่นาย A ขาดทุนไปแล้ว เพราะ "ทนความเสี่ยงไม่ไหว"

%
CONCEPT

กำไร VS ความผันผวน

การลงทุนคือเหรียญสองด้าน เราต้องวัดค่าทั้งสองฝั่งเสมอ

Return (ผลตอบแทน)

คือเปอร์เซ็นต์กำไรหรือขาดทุนจากเงินต้น บ่งบอกว่าสินทรัพย์นั้นเติบโตแค่ไหน

$ Return = \frac{Price_{new} - Price_{old}}{Price_{old}} $

Volatility (ความผันผวน)

คือค่า ส่วนเบี่ยงเบนมาตรฐาน (Standard Deviation) วัดว่าราคาสวิงขึ้นลงรุนแรงแค่ไหน ยิ่งแกว่งมาก ยิ่งเสี่ยงมาก

ความผันผวนสูง = เสี่ยงสูง
&
CONCEPT

จุดวัดใจ: Maximum Drawdown

ความลับที่นักลงทุนมือใหม่มักไม่รู้ คือจุดที่ขาดทุนหนักที่สุด (พอร์ตแดงที่สุด) ในประวัติศาสตร์

MDD (Max Drawdown)

คือเปอร์เซ็นต์ที่พอร์ตตกลงมาลึกที่สุด นับจาก จุดสูงสุดเดิม (Peak) ลงมายัง จุดต่ำสุด (Trough) ก่อนที่มันจะฟื้นตัวกลับไป

"ถ้ารับ Max Drawdown ของสินทรัพย์นั้นไม่ได้ อย่าซื้อ!"

</>
CODE ALONG

คณิตศาสตร์แห่งความเสี่ยงใน Pandas

สร้างไฟล์ lesson4_intro.py และลองใช้คำสั่งสถิติของ Pandas

lesson4_intro.py
import pandas as pd
import numpy as np

# จำลองราคาหุ้นรายเดือน ที่มีราคาตกหนักในเดือนที่ 3 (Drawdown)
prices = [100, 120, 80, 90, 130]
df = pd.DataFrame({"Price": prices})

# 1. pct_change() ใช้หาเปอร์เซ็นต์กำไร/ขาดทุน เทียบกับบรรทัดก่อนหน้า
df["Return"] = df["Price"].pct_change()

# 2. std() ใช้หาความผันผวน (ส่วนเบี่ยงเบนมาตรฐาน)
volatility = df["Return"].std()

print(df)
print(f"\nความผันผวน: {volatility:.4f}")
*
BUILD PROJECT (Step 1/6)

เตรียมข้อมูลตลาดสำหรับ Dashboard

สร้างไฟล์ market_dash.py ในโลกจริงเราจะใช้ `pd.read_csv()` แต่ตอนนี้เราจะจำลองตาราง (Mock Data) ไปก่อนเพื่อความรวดเร็ว

market_dash.py
import streamlit as st
import pandas as pd

st.set_page_config(layout="wide")
st.title("📊 Market Analysis Dashboard")

# --- 1. จำลองข้อมูลราคาสินทรัพย์ (รายเดือน 12 เดือน) ---
# สังเกตว่าในเดือนที่ 6 ราคาจะตกลงอย่างหนัก (จำลองวิกฤต)
data = {
    "Month": list(range(1, 13)),
    "Asset_Price": [100, 105, 110, 115, 120, 80, 70, 75, 85, 95, 110, 125]
}
df = pd.DataFrame(data).set_index("Month")
*
BUILD PROJECT (Step 2/6)

คำนวณ Return และ Volatility

พิมพ์ต่อด้านล่าง: ใช้พลังของ Pandas คำนวณความเสี่ยงของสินทรัพย์นี้

market_dash.py (cont.)
# --- 2. คำนวณความเสี่ยงและผลตอบแทน ---

# หาผลตอบแทนรวม 1 ปี (ราคาเดือน 12 ลบ ราคาเดือน 1) หาร ราคาเดือน 1
total_return = (df["Asset_Price"].iloc[-1] - df["Asset_Price"].iloc[0]) / df["Asset_Price"].iloc[0]

# สร้างคอลัมน์ใหม่ เก็บเปอร์เซ็นต์เปลี่ยนแปลงแบบรายเดือน
df["Monthly_Return"] = df["Asset_Price"].pct_change()

# หาความผันผวน (ความสวิงของราคา)
volatility = df["Monthly_Return"].std()
{}
BUILD PROJECT (Step 3/6)

เจาะลึกอัลกอริทึม Max Drawdown

พิมพ์ต่อด้านล่าง: วิธีหาจุดขาดทุนที่ลึกที่สุด ต้องหา "จุดสูงสุดสะสม" ก่อน แล้วดูว่าราคาปัจจุบันตกลงมาจากจุดนั้นเท่าไหร่

market_dash.py (cont.)
# 1. หาราคาสูงสุดที่เคยทำได้ ตั้งแต่วันแรกจนถึงปัจจุบัน (cummax = Cumulative Max)
df["Peak"] = df["Asset_Price"].cummax()

# 2. หาเปอร์เซ็นต์ที่ตกลงมาจาก Peak ในแต่ละเดือน
df["Drawdown"] = (df["Asset_Price"] - df["Peak"]) / df["Peak"]

# 3. ดึงค่าที่ติดลบหนักที่สุดออกมา (min)
max_drawdown = df["Drawdown"].min()
[]
BUILD PROJECT (Step 4/6)

แสดงผลความเสี่ยง (Metrics)

พิมพ์ต่อด้านล่าง: แบ่งจอเป็น 3 คอลัมน์ และเปลี่ยนค่าทศนิยมเป็นเปอร์เซ็นต์ (*100)

market_dash.py (cont.)
# --- 3. สร้าง UI แสดงผล ---
st.subheader("Key Risk Metrics")

c1, c2, c3 = st.columns(3)

with c1:
    st.metric("📈 1-Year Return", f"{total_return * 100:.2f}%")
with c2:
    st.metric("🌪️ Volatility (ความผันผวน)", f"{volatility * 100:.2f}%")
with c3:
    st.metric("📉 Max Drawdown (จุดขาดทุนสูงสุด)", f"{max_drawdown * 100:.2f}%")
*
BUILD PROJECT (Step 5/6)

วาดกราฟราคา (Area Chart)

พิมพ์โค้ดชุดสุดท้าย: นำคอลัมน์ราคามาวาดกราฟพื้นที่ เพื่อให้เห็นภาพการตกท้องช้าง (Drawdown) ชัดๆ

market_dash.py (cont.)
st.divider()

st.subheader("📈 Price Action & Drawdown")
# ใช้ area_chart จะระบายสีใต้เส้นกราฟให้ด้วย ดูสวยงามขึ้น
st.area_chart(df["Asset_Price"])

# โชว์ตารางข้อมูลดิบ เพื่อความโปร่งใส (Data Dictionary)
with st.expander("🔍 ดูตารางข้อมูลดิบ (Raw Data)"):
    st.dataframe(df, use_container_width=True)

พร้อมแล้ว: ไปที่ Terminal พิมพ์ streamlit run market_dash.py ได้เลย!

*
BUILD PROJECT (Result)

ผลลัพธ์: Market Analysis Dashboard

localhost:8501

📊 Market Analysis Dashboard

Key Risk Metrics

📈 1-Year Return
25.00%
🌪️ Volatility (ความผันผวน)
19.45%
📉 Max Drawdown
-41.67%

📈 Price Action & Drawdown

@
DEFEND

วิเคราะห์พฤติกรรมสินทรัพย์

ดูจาก Dashboard ของเรา ตอบคำถามต่อไปนี้:

  1. สินทรัพย์ตัวนี้ให้กำไร 1 ปีตั้ง 25% ถือว่าน่าสนใจมากใช่ไหม?
  2. แต่มี Max Drawdown ที่ -41.67% แปลว่าถ้านักเรียนเอาเงินเก็บทั้งชีวิต 1 ล้านบาทไปซื้อ ในระหว่างปี เงินของนักเรียนจะหดลงเหลือเท่าไหร่?

    คำตอบ: หดเหลือ 583,300 บาท!

  3. คำถามสำคัญ: นักเรียนคิดว่าตัวเองจะ "ทน" เห็นเงินหายไป 4 แสนกว่าบาทโดยไม่ตกใจขายทิ้ง (เหมือนนาย A) ได้หรือไม่?
%
EXIT

Risk and Reward

"High Risk, High Return"

กำไรที่สูง ย่อมแลกมาด้วยจุดขาดทุนสูงสุด (Max Drawdown) ที่ลึกเสมอ
ถ้าเราเลือกสินทรัพย์ที่ผันผวนน้อย (เช่น พันธบัตร)
เราจะนอนหลับสบาย แต่เป้าหมายอาจจะถึงช้า

"ในบทต่อไป เราจะเรียนรู้วิธีเอาสินทรัพย์เสี่ยงสูง มาผสมกับสินทรัพย์เสี่ยงต่ำ
เรียกว่าการจัดพอร์ต (Portfolio Allocation) เพื่อรักษาสมดุล!"