เชื่อว่าหลายคนคงเคยทำบัญชี หรือทำพอร์ต (portfolio) เก็บไว้ติดตามผล การลงทุนให้เป็นปัจจุบัน ลง google sheet กันมาบ้าง กำไรเท่าไหร่ ขาดทุนเท่าไหร่ แต่รู้หรือไม่ เราสามารถดึงข้อมูลมาลงได้แบบที่ไม่ต้องมากรอกเองปวดหัว ตาลายกันทุกรอบที่อัปเดตเลย มาดูกันว่าทำอย่างไร
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้ตอนแรกทำไปลองค้นหา และได้ไอเดียการทำจาก https://ppantip.com/topic/40700908 และลองรวบรวมแล้วทำใหม่ หวังว่าจะเป็นประโยชน์นะครับ
1. วิธีดึงข้อมูลหุ้นสหรัฐ
google มีสูตรที่ดึงข้อมูลหุ้นอยู่แล้วซึ่งสามารถใช้ได้เลย
GOOGLEFINANCE(ticker, [attribute], [start_date], [end_date|num_days], [interval])
ticker เป็นชื่อย่อของหลักทรัพย์ที่ต้องการดูข้อมูล ชื่อย่อของตลาดหลักทรัพย์ ตามด้วย ชื่อย่อของหลักทรัพย์ จริงๆ ชื่อย่อของหลักทรัพย์ อย่างเดียวก็ได้แต่มันจะเลือกให้เองถ้าใช่แค่สหรัฐ ใส่แค่ชื่อหุ้นก็ได้ เช่น ใช้ “NASDAQ:GOOG” แทน“ GOOG”
ตัวอย่าง GOOG โดย NASDAQ
GOOGLEFINANCE("NASDAQ:GOOG", "price")
ได้ผลดังรูป
Ref
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้ชื่อตลาดหลักทรัพย์: https://www.google.com/intl/th/googlefinance/disclaimer/
วิธีใช้แบบเต็มๆ: https://support.google.com/docs/answer/3093281?hl=th
เราก็จะไม่ลืมที่จะลองของไทย และก็พบว่า ตลาดเหล่านี้ดึงไม่ได้ SHA SGX TYO KLSE TSE BKK(SET ของเรานั้นเอง)
ปล.ดึงอัตราแลกเปลี่ยนได้ด้วยนะ
ลองมาปรับตาราง port ดู ให้แสดงหน่วยเป็น บาท
2. วิธีดึงข้อมูลหุ้นไทย
เนื่องจากดึงผ่าน google ไม่ได้เราจึงต้องมาดึงท่าอื่นกันหน่อยโดยการอ่านจากเว็บต่างๆกันแทน
2.1 เว็บ yahoo finance
1.โดยไปที่ Extensions และ Apps Script นำโค้ดไปวาง และบันทึกด้วย
code: **แก้ไขเพิ่มเติมวันที่ 18/4/24
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้function yahooF(ticker) {
const url = `https://finance.yahoo.com/quote/${ticker}?p=${ticker}`;
const res = UrlFetchApp.fetch(url, {
muteHttpExceptions: true
});
const contentText = res.getContentText();
const price = contentText.match(/data-field="regularMarketPrice"[^>]*?data-value="(.*?)"/);
return parseFloat(price[1]);
}
2. หา ticker ของ yahoo finance
https://finance.yahoo.com/
ซึ่งดูได้จากตรงนี้ สังเกตว่าของไทยจะมี .BK ต่อท้าย
ใส่สูตร. ***โดยมันจะบอกว่าไม่รู้จัก กด enter หลังใส่สูตร
Ref
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้https://www.lido.app/tutorials/yahoo-finance-google-sheets
แต่วิธีนี้จะไม่มี DRX และ อื่นๆ เราก็อย่าลดความพยาม
2.2 เว็บ set (https://www.set.or.th/th/home)
เว็บแทนซึ่งก็ทำได้โดยใช้สูตร
IMPORTXML(url, xpath_query, locale)
url: link เว็บ
xpath : คำค้นหา (ที่อยู่ข้อมูลบนเว็บ)
Ref.
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้https://support.google.com/docs/answer/3093342?hl=th
URL หุ้นไทย
SET :
https://www.set.or.th/th/market/product/stock/quote/[ชื่อหุ้น]/price
DRX:
https://www.set.or.th/th/market/product/drx/quote/[ชื่อ DRX]/price
*** จากการใช้งานสักพักพบว่าช่วงก่อนตลาดเปิดเว็บจะไม่แสดงราคาเลยเป็น "-" ถ้าอยากได้แบบเก็บอัพเดตทุกเที่ยงคืนลองรีเควทกันมาได้ครับ
วิธีหา url
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้1. ค้นหาชื่อที่ต้องการบนเว็บ https://www.set.or.th/th/home
2. เลือกและสังเกค url ด้านบน https://www.set.or.th/th/market/product/stock/quote/KBANK/price
เอาชื่อหลักทรัพย์ไปแทนจะได้
url: https://www.set.or.th/th/market/product/stock/quote/[ชื่อหุ้น]/price
xpath ราคาหุ้น = "//div[contains(@class,'stock-info')]”
วิธีหา xpath
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้1. คลิ้กขวา ตรวจสอบที่ราคาหุ้น inspect
2.1 หาชื่อ class [แนะนำ] ดูคำตรง class ที่สื่อถึงความหมาย ในที่นี้คือ stock-info นำไปใช้ "//div[contains(@class,'stock-info')]”
รูป 2.2 หา xpath ตรงๆ คลิ๊กขวา คัดลอก XPath
จะได้
=importxml("https://www.set.or.th/th/market/product/stock/quote/AOT/price","//div[contains(@class,'stock-info')]")
ผลลัพธ์:
3. วิธีดึงข้อมูลราคาทอง
ดึงจากสมาคมทองไทย
https://www.goldtraders.or.th/
ใช้วิธี IMPORTXML เหมือนเดิม
=importxml("https://www.goldtraders.or.th/","//span[@id='DetailPlace_uc_goldprices1_lblBLBuy']")
4. ดึงข้อมูลราคากองทุน
ผ่าน settrade.in.th
url:
https://www.settrade.com/th/home
หุ้นไทยก็แล้ว แลัวกองทุนละดึงยังไง ไม่รอช้าเราก็ลอง IMPORTXML ก่อน จะได้ค่าว่างมา 555 เพราะเว็บใช้ javascript ในการแสดงผลจึงต้องท่ายากกันหน่อย
ใช้การสร้าง app script เหมือน yahoo ต้องเขียนโค้ดกันหน่อย แต่ทำมาแล้วไม่ต้องห่วง copy paste ได้เลย
โดยไปที่ Extensions และ Apps Script ใส่ code และกดบันทึก
***มีการแก้ไขเป็น setMutualfundInfo
function getField(field, contentText, input, result) {
const regexPattern = new RegExp(`${field}:([\\w\\$]+)`);
// find nav variable
const matchAnswer = contentText.match(regexPattern);
const ansChar = matchAnswer[1]
//find index variable
const index = input.findIndex(ans => ans === ansChar)
return result[index]
}
function setMutualfundInfo(ticker) {
const url = `https://www.settrade.com/th/mutualfund/quote/${ticker}/overview`;
const res = UrlFetchApp.fetch(url, {
muteHttpExceptions: true
});
const contentText = res.getContentText();
// get all variable ["a","b",...]
const matchInput = contentText.match(/window\.__NUXT__=\(function\(([^)]*)\)/);
const input = matchInput[1].split(',')
//get all value. [10.5,"KSAM"]
const matchResult = contentText.match(/}}\(([\s\S]*?)(?=\)\);)/);
const result = JSON.parse('[' + matchResult[1].replace(/(?<=,)(\.)(?=\d)/g, '0$1') + ']');
const navPerUnit = getField("navPerUnit", contentText, input, result)
return navPerUnit
}
2. ใช้งาน
ไหนๆทำขนาดนี้แล้ว ขอทำแยกแล้วเอาผลมารวมกันเลยได้ไหม ใช้สูตร เพื่อนำข้อมูลจากหน้าชีตอื่นๆมารวม และใส่สูตรคำนวณสัดส่วน จะได้ดังภาพ
แจกหน่อยเผื่อคนอยากเอาไปใช้งาน
Google Sheet:docs.google.com/spreadsheets/d/1BnFX2Kub-BevVBlykHwgG9JT8Qw0-nB_oST17y1IlaM/copy
ใครมีไอเดียแนะนำ แลกเปลี่ยนกันได้เลยครับ
ฝากติดตามด้วยนะครับ
https://www.facebook.com/my.money.toolkit
ตอนนี้มีเวอร์ชั่นดึงกราฟหุ้นสหรัฐด้วยครับ
https://ppantip.com/topic/42446965
วิธีดึงข้อมูลราคาหุ้น Google sheet แถม Investment Portfolio
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
1. วิธีดึงข้อมูลหุ้นสหรัฐ
google มีสูตรที่ดึงข้อมูลหุ้นอยู่แล้วซึ่งสามารถใช้ได้เลย
ticker เป็นชื่อย่อของหลักทรัพย์ที่ต้องการดูข้อมูล ชื่อย่อของตลาดหลักทรัพย์ ตามด้วย ชื่อย่อของหลักทรัพย์ จริงๆ ชื่อย่อของหลักทรัพย์ อย่างเดียวก็ได้แต่มันจะเลือกให้เองถ้าใช่แค่สหรัฐ ใส่แค่ชื่อหุ้นก็ได้ เช่น ใช้ “NASDAQ:GOOG” แทน“ GOOG”
ตัวอย่าง GOOG โดย NASDAQ
ได้ผลดังรูป
Ref
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
เราก็จะไม่ลืมที่จะลองของไทย และก็พบว่า ตลาดเหล่านี้ดึงไม่ได้ SHA SGX TYO KLSE TSE BKK(SET ของเรานั้นเอง)
ปล.ดึงอัตราแลกเปลี่ยนได้ด้วยนะ
ลองมาปรับตาราง port ดู ให้แสดงหน่วยเป็น บาท
2. วิธีดึงข้อมูลหุ้นไทย
เนื่องจากดึงผ่าน google ไม่ได้เราจึงต้องมาดึงท่าอื่นกันหน่อยโดยการอ่านจากเว็บต่างๆกันแทน
2.1 เว็บ yahoo finance
1.โดยไปที่ Extensions และ Apps Script นำโค้ดไปวาง และบันทึกด้วย
code: **แก้ไขเพิ่มเติมวันที่ 18/4/24
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
2. หา ticker ของ yahoo finance
https://finance.yahoo.com/
ซึ่งดูได้จากตรงนี้ สังเกตว่าของไทยจะมี .BK ต่อท้าย
ใส่สูตร. ***โดยมันจะบอกว่าไม่รู้จัก กด enter หลังใส่สูตร
Ref
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
แต่วิธีนี้จะไม่มี DRX และ อื่นๆ เราก็อย่าลดความพยาม
2.2 เว็บ set (https://www.set.or.th/th/home)
เว็บแทนซึ่งก็ทำได้โดยใช้สูตร
xpath : คำค้นหา (ที่อยู่ข้อมูลบนเว็บ)
Ref.
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
URL หุ้นไทย
SET : https://www.set.or.th/th/market/product/stock/quote/[ชื่อหุ้น]/price
DRX: https://www.set.or.th/th/market/product/drx/quote/[ชื่อ DRX]/price
*** จากการใช้งานสักพักพบว่าช่วงก่อนตลาดเปิดเว็บจะไม่แสดงราคาเลยเป็น "-" ถ้าอยากได้แบบเก็บอัพเดตทุกเที่ยงคืนลองรีเควทกันมาได้ครับ
วิธีหา url
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
xpath ราคาหุ้น = "//div[contains(@class,'stock-info')]”
วิธีหา xpath
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
จะได้
ผลลัพธ์:
3. วิธีดึงข้อมูลราคาทอง
ดึงจากสมาคมทองไทย https://www.goldtraders.or.th/
ใช้วิธี IMPORTXML เหมือนเดิม
4. ดึงข้อมูลราคากองทุน
ผ่าน settrade.in.th
url:https://www.settrade.com/th/home
หุ้นไทยก็แล้ว แลัวกองทุนละดึงยังไง ไม่รอช้าเราก็ลอง IMPORTXML ก่อน จะได้ค่าว่างมา 555 เพราะเว็บใช้ javascript ในการแสดงผลจึงต้องท่ายากกันหน่อย
ใช้การสร้าง app script เหมือน yahoo ต้องเขียนโค้ดกันหน่อย แต่ทำมาแล้วไม่ต้องห่วง copy paste ได้เลย
โดยไปที่ Extensions และ Apps Script ใส่ code และกดบันทึก
***มีการแก้ไขเป็น setMutualfundInfo
const regexPattern = new RegExp(`${field}:([\\w\\$]+)`);
// find nav variable
const matchAnswer = contentText.match(regexPattern);
const ansChar = matchAnswer[1]
//find index variable
const index = input.findIndex(ans => ans === ansChar)
return result[index]
}
function setMutualfundInfo(ticker) {
const url = `https://www.settrade.com/th/mutualfund/quote/${ticker}/overview`;
const res = UrlFetchApp.fetch(url, {
muteHttpExceptions: true
});
const contentText = res.getContentText();
// get all variable ["a","b",...]
const matchInput = contentText.match(/window\.__NUXT__=\(function\(([^)]*)\)/);
const input = matchInput[1].split(',')
//get all value. [10.5,"KSAM"]
const matchResult = contentText.match(/}}\(([\s\S]*?)(?=\)\);)/);
const result = JSON.parse('[' + matchResult[1].replace(/(?<=,)(\.)(?=\d)/g, '0$1') + ']');
const navPerUnit = getField("navPerUnit", contentText, input, result)
return navPerUnit
}
ไหนๆทำขนาดนี้แล้ว ขอทำแยกแล้วเอาผลมารวมกันเลยได้ไหม ใช้สูตร เพื่อนำข้อมูลจากหน้าชีตอื่นๆมารวม และใส่สูตรคำนวณสัดส่วน จะได้ดังภาพ
แจกหน่อยเผื่อคนอยากเอาไปใช้งาน
Google Sheet:docs.google.com/spreadsheets/d/1BnFX2Kub-BevVBlykHwgG9JT8Qw0-nB_oST17y1IlaM/copy
ใครมีไอเดียแนะนำ แลกเปลี่ยนกันได้เลยครับ
ฝากติดตามด้วยนะครับ
https://www.facebook.com/my.money.toolkit
ตอนนี้มีเวอร์ชั่นดึงกราฟหุ้นสหรัฐด้วยครับ
https://ppantip.com/topic/42446965