ในฐานะคนที่เทรดด้วยอัลกอริทึมมาหลายปี ฉันได้สร้างเคล็ดลับแทบทุกอย่างในหนังสือเล่มนี้ ฉันได้ทำงานร่วมกับตัวชี้วัดหลายร้อยตัวและการทดสอบย้อนหลังทางสถิติและการเฝ้าดูตลาดมากมาย
อย่างไรก็ตาม สิ่งที่ฉันรอคอยที่จะลองคือการสร้างพอร์ตโฟลิโอทั้งหมดจากข่าวปัจจุบัน และดูว่ามันเป็นอย่างไรตลอดทั้งเดือน เราจะดูบทความจากทั่วทั้ง Google และตอบคำถาม: กูรูด้านการซื้อขายหุ้นคุ้มค่ากับการโฆษณาเกินจริงหรือไม่? และภูมิปัญญาของฝูงชนจะทำให้เราลงทุนได้ดีที่สุดหรือไม่
การสร้างฐานข้อมูลข่าวสาร
ในการเริ่มต้น เราต้องการรับบทความทั้งหมดที่สนับสนุนการลงทุนในหุ้น ที่มีการเติบโต หุ้นเหล่านี้เป็นหุ้นที่มีแนวโน้มที่จะขยายตัวอย่างรวดเร็วในปีต่อๆ ไปเนื่องจากความได้เปรียบทางการแข่งขัน และดังนั้นจึงดีกว่าสำหรับการลงทุนระยะสั้นในขณะที่แบกรับความเสี่ยงมากขึ้น ซึ่งตรงกันข้ามกับ หุ้นมูลค่าซึ่งเป็นหุ้นที่ถูกประเมินมูลค่าต่ำเกินไปเนื่องจากลักษณะพื้นฐานอื่นๆ
บริษัทที่กำลังเติบโตได้รับการพิจารณาว่ามีโอกาสที่ดีในการขยายตัวอย่างมากในอีกไม่กี่ปีข้างหน้า ไม่ว่าจะเป็นเพราะพวกเขามีผลิตภัณฑ์หรือสายผลิตภัณฑ์ที่คาดว่าจะขายดี หรือเพราะพวกเขาดูเหมือนว่าจะทำงานได้ดีกว่าคู่แข่งหลายราย และด้วยเหตุนี้ คาดว่าจะได้เปรียบในตลาดของพวกเขา — อินเวสโทพีเดีย
เราสามารถกำหนดหมวดหมู่ของ Google ให้เป็นข่าวสารและพิมพ์คำค้นหาว่า “หุ้นที่มีการเติบโตสูงสุดที่น่าลงทุน” นี่จะทำให้เรามีบทความมากมายเพื่อใช้ในการวิเคราะห์ข้อมูลของเรา
ตอนนี้เรามาสร้างเครื่องขูดเว็บโดยใช้ Selenium เพื่อรวบรวมข้อมูลเกี่ยวกับบทความเหล่านี้ คุณจะต้องมี Python เวอร์ชันล่าสุดบนอุปกรณ์ของคุณด้วย เราจำเป็นต้องนำเข้าไลบรารีบางส่วนก่อน
import time from selenium import webdriver from selenium.webdriver.common.by import By import pandas as pd
ขั้นแรกโดยใช้ไดรเวอร์เว็บโครเมียมเราจะเปิดเว็บเบราว์เซอร์ไปยังลิงก์ที่ต้องการ แม้ว่าของฉันจะเป็นหุ้นมูลค่า แต่คุณสามารถใช้คำค้นหาอื่นได้ แต่ต้องแน่ใจว่าได้ตั้งค่าเป็นข่าวแล้ว
# The number of pages you want to scan, # since each page has roughly 10 articles this should be ample num_pages = 30 # Create driver driver = webdriver.Chrome() # URL of the webpage to scrape url = " *** REPLACE *** " # Replace with your desired webpage URL # Create dataframe to store important information newsDf = pd.DataFrame(columns=["Organization", "Link", "Title", "Date"]) # Call driver to get webpage driver.get(url)
เมื่อคุณเปิดหน้าเว็บแล้ว เราจะพบกับความท้าทายหลักสองประการ
- รวบรวมข้อมูลทั้งหมดออกจากเพจ
- การนำทางไปยังหน้าถัดไป
สำหรับรอบแรก เราจะรวบรวมประเด็นสำคัญบางประการ: ชื่อ องค์กร ลิงก์ และวันที่เผยแพร่ แม้ว่าข้อสองจะฟังดูเล็กน้อย แต่ก็ยากกว่าเล็กน้อย เริ่มต้นด้วยการรับข้อมูลบทความ
เราสามารถดูได้โดยการตรวจสอบหน้าเว็บว่ามีข้อมูลทั้งหมดอยู่ภายในตัวแบ่งนี้ ดังนั้นให้ย้ายองค์ประกอบไดรเวอร์ไปยังตัวแบ่งนี้โดยค้นหาตำแหน่ง XPath (คลิกซ้าย คัดลอก XPath)
div_xpath = """//*[@id="rso"]/div/div""" div_element = driver.find_element(By.XPATH, div_xpath)
ตอนนี้เรามาดูข้อมูลจากแต่ละบทความกันดีกว่า จากแท็บการตรวจสอบ เราจะเห็นได้ว่าแต่ละบทความอยู่ในตัวแบ่งของตัวเองและติดป้ายกำกับอย่างประณีตด้วยชื่อคลาสของตัวเอง เราสามารถแยกองค์ประกอบเหล่านี้ทั้งหมดได้โดยใช้ฟังก์ชัน find_elements และเพิ่มลงใน data frame ของเรา
# Get all the links from specific div org = driver.find_elements(By.CLASS_NAME, 'NUnG9d') links = div_element.find_elements(By.TAG_NAME, "a") titles = driver.find_elements(By.CLASS_NAME, 'nDgy9d') dates = driver.find_elements(By.CLASS_NAME, 'LfVVr') # Add each row to dataframe for containerNum in range(len(links)): newsDf.loc[len(newsDf)] = [ org[containerNum].text, links[containerNum].get_attribute("href"), titles[containerNum].text, dates[containerNum].text ] # Update csv in case of error newsDf.to_csv("news.csv")
ตอนนี้สิ่งที่เหลืออยู่คือการนำทางไปยังหน้าถัดไป แม้ว่าจะมีหลายวิธีในการทำเช่นนี้ วิธีที่ง่ายที่สุดคือการรับรายการลิงก์หมายเลขหน้าทั้งหมดที่ด้านล่างของหน้า และใช้ลิงก์สุดท้ายซึ่งก็คือลิงก์ "หน้าถัดไป"
# Gets the URL of the next google page next_xpath = """//*[@id="botstuff"]/div/div[2]""" next_element = driver.find_element(By.XPATH, next_xpath) links = next_element.find_elements(By.TAG_NAME, "a") next_link = links[-1].get_attribute("href") # Go to next page driver.get(next_link)
สุดท้ายก็แค่ล้อมโค้ดไว้ใน for loop ซึ่งจะดำเนินต่อไปจนกว่าจะมีผู้เข้าชมทุกหน้า หรือมากเท่าที่คุณต้องการด้วย!
รับหุ้นที่กล่าวถึงทั้งหมด
ก่อนอื่น เราต้องนำเนื้อหาบทความของเราเป็นข้อความไปยังเครื่องของเรา เพื่อให้เราสามารถดึงข้อมูลทิกเกอร์ออกมาได้ สำหรับสิ่งนี้ เราจะใช้คำขอ ซึ่งเร็วกว่าและเบากว่ามากเมื่อเทียบกับเวอร์ชันซีลีเนียม และเราจะใช้ Beautiful Soup เพื่อรวบรวมข้อมูล html จากแหล่งที่มา
# Importing the needed libraries import re import time import nltk import requests import pandas as pd from bs4 import BeautifulSoup
ตอนนี้เราจำเป็นต้องวนซ้ำฐานข้อมูลของเราและคัดลอกแต่ละบทความ โค้ดต่อไปนี้ใช้สำหรับการวนซ้ำ for for loop โดยที่ i จะมีค่าตั้งแต่ 0 จนถึงความยาวของชุดข้อมูลบทความของคุณ นอกจากนี้เรายังจะอนุญาตให้เครื่องลองลิงค์อีกครั้งหากไม่สามารถเข้าถึงลิงค์ได้
# Get link link = newsdf["Link"][i] print("Link #{}: {}".format(i, link)) time.sleep(1) #Make sure we are giving requests enough time try: # Get page source r = requests.get(link, timeout=10) print("Status: ", r.status_code) # Retry if status code is not 200 tryCount = 0 while r.status_code != 200 and tryCount < 5: print("Retrying...", tryCount) r = requests.get(link, timeout=10) time.sleep(1) tryCount += 1 except: # If error, skip link print("Error") continue
ต่อไปเราจำเป็นต้องใช้ bs4 และ re ร่วมกับคำขอเพื่อแยกข้อความเนื้อหาออกจากบทความ
#Get page source and tokenizes data html = r.content # Create BeautifulSoup object soup = BeautifulSoup(html, "html.parser") # Get all text from page pageSource = " ".join(soup.strings) pageSource = re.sub(r"\s+", " ", pageSource)
ในที่สุด! ขั้นตอนสุดท้ายคือการหาวิธีดึงข้อมูลทิกเกอร์ทั้งหมดออกจากบทความ มีสองแนวทางหลักที่นี่:
- แนวทาง AI
- แนวทางการโทเค็น
แม้ว่าแนวทาง AI จะมีประสิทธิภาพมากกว่าและเสี่ยงต่อข้อผิดพลาดน้อยกว่า แต่ก็มีราคาแพงกว่า และสำหรับชุดข้อมูลขนาดใหญ่ นี่อาจเป็นปัญหาได้ ในทางกลับกัน วิธีการโทเค็นไนเซชันมีแนวโน้มที่จะเกิดข้อผิดพลาดมากกว่ามาก อย่างไรก็ตาม วิธีนี้สามารถแก้ไขได้ในการประมวลผลภายหลัง เราจะกล่าวถึงทั้งสองอย่างโดยย่อ
แนวทาง AI
มันค่อนข้างง่าย เราสามารถใช้ ChatGPT's API และถามมันโดยแจ้ง: ค้นหาหุ้นทั้งหมดที่กล่าวถึงในบทความนี้ซึ่งมีทัศนคติเชิงบวก และส่งคืนเป็นสตริงในรายการที่คั่นด้วย Python เท่านั้น: {Article Body}
แม้ว่า ChatGPT อาจส่งคืนข้อมูลที่ไม่จำเป็นอื่นๆ พร้อมกับรายการ เพียงแยกวิเคราะห์ข้อความที่ส่งคืนสำหรับวงเล็บเปิดและปิด ซึ่งจะมีเครื่องหมายถูกทั้งหมดอยู่ภายใน เพียงเพิ่มรายการนั้นลงใน data frame ของบทความ (คุณสามารถดูโค้ดสำหรับสิ่งนี้ได้ในแนวทาง Tokenization)
แนวทางการสร้างโทเค็น
สำหรับแนวทางนี้ เราจะต้องรวบรวมฐานข้อมูลของ Ticks ทั้งหมด มีแหล่งข้อมูลมากมาย เช่น "Nasdaq" ซึ่งคุณสามารถดาวน์โหลดไฟล์ CSV ของตัวย่อทั้งหมดหรือตลาดและเกณฑ์เฉพาะได้ หากคุณต้องการดูเฉพาะกลุ่มใดกลุ่มหนึ่ง
จากนั้นเราจะใช้ NLTK เพื่อสร้างโทเค็นข้อมูลและค้นหาการกล่าวถึงเฉพาะของสัญลักษณ์เหล่านี้ในบทความ
# Tokenize page source tokens = nltk.word_tokenize(pageSource) # Return all mentions of tickers in page source tickMentioned = [] for token in tokens: if token in tickList:#Tick List is a list of all publicly traded stocks tickMentioned.append(token) # Remove duplicates tickMentioned = list(set(tickMentioned)) print(tickMentioned) # Add tickers mentioned to newsdf newsdf["Tickers Mentioned"][i] = tickMentioned # Save dataframe to csv newsdf.to_csv("mentions.csv", index=False)
หมายเหตุ: วิธีการนี้เป็นศิลปะมากกว่าวิทยาศาสตร์ที่แน่นอน สัญลักษณ์มากมายเช่น "IT" จะปรากฏในการค้นหา ลบเครื่องหมายเหล่านี้ออกจากรายการหรือทำให้ผลลัพธ์มีความละเอียดอ่อนเพื่อวิเคราะห์เฉพาะตัวพิมพ์ใหญ่เท่านั้น นอกจากนี้ หลายองค์กรยังมีแบนเนอร์ที่แสดงให้เห็นว่าบริษัทต่างๆ และความเป็นอยู่ของบริษัทต่างๆ เป็นอย่างไร แม้ว่าจะไม่ได้ระบุไว้อย่างชัดเจนในบทความว่าเป็นหุ้นที่มีการเติบโตก็ตาม สิ่งเหล่านี้จะถูกทำซ้ำตลอด ดังนั้นให้ลบสิ่งที่ดูเหมือนจะเกิดขึ้นในทุกบทความขององค์กรใดองค์กรหนึ่งออก ค่าผิดปกติใดๆ ก็ตามจะถูกละเว้น เนื่องจากเราจะดูบทความต่างๆ มากมาย
การสร้างพอร์ตโฟลิโอ
ตอนนี้เราสามารถนำผลลัพธ์และสร้างพอร์ตโฟลิโอตามจำนวนครั้งที่กล่าวถึงในบทความ มาดูคุณสมบัติบางอย่างของข้อมูลของเรากัน
เราจะเห็นได้ว่าชุดข้อมูลของเราเอนเอียงไปทาง Motley Fool อย่างมาก เราจะต้องดูผลกำไรต่อองค์กรเพื่อให้เห็นภาพที่ชัดเจนยิ่งขึ้นว่าแต่ละองค์กรมีงานแสดงอย่างไร
ดูเหมือนว่าจะเป็นรายการที่ยอดเยี่ยม! การกระจายตัวดูเหมือนจะสมเหตุสมผลและตัวหุ้นที่เลือกก็ดูเหมือนว่าจะสร้างพอร์ตโฟลิโอที่แข็งแกร่ง
ตอนนี้เรารอหนึ่งเดือนและบันทึกผลลัพธ์
ผลลัพธ์
พอร์ตโฟลิโอถูกปรับใช้ในบัญชี $100,000 เมื่อวันที่ 2 มิถุนายน 2023 และข้อมูลจะถูกบันทึกตลอดเดือนถัดไปจนถึงวันที่ 12 กรกฎาคม 2023
ตอนนี้ เรามาตรวจสอบผลกำไรที่สร้างโดยองค์กรต่างๆ กัน เส้นสีแดงแสดงถึงกำไรของ SPY (ดัชนี Standard & Poor's 500) ในช่วงเวลานี้ ในขณะที่เส้นประสีม่วงแสดงให้เห็นถึงผลการดำเนินงานของพอร์ตโฟลิโอของเรา สิ่งที่น่าสนใจคือ Nasdaq เป็นผู้นำกลุ่มด้วยผลกำไรที่น่าทึ่งถึง 15.5%! อย่างไรก็ตาม สิ่งสำคัญที่ควรทราบก็คือ Nasdaq และ US News มีจำนวนบทความค่อนข้างน้อยเมื่อเทียบกับแหล่งข้อมูลอื่น ดังนั้น นี่อาจไม่ได้แสดงถึงประสิทธิภาพโดยรวมของทั้งสององค์กรอย่างถูกต้องแม่นยำ
ในทางกลับกัน Investopedia และ Yahoo Finance มีความครอบคลุมบทความที่สูงกว่า ในขณะเดียวกันก็มีประสิทธิภาพเหนือกว่าไม่เพียงแต่ SPY เท่านั้น แต่ยังมีประสิทธิภาพโดยรวมของแหล่งข่าวทั้งหมดด้วย!
ชุดข้อมูลมีบทความจำนวนมากจาก Motley Fool ซึ่งทำให้น่าแปลกใจมากยิ่งขึ้นที่การคาดการณ์ของพวกเขาอยู่ในกลุ่มที่แย่ที่สุด เนื่องจากบทความเหล่านี้หาอ่านได้ฟรี สิ่งสำคัญคือต้องจำไว้ว่าผลลัพธ์เหล่านี้ไม่ได้สะท้อนถึงคำแนะนำการลงทุนมืออาชีพของบริษัทได้ไม่ดีนัก อย่างไรก็ตาม ทำให้เกิดความสงสัยอย่างหนึ่งเกี่ยวกับความน่าเชื่อถือของผู้เขียนที่พวกเขายอมรับในการเขียนบนแพลตฟอร์มของตน เราไม่สามารถสรุปผลที่แน่ชัดจากการศึกษานี้เพียงอย่างเดียว แต่สมควรได้รับการวิจัยเพิ่มเติมสำหรับการศึกษาในอนาคต
เมื่อตรวจสอบผลกำไรของพอร์ตโฟลิโอของเรา จะเห็นได้ชัดว่ามีความสอดคล้องกับผลการดำเนินงานของ SPY อย่างใกล้ชิด แม้ว่าจะมีขนาดที่ใหญ่กว่าก็ตาม หาก SPY มีการเติบโตในเชิงบวก พอร์ตโฟลิโอของเรามีแนวโน้มที่จะเหนือกว่าด้วยอัตรากำไรขั้นต้นที่สำคัญ และในทางกลับกัน อย่างไรก็ตาม สิ่งที่น่าสังเกตเป็นพิเศษคือตั้งแต่วันที่ 8 มิถุนายน พอร์ตโฟลิโอของเราให้ผลตอบแทนโดยรวมที่สูงขึ้นอย่างต่อเนื่องเมื่อเทียบกับ SPY ณ วันที่ 12 กรกฎาคม ช่องว่างที่ชัดเจนได้เกิดขึ้นในแง่ของผลตอบแทน ซึ่งแสดงให้เห็นอย่างชัดเจนถึงประสิทธิภาพที่เหนือกว่าของพอร์ตโฟลิโอของเรา
วันต่อวันแสดงให้เราเห็นมุมมองที่แตกต่างของสิ่งที่เราเห็นในกราฟล่าสุด เราเห็นได้ว่าพอร์ตโฟลิโอมีประสิทธิภาพดีกว่าสายลับมาตรฐานเกือบทุกวัน อย่างไรก็ตาม เมื่อมันมีประสิทธิภาพต่ำกว่า SPY มันก็จะมีประสิทธิภาพต่ำกว่าอย่างมาก โดยรวมแล้วทำได้ดีมากเมื่อเปรียบเทียบกับผลลัพธ์พื้นฐานของเรา
ปิดความคิด
เราได้สร้างพอร์ตโฟลิโอพื้นฐานตามภูมิปัญญาของฝูงชน และได้รับ กำไร $9,800 อย่างมีนัยสำคัญในช่วง 40 วัน แม้ว่าสถิตินี้เพียงอย่างเดียวไม่ได้บอกเราทุกอย่าง แต่เรามองเห็นศักยภาพบางอย่างในกลยุทธ์นี้ในอนาคต
พิจารณาประเด็นสำคัญบางประการในการศึกษานี้ ก่อนอื่น ช่วงเวลาถูกเลือกโดยพลการ และ ตลาดทั่วไปมีการดำเนินงานที่ดีเป็นพิเศษ ผู้สร้างพอร์ตโฟลิโอรายนี้อาจไม่ยุติธรรมในตลาดหมี ประการที่สอง ข้อมูลข่าวเบื้องต้นบิดเบือนไปอย่างมากสำหรับคนโง่ของ Motley แต่เนื่องจากผู้เขียนบทความส่วนใหญ่มีเอกลักษณ์เฉพาะตัว จึงได้รับการยอมรับเข้าสู่การศึกษานี้ ในอนาคต ชุดข้อมูลที่ใหญ่ขึ้นที่มีแหล่งที่มามากขึ้นอาจทำให้เรามีข้อมูลเชิงลึกที่ดีขึ้นเกี่ยวกับภูมิปัญญาของฝูงชนในบริบทการซื้อขาย
ฉันไม่สามารถแสดงออกได้ว่าฉันซาบซึ้งกับพวกคุณทุกคนแค่ไหน! ฉันหวังเป็นอย่างยิ่งว่าสิ่งนี้จะมีประโยชน์! หากคุณมีคำถามใด ๆ เรายินดีที่จะตอบคำถามเหล่านั้นในส่วนความคิดเห็น นอกจากนี้ ฉันเปิดรับโอกาสงานอิสระและกระตือรือร้นที่จะหารือเกี่ยวกับโอกาสในอนาคต