</>
#
WEALTH CODE CURRICULUM

บทที่ 5: Design a Portfolio
ศาสตร์แห่งการผสมสินทรัพย์

"อย่านำไข่ทุกใบ ไปใส่ไว้ในตะกร้าใบเดียวกัน"

เรียนรู้การจัดสรรเงินลงทุน (Asset Allocation) คำนวณผลตอบแทนถ่วงน้ำหนักด้วย Python เพื่อสร้างพอร์ตที่ทนทานต่อวิกฤต

{}

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

10m

CASE

พังเพราะหุ้นตัวเดียว (All-in Risk)

20m

CONCEPT

Asset Allocation & Weighted Return

25m

CODE ALONG

คณิตศาสตร์ของการผสมสัดส่วนน้ำหนัก

45m

BUILD

สร้าง Portfolio Simulator Dashboard

15m

DEFEND

ทำไมสัดส่วนพอร์ตถึงเบี้ยว? (Rebalancing)

05m

EXIT

The Holy Grail of Investing

?
CASE STUDY

เดิมพันหมดหน้าตัก (All-in Risk)

นาย A ซื้อหุ้น 100%

คาดหวังกำไรสูงสุด แต่เมื่อเกิดวิกฤต หุ้นตกลง -40%
พอร์ตของเขา ติดลบ -40% เต็มๆ (ทนไม่ไหว ขายทิ้ง)

นาย B ซื้อหุ้น 50% / พันธบัตร 50%

วิกฤตเดียวกัน หุ้นตก -40% แต่พันธบัตรบวก +5%
พอร์ตของเขา ติดลบแค่ -17.5% (ยังพอนอนหลับสบาย)

การผสมสินทรัพย์ (Diversification) คือ "เสื้อเกราะกันกระสุน" ของนักลงทุน

%
CONCEPT

ผลตอบแทนของพอร์ต (Weighted Return)

พอร์ตจะเติบโตแค่ไหน ขึ้นอยู่กับ "สัดส่วนน้ำหนัก (Weight)" ที่เราแบ่งเงินไปซื้อสินทรัพย์นั้นๆ

$$ R_{port} = (W_{stock} \times R_{stock}) + (W_{bond} \times R_{bond}) $$
R (Return): ผลตอบแทนของสินทรัพย์
W (Weight): สัดส่วนน้ำหนัก (รวมกันต้องได้ 1.0 หรือ 100%)

ตัวอย่าง: หุ้นกำไร 10% (ลงเงิน 60%) + พันธบัตรกำไร 2% (ลงเงิน 40%)
พอร์ตจะได้กำไร = (0.60 * 10) + (0.40 * 2) = 6.8%

</>
CODE ALONG

คณิตศาสตร์ของการจัดพอร์ต (Python)

สร้างไฟล์ lesson5_intro.py เรามาลองเขียนสูตรถ่วงน้ำหนักด้วย Python กัน

lesson5_intro.py
# 1. กำหนดผลตอบแทน (Return) ของแต่ละสินทรัพย์
r_stock = 10.0 # หุ้นกำไร 10%
r_bond = 2.0 # พันธบัตรกำไร 2%

# 2. กำหนดสัดส่วนน้ำหนัก (Weight) ให้รวมกันได้ 1.0 เสมอ
w_stock = 0.60 # ลงทุนหุ้น 60%
w_bond = 1.0 - w_stock # ส่วนที่เหลือ 40% ให้พันธบัตร

# 3. คำนวณผลตอบแทนพอร์ตโดยรวม (Weighted Sum)
port_return = (w_stock * r_stock) + (w_bond * r_bond)
print(f"ผลตอบแทนพอร์ต: {port_return:.2f}%")
*
BUILD PROJECT (Step 1/5)

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

สร้างไฟล์ portfolio_sim.py แล้วจำลองข้อมูลผลตอบแทนรายปี 5 ปี

portfolio_sim.py
import streamlit as st
import pandas as pd

st.set_page_config(layout="wide")
st.title("⚖️ Portfolio Simulator")

# --- 1. เตรียมข้อมูลผลตอบแทนรายปี (Yearly Return %) ---
# สังเกตว่าหุ้นผันผวนสูง (มีบวกเยอะ มีติดลบหนัก) แต่พันธบัตรจะนิ่งๆ
data = {
    "Year": [2020, 2021, 2022, 2023, 2024],
    "Stock_Return": [15.0, 20.0, -18.0, 12.0, 25.0],
    "Bond_Return": [2.0, 1.5, -5.0, 3.0, 4.0]
}
df = pd.DataFrame(data).set_index("Year")
*
BUILD PROJECT (Step 2/5)

สร้าง Slider รับค่าสัดส่วนน้ำหนัก

พิมพ์ต่อด้านล่าง: ให้ผู้ใช้งานเลื่อน Slider เพื่อเลือกน้ำหนักหุ้น (0-100%)

portfolio_sim.py (cont.)
# --- 2. รับค่า Asset Allocation จากผู้ใช้ ---
st.subheader("⚙️ ปรับสัดส่วนพอร์ต (Asset Allocation)")

# ใช้ slider รับค่า 0 ถึง 100 (ตั้งค่าเริ่มต้นที่ 60)
stock_pct = st.slider("น้ำหนักหุ้น (Stocks %)", 0, 100, 60)

# คำนวณหาน้ำหนักของพันธบัตรอัตโนมัติ (และแปลงเป็นทศนิยมเพื่อใช้คูณ)
bond_pct = 100 - stock_pct
w_stock = stock_pct / 100
w_bond = bond_pct / 100

st.write(f"สัดส่วนปัจจุบัน: หุ้น **{stock_pct}%** | พันธบัตร **{bond_pct}%**")
{}
BUILD PROJECT (Step 3/5)

คำนวณผลตอบแทนพอร์ตทั้ง 5 ปี

พิมพ์ต่อด้านล่าง: ใช้ Pandas สร้างคอลัมน์ใหม่ที่นำน้ำหนักไปคูณกับผลตอบแทน

portfolio_sim.py (cont.)
# --- 3. คำนวณผลตอบแทนของพอร์ตในแต่ละปี ---
# Pandas เก่งมาก! แค่พิมพ์บรรทัดเดียว มันจะคูณและบวกให้ทุกปีอัตโนมัติ
df["Portfolio_Return"] = (df["Stock_Return"] * w_stock) + (df["Bond_Return"] * w_bond)

# คำนวณสถิติเพื่อนำไปโชว์ (ค่าเฉลี่ยรายปี และความผันผวน)
avg_port_ret = df["Portfolio_Return"].mean()
vol_port = df["Portfolio_Return"].std()

# หาปีที่พอร์ตติดลบหนักที่สุด (Min Return) เพื่อจำลองเป็น Max Drawdown คร่าวๆ
worst_year = df["Portfolio_Return"].min()
[]
BUILD PROJECT (Step 4/5)

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

พิมพ์ต่อด้านล่าง: นำสถิติที่คำนวณไว้มาแสดงเป็นตัวเลขบนหน้า Dashboard

portfolio_sim.py (cont.)
# --- 4. สร้าง UI แสดงผลสถิติ ---
st.divider()
st.subheader("📊 สถิติของพอร์ตฟอลิโอ (เฉลี่ย 5 ปี)")

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

with c1:
    st.metric("📈 Average Yearly Return", f"{avg_port_ret:.2f}%")
with c2:
    st.metric("🌪️ Volatility (ความผันผวน)", f"{vol_port:.2f}%")
with c3:
    st.metric("📉 Worst Year (ปีที่แย่ที่สุด)", f"{worst_year:.2f}%")
*
BUILD PROJECT (Step 5/5)

เปรียบเทียบกราฟ (Bar Chart)

พิมพ์โค้ดชุดสุดท้าย: นำข้อมูลรายปีมาพลอตกราฟแท่งเพื่อดูว่า พอร์ตของเราผันผวนน้อยกว่าหุ้นล้วนๆ จริงไหม?

portfolio_sim.py (cont.)
# --- 5. วาดกราฟเปรียบเทียบ ---
st.subheader("📈 ผลตอบแทนรายปี: พอร์ตผสม VS หุ้น 100%")

# เลือกเฉพาะคอลัมน์ที่ต้องการไปวาดกราฟแท่ง
st.bar_chart(df[["Stock_Return", "Portfolio_Return"]])

# โชว์ตารางข้อมูลดิบ
with st.expander("🔍 ดูข้อมูลตาราง"):
    st.dataframe(df, use_container_width=True)

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

*
BUILD PROJECT (Result)

ผลลัพธ์: Portfolio Simulator

localhost:8501

⚖️ Portfolio Simulator

⚙️ ปรับสัดส่วนพอร์ต (Asset Allocation)

น้ำหนักหุ้น (Stocks %)
60

สัดส่วนปัจจุบัน: หุ้น 60% | พันธบัตร 40%


📊 สถิติของพอร์ตฟอลิโอ (เฉลี่ย 5 ปี)

📈 Average Yearly Return
9.60%
🌪️ Volatility
11.83%
📉 Worst Year
-12.80%

📈 ผลตอบแทนรายปี: พอร์ตผสม VS หุ้น 100%

@
DEFEND

สัดส่วนที่บิดเบี้ยวตามกาลเวลา

สมมติเราจัดพอร์ต หุ้น 50% : พันธบัตร 50% และปล่อยทิ้งไว้ 3 ปี...

ปีที่ 3 หุ้นขึ้นเอาๆ

มูลค่าหุ้นโตไวมาก จนสัดส่วนพอร์ตกลายเป็น หุ้น 70% : พันธบัตร 30% โดยที่เราไม่ได้ทำอะไรเลย

ปัญหา: พอร์ตเรากำลังเสี่ยงกว่าที่ตั้งใจไว้! ถ้าปีที่ 4 หุ้นตกหนัก เราจะเจ็บหนัก

การ Rebalancing

การ ปรับสมดุลพอร์ต ขายสิ่งที่กำไรเยอะ (หุ้น) ไปซื้อสิ่งที่ลดลง (พันธบัตร) เพื่อดึงสัดส่วนกลับมาที่ 50:50 ตามเดิม

"ซื้อถูก ขายแพง อย่างเป็นระบบโดยอัตโนมัติ"

%
EXIT

The Holy Grail of Investing

"จอกศักดิ์สิทธิ์ของการลงทุน"

Ray Dalio ผู้จัดการกองทุนที่ใหญ่ที่สุดในโลก กล่าวไว้ว่า:
กุญแจสำคัญคือการหา สินทรัพย์ที่เคลื่อนไหวไม่พร้อมกัน 15-20 ตัว
มาผสมกัน มันจะช่วยลดความเสี่ยงลงได้เกือบ 80% โดยที่ผลตอบแทนไม่ลดลงเลย!

"ในบทต่อไป เราจะใช้ Python ตรวจสอบข้อมูลย้อนหลัง (Backtesting)
เพื่อพิสูจน์ว่ากลยุทธ์การลงทุนของเรา ใช้งานได้จริงในอดีตหรือไม่!"