top of page

แสกนทั้งตลาดหุ้น หาหุ้นเทพด้วย Python ผ่านข้อมูลจาก Yahoo Finance

Updated: Nov 24, 2022

หนึ่งในปัจจัยที่สำคัญที่สุดสำหรับการลงทุน คือ การเข้าถึงข้อมูล และนำข้อมูลจำนวนมาก มาวิเคราะห์เพื่อให้สามารถตัดสินใจได้อย่างเหมาะสม จะดีกว่าไหมถ้าการเขียน Python ช่วยให้เข้าถึงข้อมูลจำนวนมาก ช่วยให้การวิเคราะห์ข้อมูลเหล่านี้ง่ายขึ้น แบบใช้งานได้จริงทันที และฟรี! ไม่ว่าจะใช้ข้อมูลปัจจัยทางด้าน Technical ที่มีพื้นฐานมาจากเรื่องของการเคลื่อนไหวของราคา หรือปัจจัยทางด้าน Fundamental ที่มีพื้นฐานจากตัวชี้วัดทางการเงินต่างๆ


วันนี้ซิปป้าขอแนะนำ yfinance Library สำหรับการเข้าถึงข้อมูลของหุ้นสาธารณะจาก Yahoo Finance ที่ใช้งานได้ฟรี ง่าย และครบที่สุดตัวหนึ่ง


Disclaimer: *บทความนี้ไม่ได้มีเจตนาในการสนับสนุนให้ทุกคนเชื่อในการตัดสินใจด้วย Technical หรือ Fundamental แต่เป็นการนำเสนอเครื่องมือ Python ที่ช่วยให้ทุกคนสามารถเข้าถึงข้อมูลเพื่อตัดสินใจได้ตามแต่วิจารณญาณส่วนบุคคล **yfinance เป็น Library ที่ไม่ได้เกี่ยวข้องกับ Yahoo Finance โดยตรง แต่เป็นลักษณะของ wrapper หรือชุดคำสั่งที่สร้างครอบการเรียกใช้ api ของ Yahoo Finance อีกที


 

หัวข้อที่อยู่ในบทความนี้



 

yfinance Library


yfinance Library เป็นชุดคำสั่งสำเร็จรูปที่ช่วยให้เราสามารถดึงข้อมูลสาธารณะจาก Yahoo Finance มาได้ด้วยคำสั่งง่ายๆ ช่วยให้เราเข้าถึงข้อมูลทั้งที่เกี่ยวกับราคา และเกี่ยวกับตัวบริษัทที่สนใจ โดย yfinance มีลักษณะเป็นคำสั่งที่เรียกว่า wrapper หรือคำสั่งที่เขียนขึ้น เพื่อเรียกใช้งาน api ที่ใช้คำสั่งซับซ้อนกว่า ช่วยให้เราสามารถใช้งานได้ง่ายขึ้น


ติดตั้ง yfinance

yfinance เป็นชุดคำสั่งที่โดยทั่วไปสามารถติดตั้งผ่าน pip ได้เลย (เรียนรู้เพิ่มเติมเกี่ยวกับการตั้ง Enviroment) โดยการติดตั้งจะทำการดาวน์โหลด Library หรือชุดคำสั่งมาไว้บนเครื่องที่ใช้งานอยู่ ในครั้งถัดไปที่ใช้งานไม่จำเป็นต้องติดตั้งใหม่แล้ว โดย yfinance จะมีคำสั่งที่ต้องใช้งานร่วมกันในเบื้องหลังการทำงาน ได้แก่ pandas, numpy, requests, lxml และตัวมันเอง yfinance ซึ่งจะต้องมีการติดตั้งเพื่อให้สามารถเรียกใช้งาน yfinance ได้ หากไม่เคยมีการติดตั้งมาก่อนจะปรากฎเป็นแถบการดาวน์โหลด และจะหายไปเมื่อดาวน์โหลดติดตั้งเรียบร้อย


!pip install pandas
!pip install numpy
!pip install requests
!pip install lxml
!pip install yfinance
Requirement already satisfied: ...

นำ yfinance มาใช้งาน

สำหรับการนำคำสั่ง yfinance มาใช้หลังติดตั้งแล้ว สามารถทำได้ผ่านการใช้คำสั่ง import เพื่อนำคำสั่งมาใช้งาน และ yfinance จะมีการตั้งชื่อเล่นที่ใช้กันโดยทั่วไปผ่านคำสั่ง as เป็นชื่อว่า yf เมื่อ import เรียบร้อยเราจะได้คำสั่ง yfiance มาใช้ในชื่อว่า yf


import yfinance as yf

 

ข้อมูลหุ้นที่สนใจ


ในการเรียกใช้ข้อมูลหุ้นที่สนใจเราจำเป็นที่จะต้องทราบ ticker ชื่อย่อของหุ้นที่เราต้องการข้อมูลที่อยู่ในระบบของ Yahoo Finance สามารถเช็คผ่านการค้นหาหุ้นที่สนใจผ่านหน้าเวปของ Yahoo Finance ได้เลย โดยหากสนใจเป็นหุ้นไทย ticker ของหุ้นไทยจะตามหลังด้วย .bk เช่น ticker mbk จะต้องใส่เป็น mbk.bk และใช้คำสั่ง .Ticker() ที่รับ ticker ในรูปแบบของ string เพื่อสร้างดึงข้อมูล และสร้างเก็บไว้เพื่อใช้ดึงข้อมูลเพิ่มเติมจากข้อมูลนี้


mbk = yf.Ticker('mbk.bk')

 

ข้อมูลราคาหุ้น


ข้อมูลที่เกี่ยวข้องกับราคาหุ้นสามารถเรียกใช้จากข้อมูลที่ดึงจาก .Ticker() มาแล้วได้ผ่านคำสั่ง .history() ซึ่งเราจะได้ข้อมูลมาเป็นตาราง DataFrame ที่ช่วยให้เรานำข้อมูลในรูปแบบตารางมาใช้ได้ง่ายๆ ผ่านคำสั่งต่างๆ ที่เรียนรู้ได้เพิ่มเติมผ่านการเรียนใช้คำสั่งใน Pandas Library


ปรับแต่งการดึงข้อมูลราคาหุ้น

สำหรับข้อมูลหุ้นที่ได้จากคำสั่ง .history() จะมี parameter ที่น่าสนใจ ที่ช่วยดึงข้อมูลให้ตรงใจได้มากขึ้นดังนี้


  1. interval= กำหนดความถี่ในการดึงข้อมูลเช่น 1m (ข้อมูลราคารายนาที), 1h (ข้อมูลรายชั่วโมง), 1d (ข้อมูลรายวัน), 1mo (ข้อมูลรายเดือน)

  2. start= กำหนดวันที่ดึงข้อมูลที่เก่าที่สุด

  3. end= กำหนดวันที่ดึงข้อมูลที่ใหม่ที่สุด


ซึ่งการกำหนดวันเราจะกำหนดในรูปแบบนี้ yyyy-mm-dd และตัวอย่างจะกำหนดรายละเอียดการดึงข้อมูลรายวันจาก วันที่ 1 เดือน 1 ปี 2022 จนถึงวันที่ 23 เดือน 11 ปี 2022 จะกำหนดรายละเอียดตามนี้


interval = '1d'
start = '2022-1-1'
end = '2022-11-23'

ดึงราคาหุ้นด้วย .history()

เมื่อกำหนดรายละเอียดการดึงข้อมูลเรียบร้อย นำข้อมูลมาใส่คำสั่ง .history() ที่ทำงานกับข้อมูลหุ้น เราจะได้ผลลัพธ์เป็นข้อมูลหุ้นที่พร้อมใช้งานในรูปแบบของ DataFrame


mbk_price_df = mbk.history(interval='1d',start=start,end=end)
mbk_price_df

 

ข้อมูลงบกำไรขาดทุน


งบกำไรขาดทุนเป็นรายงานที่รวบรวมข้อมูลเกี่ยวกับรายได้ และรายจ่าย เพื่อคำนวณให้เห็นกำไร หรือยอดขาดทุนสำหรับการดำเนินงานในช่วง 1 ระยะเวลาทางบัญชี ซึ่งเป็นงบที่แสดงให้เห็นความสามารถทางการทำกำไร หรือใช้ชี้วัดประสิทธิภาพการทำงานของบริษัทเพื่อสร้างกำไรให้ผู้ถือหุ้น สำหรับข้อมูลทางการเงินสามารถเรียกดูได้จากตัวข้อมูลหุ้นผ่านคำสั่ง .financials


mbk.financials

 


ข้อมูลงบดุล


งบดุลเป็นรายงานที่เทียบให้เห็นการนำทุนไปใช้งานซึ่งทุนจะประกอบไปด้วย 2 ฝั่ง คือทุนจากเจ้าของ หรือส่วนของผู้ถือหุ้น และทุนจากการกู้ยืม โดยงบดุลจะเปรียบเทียบให้เห็นสินทรัพย์ และทุนที่ใช้งาน แสดงให้เห็นโครงสร้างของเงินทุน และการนำทุนไปใช้เพื่อสร้างทรัพย์สินที่เป็นที่มาของรายได้อีกที ข้อมูลงบดุลเรียกดูได้ผ่านคำสั่ง .balancesheet


mbk.balancesheet

 


ข้อมูลงบกระแสเงินสด


งบกระแสเงินสดเป็นรายงานแสดงกระแสเงินที่ไหลเข้า และออกจากบริษัท ข้อแตกต่างของงบกระแสเงินสด กับงบกำไรขาดทุนหลักๆ คือ งบกำไรขาดทุนดูที่รายได้ เทียบกับรายจ่าย ในขณะที่งบกระแสเงินสดดูที่เงินเข้า และเงินออกจากบริษัท ข้อแตกต่างที่เกิดขึ้นเกิดขึ้นเพราะหลายรายการเงินเข้า และเงินออก ไม่นับเป็นรายได้ และรายจ่าย และเช่นเดียวกัน หลายรายการที่เป็นรายได้ และรายจ่าย อาจยังไม่ได้เกิดเป็นกระแสเงินสดจริง งบกระแสเงินสดสามารถใช้คำสั่ง .cashflow เรียกใช้ได้ทันที


mbk.cashflow

 

เข้าถึงข้อมูลของหุ้นทุกตัวในตลาด SET


เมื่อเราสามารถดึงข้อมูลของหุ้นที่ต้องการได้แล้ว เราจะลองทำการดึงข้อมูลของหุ้นในตลาด SET ทั้งหมด มาเพื่อเปรียบเทียบหาหุ้นตัวที่สนใจตามการคัดเลือกจากค่าต่างๆ ที่เราต้องการ


รายชื่อหุ้นทั้งหมดของ SET ซิปป้าได้ทำการทำ Web Scraping เก็บตัว Ticker ที่มีทั้งหมดจากเวปของ SET และเตรียมเอาไว้ด้านล่างเผื่อท่านใดสนใจนำข้อมูลนี้ไปต่อยอดสำหรับการใช้งาน

คลิกเพื่อดู Ticker ทั้งหมดของหุ้นในตลาด SET


all_ticker_list = ['EE.bk',..., 'TWZ.bk']

นำทุก ticker มาถึงข้อมูลงบกำไรขาดทุนทั้งหมด

เมื่อได้ ticker ต่างๆ ที่ต้องการนำมาใช้ดึงข้อมูลที่ต้องการแล้ว เราจะนำ ticker ที่ได้มา มาดึงข้อมูลงบต่างๆ ที่ต้องการ ซึ่งในตัวอย่างนี้เราจะดึงงบกำไรขาดทุนของหุ้นทั้งหมดออกมา เพื่อทำการกรองดูบริษัทที่มีกำไร


all_financials = []
for ticker in all_ticker_list:
    financials_dict = dict()
    financials_dict[ticker] = yf.Ticker(ticker).financials
    all_financials.append(financials_dict)


ทำงานกับข้อมูลของทุกหุ้น

ในตัวอย่างวันนี้เราจะทำการกรองจากหุ้นทั้งหมดให้เหลือเฉพาะหุ้นที่ในรอบบัญชีล่าสุดมีกำไร และกรองหุ้นที่ขาดทุนออก ทำได้ผ่านการเข้าไปทำงานกับข้อมูลทุกหุ้นที่เก็บมา และนำข้อมูลจากงบกำไรขาดทุนในส่วนของ Net Income มาเปรียบเทียบกับ 0 หากมากกว่าแสดงว่ามีกำไร และทำการเก็บรายชื่อหุ้นนั้นออกมา


all_selected = []
for fi in all_financials:
    fi_key = list(fi.keys())[0]
    fi_value = list(fi.values())[0]
    try:
        if fi_value.iloc[:,0]['Net Income'] > 0:
            all_selected.append(fi_key)
    except:
        pass

เราจะได้ข้อมูล ticker หุ้นที่ตรงตามเงื่อนไขที่ต้องการ จะเห็นว่าจาก ticker ทั้งหมด 673 ตัว จะเหลือ ticker 504 ตัวที่มีข้อมูลในระบบของ Yahoo Finance แจ้งว่ามีกำไรในงบปีล่าสุด


print(len(all_financials))
print(len(all_selected))
673
504

 

โอกาสของการเล่นหุ้นด้วย Python


การเขียนโค้ดช่วยให้เข้าถึงข้อมูลจำนวนมากได้ง่ายขึ้น เพียงแค่เขียนคำสั่งไม่กี่บรรทัดก็สามารถเรียกหาข้อมูลจากแหล่งที่น่าเชื่อถือได้ง่ายๆ บวกกับความสามารถในการออกแบบคำสั่งให้สามารถทำซ้ำๆ ดึงข้อมูลหลายตัว สร้างเงื่อนไขกรองข้อมูลได้ ช่วยให้การปรับใช้ Python ทำให้เราสามารถสร้างเครื่องมือที่ช่วยวิเคราะห์ข้อมูลจำนวนมากได้ง่ายๆ แถมฟรีอีกต่างหาก!


เพิ่มเติมทิ้งท้าย


สำหรับใครที่สนใจตรงนี้จริงจัง แนะนำให้นำข้อมูลที่ดึงมาบันทึกลงไฟล์เช่น Excel เก็บไว้เพื่อที่จะได้ไม่ต้องโหลดใหม่ทุกครั้งเพื่อประหยัดเวลา และจากที่ผมทดลองใช้ เมื่อนำไปใช้งานจริง ควรสุ่มตรวจข้อมูลเบื้องต้นเพื่อเช็คความถูกต้องกับแหล่งอื่นด้วย

 

เรียนพื้นฐานการทำงานกับมูลตาราง จนถึงนำมาวิเคราะห์ข้อมูลหุ้นตรงนี้ได้


แอดซิปป้าขอฝากคอร์ส Excel Automation with Python ที่จะรวบรวมคำสั่งสำคัญของ Pandas ที่ใช้เพื่อจัดการข้อมูลตั้งแต่เปิดไฟล์ จัดการ วิเคราะห์ จนถึงการนำข้อมูลมาเรียบเรียงกันให้อยู่ในรูปที่ใช้งานได้ง่าย เพื่อให้การทำงานกับข้อมูลเป็นอัตโนมัติมากขึ้น นำข้อมูลมาใช้ประโยชน์ได้มากขึ้น



6,606 views1 comment

1 Comment


VA NA
VA NA
Apr 22

yahoo finance ตั้งแต่ช่วงต้นปีมานี้ ราคาหุ้นไทย (.BK) ผิดปกติหลายตัวมาก บางวันราคาตรง บางวันไม่ตรง สังเกตว่าถ้าดูจากเว็บต้นทางของ yahoo แล้ววันไหนที่ไม่มีข้อมูล Volume (ทั้งๆที่จริงถ้าดูจากเว็บอื่นจะมี) วันนั้นราคาจะไม่อัพเดท ผมส่งเมลแจ้งไปทาง yahoo หลายครั้งแล้ว แต่เขาก็ไม่แก้อะไรเลย ถ้าจะ Source นี้ดึงข้อมูลก็อย่าลืมสังเกตความผิดปกติดีๆด้วยนะครับ

Like
bottom of page