AI打造持股法說會Telegram通知:告別錯過重要資訊的投資困境

更新 發佈閱讀 10 分鐘
投資理財內容聲明

台灣上市/櫃公司舉辦法說會,可提供投資人最新的公司營運資訊以及未來展望,即便佛系持股也不應該偏廢,過往由於資訊片斷化和自己的懶散常常漏掉持股公司的法說會消息,前幾天利用AI透過「開規格」的對話方式開發「持股法說會Telegram通知」小工具,利用Telegram(即時通訊工具)將個人持股和當天有舉辦法說會的資訊推播給自己,不漏掉關注公司的法說會消息,試行幾天體感覺得方便。

#!/usr/bin/env python3
"""
功能:從 Yahoo 奇摩股市台股法說會行事曆中抓取今日活動,
並比對與使用者 portfolio (股票代號) 是否有匹配,
若有則發送 Telegram 訊息通知「今天有開法說會」

使用方法:
python script.py portfolio.cfg

portfolio.cfg 範例如下:
5871 中租-KY
3152 璟德
6177 達麗
"""

import os
import sys
import requests
from bs4 import BeautifulSoup
from datetime import datetime
from dotenv import load_dotenv

# 讀取環境變數(優先 .env,找不到才用 export
load_dotenv()
BOT_TOKEN = os.getenv("BOT_TOKEN")
CHAT_ID = os.getenv("CHAT_ID")

def send_telegram_message(message):
url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage"
payload = {"chat_id": CHAT_ID, "text": message}
try:
r = requests.post(url, data=payload)
r.raise_for_status()
print("Telegram 訊息發送成功")
except Exception as e:
print(f"Telegram 訊息發送失敗: {e}")

def load_portfolio(file_path):
portfolio_codes = set()
try:
with open(file_path, "r", encoding="utf-8") as f:
for line in f:
line = line.strip()
if not line:
continue
parts = line.split()
if parts:
portfolio_codes.add(parts[0])
except Exception as e:
print(f"讀取 portfolio 檔案錯誤: {e}")
return portfolio_codes

def main():
if len(sys.argv) < 2:
print("Usage: python script.py portfolio.cfg")
sys.exit(1)

portfolio_file = sys.argv[1]
portfolio_codes = load_portfolio(portfolio_file)
print("Portfolio 股票代號:", portfolio_codes)

url = "https://tw.stock.yahoo.com/calendar/earnings-call"

try:
response = requests.get(url)
response.raise_for_status()
except Exception as e:
print(f"無法取得網頁資料: {e}")
return

soup = BeautifulSoup(response.text, "html.parser")
# 取得第一個 class 包含 "calendarDetail"<section>
section = soup.find("section", class_=lambda x: x and "calendarDetail" in x)
if not section:
print("找不到指定的 section (class 包含 calendarDetail)")
return

# 取得今日日期,格式需與網頁日期格式一致
today_str = datetime.now().strftime("%Y/%m/%d")
print(f"今日日期:{today_str}\n")

ul = section.find("ul")
if not ul:
print("找不到活動清單 (<ul> 元素)")
return

events = ul.find_all("li")
if not events:
print("活動清單中未發現任何資料")
return

matching_codes = []
for li in events:
container = li.find("div")
if not container:
continue
cols = container.find_all("div", recursive=False)
if len(cols) < 2:
continue

# 取出第二欄(index 1)的日期資訊,格式如 "2025/03/18 14:00"
date_text = cols[1].get_text(strip=True)
event_date = date_text.split()[0]
if event_date != today_str:
continue

company_col = cols[0]
# 股票代號通常在內部含 "Fz(14px)"<span>
code_span = company_col.find("span", class_=lambda x: x and "Fz(14px)" in x)
if not code_span:
continue

full_stock_code = code_span.get_text(strip=True)
stock_code = full_stock_code.split('.')[0]

if stock_code in portfolio_codes:
company_div = company_col.find("div", class_=lambda x: x and "Fw(600)" in x)
code_span = company_col.find("span", class_=lambda x: x and "Fz(14px)" in x)
if company_div and code_span:
company_name = company_div.get_text(strip=True)
matching_codes.append(stock_code + " " + company_name)
else:
matching_codes.append(stock_code)

if matching_codes:
matching_codes = sorted(set(matching_codes))
message = "今天有開法說會的股票:\n" + "\n".join(matching_codes)
print("Telegram 訊息內容:\n", message)
send_telegram_message(message)
else:
print("今日無您 portfolio 中的法說會活動。")

if __name__ == '__main__':
main()

有興趣自行取用


留言
avatar-img
蘇波麟投資與生活
20會員
57內容數
佛系投資.估值優先
2025/04/09
本文分享2024年10月至2025年3月VOO、SCZ、TLT的月度動量數據以及交易紀錄。回顧此期間的投資表現,發現紀律操作可以避開4月的大跌。
Thumbnail
2025/04/09
本文分享2024年10月至2025年3月VOO、SCZ、TLT的月度動量數據以及交易紀錄。回顧此期間的投資表現,發現紀律操作可以避開4月的大跌。
Thumbnail
2025/02/26
分享個人使用預估EPS自動化工具及 Telegram 通知提升效率的經驗,以紅、橘、綠燈號顯示股價與預估便宜價/昂貴價的比較結果。
Thumbnail
2025/02/26
分享個人使用預估EPS自動化工具及 Telegram 通知提升效率的經驗,以紅、橘、綠燈號顯示股價與預估便宜價/昂貴價的比較結果。
Thumbnail
2024/10/22
加速防禦雙動能策略是一個有效的風險管理方法,透過結合相對動能和絕對動能兩種方式,讓投資者在市場上漲時能夠抓住機會,而在市場下跌時則能降低風險,從而達到「進可攻,退可守」的效果。
Thumbnail
2024/10/22
加速防禦雙動能策略是一個有效的風險管理方法,透過結合相對動能和絕對動能兩種方式,讓投資者在市場上漲時能夠抓住機會,而在市場下跌時則能降低風險,從而達到「進可攻,退可守」的效果。
Thumbnail
看更多
你可能也想看
Thumbnail
債券投資,不只是高資產族群的遊戲 在傳統的投資觀念中,海外債券(Overseas Bonds)常被貼上「高資產族群專屬」的標籤。過去動輒 1 萬甚至 10 萬美元的最低申購門檻,讓許多想尋求穩定配息的小資族望而卻步。 然而,在股市波動劇烈的環境下,尋求穩定的美元現金流與被動收入成為許多投資人
Thumbnail
債券投資,不只是高資產族群的遊戲 在傳統的投資觀念中,海外債券(Overseas Bonds)常被貼上「高資產族群專屬」的標籤。過去動輒 1 萬甚至 10 萬美元的最低申購門檻,讓許多想尋求穩定配息的小資族望而卻步。 然而,在股市波動劇烈的環境下,尋求穩定的美元現金流與被動收入成為許多投資人
Thumbnail
透過川普的近期債券交易揭露,探討債券作為資產配置中「穩定磐石」的重要性。文章分析降息對債券的潛在影響,以及股神巴菲特的操作策略。並介紹玉山證券「小額債」平臺,如何讓小資族也能低門檻參與海外債券市場,實現「低門檻、低波動、固定收益」的務實投資方式。
Thumbnail
透過川普的近期債券交易揭露,探討債券作為資產配置中「穩定磐石」的重要性。文章分析降息對債券的潛在影響,以及股神巴菲特的操作策略。並介紹玉山證券「小額債」平臺,如何讓小資族也能低門檻參與海外債券市場,實現「低門檻、低波動、固定收益」的務實投資方式。
Thumbnail
解析「債券」如何成為資產配置中的穩定錨,提供低風險高回報的投資選項。 藉由玉山證券的低門檻債券服務,投資者可輕鬆入手,平衡風險並穩定財務。
Thumbnail
解析「債券」如何成為資產配置中的穩定錨,提供低風險高回報的投資選項。 藉由玉山證券的低門檻債券服務,投資者可輕鬆入手,平衡風險並穩定財務。
Thumbnail
相較於波動較大的股票,債券能提供固定現金流,而玉山證券推出的小額債,更以1000 美元的低門檻,讓學生與新手也能參與全球優質企業債投資。玉山E-Trader平台即時報價、條件式篩選與清楚的交易流程等特色,大幅降低投資難度,對於希望分散風險、建立穩定現金流的人來說,玉山小額債是一個值得嘗試的理財起點。
Thumbnail
相較於波動較大的股票,債券能提供固定現金流,而玉山證券推出的小額債,更以1000 美元的低門檻,讓學生與新手也能參與全球優質企業債投資。玉山E-Trader平台即時報價、條件式篩選與清楚的交易流程等特色,大幅降低投資難度,對於希望分散風險、建立穩定現金流的人來說,玉山小額債是一個值得嘗試的理財起點。
Thumbnail
加入免費👉Discord群組/TG Channel接收市場要聞、產業動態和更新通知。
Thumbnail
加入免費👉Discord群組/TG Channel接收市場要聞、產業動態和更新通知。
Thumbnail
加入免費👉Discord群組/TG Channel接收市場要聞、產業動態和更新通知。
Thumbnail
加入免費👉Discord群組/TG Channel接收市場要聞、產業動態和更新通知。
Thumbnail
加入免費👉Discord群組/TG Channel接收市場要聞、產業動態和更新通知。
Thumbnail
加入免費👉Discord群組/TG Channel接收市場要聞、產業動態和更新通知。
Thumbnail
加入免費👉Discord群組/TG Channel接收市場要聞、產業動態和更新通知。
Thumbnail
加入免費👉Discord群組/TG Channel接收市場要聞、產業動態和更新通知。
Thumbnail
加入免費👉Discord群組/TG Channel接收市場要聞、產業動態和更新通知。
Thumbnail
加入免費👉Discord群組/TG Channel接收市場要聞、產業動態和更新通知。
Thumbnail
加入免費👉Discord群組/TG Channel接收市場要聞、產業動態和更新通知。
Thumbnail
加入免費👉Discord群組/TG Channel接收市場要聞、產業動態和更新通知。
Thumbnail
加入免費👉Discord群組/TG Channel接收市場要聞、產業動態和更新通知。
Thumbnail
加入免費👉Discord群組/TG Channel接收市場要聞、產業動態和更新通知。
Thumbnail
加入免費👉Discord群組/TG Channel接收市場要聞、產業動態和更新通知。
Thumbnail
加入免費👉Discord群組/TG Channel接收市場要聞、產業動態和更新通知。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News