ในฐานะคนที่เทรดด้วยอัลกอริทึมมาหลายปี ฉันได้สร้างเคล็ดลับแทบทุกอย่างในหนังสือเล่มนี้ ฉันได้ทำงานร่วมกับตัวชี้วัดหลายร้อยตัวและการทดสอบย้อนหลังทางสถิติและการเฝ้าดูตลาดมากมาย

อย่างไรก็ตาม สิ่งที่ฉันรอคอยที่จะลองคือการสร้างพอร์ตโฟลิโอทั้งหมดจากข่าวปัจจุบัน และดูว่ามันเป็นอย่างไรตลอดทั้งเดือน เราจะดูบทความจากทั่วทั้ง 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)

เมื่อคุณเปิดหน้าเว็บแล้ว เราจะพบกับความท้าทายหลักสองประการ

  1. รวบรวมข้อมูลทั้งหมดออกจากเพจ
  2. การนำทางไปยังหน้าถัดไป

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

เราสามารถดูได้โดยการตรวจสอบหน้าเว็บว่ามีข้อมูลทั้งหมดอยู่ภายในตัวแบ่งนี้ ดังนั้นให้ย้ายองค์ประกอบไดรเวอร์ไปยังตัวแบ่งนี้โดยค้นหาตำแหน่ง 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)

ในที่สุด! ขั้นตอนสุดท้ายคือการหาวิธีดึงข้อมูลทิกเกอร์ทั้งหมดออกจากบทความ มีสองแนวทางหลักที่นี่:

  1. แนวทาง AI
  2. แนวทางการโทเค็น

แม้ว่าแนวทาง 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 แต่เนื่องจากผู้เขียนบทความส่วนใหญ่มีเอกลักษณ์เฉพาะตัว จึงได้รับการยอมรับเข้าสู่การศึกษานี้ ในอนาคต ชุดข้อมูลที่ใหญ่ขึ้นที่มีแหล่งที่มามากขึ้นอาจทำให้เรามีข้อมูลเชิงลึกที่ดีขึ้นเกี่ยวกับภูมิปัญญาของฝูงชนในบริบทการซื้อขาย

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