เขียนโค้ดไพธอน ดึงข้อมูลเปรียบเทียบ "อัตราปันผล" Dividend Yield



 เขียนโค้ดไพธอน ดึงข้อมูลเปรียบเทียบ "อัตราปันผล" Dividend Yield ของหุ้นไทย VS หุ้นสหรัฐฯ 

หุ้นไทย (High Yield & Stable)

หุ้นไทยในกลุ่มธนาคารและอสังหาริมทรัพย์มักให้ปันผลที่สูงมาก:

TISCO (บมจ.ทิสโก้ไฟแนนเชียลกรุ๊ป): ตัวท็อปเรื่องปันผล (Yield ~7-8%) จ่ายปีละครั้งสม่ำเสมอ

SCB (เอสซีบี เอกซ์): กลุ่มธนาคารที่มีนโยบายจ่ายปันผลสูง (Yield ~6-7%)

LH (แลนด์แอนด์เฮ้าส์): กลุ่มอสังหาฯ ที่จ่ายปันผลค่อนข้างดีและต่อเนื่อง (Yield ~6-7%)

AP / SPALI: หุ้นอสังหาฯ ที่มี Yield สูงระดับ 6% ขึ้นไป


หุ้นสหรัฐฯ มักไม่เน้น Yield ที่สูงปรี๊ด แต่เน้น "การเติบโตของเงินปันผล" ทุกปี:

Verizon (VZ): หุ้นสื่อสารขนาดใหญ่ ปันผลสูง (Yield ~6.5%)

Realty Income (O): หุ้นกลุ่ม REIT ที่จ่ายปันผล "ทุกเดือน" (Yield ~5-6%)

Coca-Cola (KO) / PepsiCo (PEP): กลุ่ม Dividend Kings ที่เพิ่มเงินปันผลติดต่อกันเกิน 50 ปี (Yield ~2.8% - 3.2%)

Chevron (CVX): กลุ่มพลังงานที่มีกระแสเงินสดดี (Yield ~4.5%)


1. อัปเดต Library ให้เป็นเวอร์ชันล่าสุด

pip install --upgrade yfinance curl_cffi

เมื่อไม่นานมานี้ Yahoo Finance ได้มีการอัปเดตระบบป้องกัน การดึงข้อมูลที่เข้มงวดขึ้น 

ทำให้ไลบรารี yfinance เวอร์ชันเก่าที่ใช้ requests แบบธรรมดาเริ่มดึงข้อมูลไม่ได้

curl_cffi เป็นตัวกลางในการรับส่งข้อมูลแทน เพื่อให้สามารถดึงข้อมูลราคาหุ้นกลับมาได้ตามปกติ


---------------------------------------------------------

# Full Code

import yfinance as yf

import pandas as pd

from curl_cffi.requests import Session


session = Session(impersonate="chrome")


tickers = {

    "TISCO.BK": "TISCO (TH)",

    "SCB.BK": "SCB (TH)",

    "LH.BK": "Land & Houses (TH)",

    "KO": "Coca-Cola (US)",

    "VZ": "Verizon (US)",

    "O": "Realty Income (US)"

}


def get_dividend_data(ticker_list):

    results = []

    for symbol, name in ticker_list.items():

        try:

            stock = yf.Ticker(symbol, session=session)

            info = stock.info

            

            # ดึงค่า Yield

            raw_yield = info.get('dividendYield') or info.get('trailingAnnualDividendYield', 0)

            

            # ปรับจูนตัวเลข (ถ้า Yahoo ส่งมาเกิน 1 แสดงว่าเป็น % มาอยู่แล้ว)

            actual_yield = raw_yield if raw_yield < 1 else raw_yield / 100

            yield_pct = round(actual_yield * 100, 2)

            

            # คำนวณปันผลหลังหักภาษี (ไทย 10%, สหรัฐฯ 15% กรณีทำ W-8BEN)

            tax_rate = 0.10 if ".BK" in symbol else 0.15

            net_yield = round(yield_pct * (1 - tax_rate), 2)

                

# ดึงราคาย้อนหลัง 1 ปี เพื่อดูความคุ้มค่า

            hist = stock.history(period="1y")

            if not hist.empty:

                start_price = hist['Close'].iloc[0]

                end_price = hist['Close'].iloc[-1]

                price_return = round(((end_price - start_price) / start_price) * 100, 2)

            else:

                price_return = 0


            # คำนวณ Total Return (ปันผล + ส่วนต่างราคา)

            total_return = round(yield_pct + price_return, 2)


            results.append({

                "Stock": name,

                "Yield (%)": yield_pct,

                "Price Return 1Y (%)": price_return,

                "Total Return (%)": total_return,

                "Market": "Thailand" if ".BK" in symbol else "USA"  

            })

            print(f"✅ {name} ดึงข้อมูลสำเร็จ")

        except Exception as e:

            print(f"❌ {name} ล้มเหลว: {e}")

            

    return pd.DataFrame(results)


df = get_dividend_data(tickers)

df = df.sort_values(by="Yield (%)", ascending=False)


print("\n--- ตารางเปรียบเทียบปันผล (ปรับปรุงตัวเลข) ---")

print(df.to_string(index=False))


--------------------------------------

ความคิดเห็น