iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0
Odoo

利用【AI】工具,聰明進行 Odoo 程式開發系列 第 29

Day29:個案二:投資管理系統(9)-依股票觀察清單,篩選相關新聞和公告,使用(NLP)技術進行文本分析

  • 分享至 

  • xImage
  •  

使用者故事

作為一名投資者,我希望能依觀察清單,自動蒐集相關 市場新聞與公告整合,對新聞和公告進行分類,評估新聞和公告的重要性,設定優先級

Cursor回應

好的,我會根據您的要求,針對市場新聞與公告整合功能進行邏輯思考,並不直接開發程式碼。以下是我的思考過程:

  1. 資料來源:

    • 台灣證券交易所(TWSE)公開資訊觀測站
    • 財經新聞網站(如:鉅亨網、MoneyDJ等)
    • 公司官方網站
    • 社交媒體平台(如:Twitter、Facebook)
  2. 資料收集方式:

    • 使用網路爬蟲技術定期抓取相關網站的資訊
    • 利用RSS訂閱功能
    • 透過API介接(如果有提供)
  3. 資料處理流程:
    a. 根據觀察清單中的股票代碼篩選相關新聞和公告
    b. 使用自然語言處理(NLP)技術進行文本分析,提取關鍵信息
    c. 對新聞和公告進行分類(如:財務報告、重大事件、產品發布等)
    d. 評估新聞和公告的重要性,設定優先級

  4. 資料儲存:

    • 創建新的數據模型 stock.news 來儲存收集到的新聞和公告
    • 欄位包括:股票代碼、標題、內容摘要、來源、發布時間、類型、重要性等
  5. 用戶界面:

    • 在觀察清單視圖中添加一個新的頁籤 "相關新聞"
    • 顯示與該股票相關的最新新聞和公告列表
    • 提供篩選和排序功能

重要程式

好的,我會根據您的要求進行系統開發。首先,讓我們創建一個新的模型來儲存新聞和公告資訊。

首先,在 addons/personal_stock/models 目錄下創建一個新文件 stock_news.py:

from odoo import models, fields, api

class StockNews(models.Model):
    _name = 'stock.news'
    _description = '股票新聞和公告'
    _order = 'publish_date desc, importance desc'

    watchlist_id = fields.Many2one('stock.watchlist', string='觀察名單', required=True)
    title = fields.Char('標題', required=True)
    content = fields.Text('內容摘要')
    source = fields.Char('來源')
    publish_date = fields.Datetime('發布時間', required=True)
    news_type = fields.Selection([
        ('financial_report', '財務報告'),
        ('major_event', '重大事件'),
        ('product_launch', '產品發布'),
        ('market_analysis', '市場分析'),
        ('other', '其他')
    ], string='新聞類型', required=True)
    importance = fields.Selection([
        ('high', '高'),
        ('medium', '中'),
        ('low', '低')
    ], string='重要性', required=True)
    url = fields.Char('原文連結')

    @api.model
    def create(self, vals):
        # 在這裡可以添加創建新聞時的額外邏輯
        return super(StockNews, self).create(vals)

addons/personal_stock/views/watchlist_views.xml 文件中添加一個新的頁籤來顯示相關新聞:

addons/personal_stock/models/watchlist.py 文件中添加一個新的字段來關聯新聞:

需要創建一個新的視圖文件 addons/personal_stock/views/stock_news_views.xml:

讀取並存儲所有新聞:

def fetch_anue_news(self):
    self.ensure_one()
    total_news = 0
    page = 1
    limit = 30
    one_year_ago = datetime.now() - timedelta(days=365)

    while True:
        newslist_info = self.get_newslist_info(page, limit)
        if not newslist_info:
            break

        total_news = newslist_info["total"]
        
        for news in newslist_info["data"]:
            publish_date = datetime.fromtimestamp(news["publishAt"])
            
            if publish_date < one_year_ago:
                break

            news_url = f'https://news.cnyes.com/news/id/{news["newsId"]}'
            existing_news = self.env['stock.news'].search([('url', '=', news_url)])
            
            if not existing_news:
                self.env['stock.news'].create({
                    'title': news["title"],
                    'content': news["summary"],
                    'url': news_url,
                    'publish_date': publish_date,
                    'source': '鉅亨網',
                    'news_type': 'other',
                    'importance': 'medium',
                })

        if len(newslist_info["data"]) < limit or publish_date < one_year_ago:
            break

        page += 1

    self._cr.commit()  # 提交事務

    return {
        'type': 'ir.actions.client',
        'tag': 'display_notification',
        'params': {
            'title': '新聞更新',
            'message': f'已成功從鉅亨網獲取並更新 {total_news} 條相關新聞',
            'sticky': False,
        }
    }
  1. 使用分頁方式獲取所有新聞。
  2. 檢查每條新聞的發布日期,如果超過一年就停止獲取。
  3. 檢查新聞是否已存在,如果不存在則創建新記錄。
  4. 當獲取的新聞數量小於每頁限制或者新聞日期超過一年時,停止獲取。
  5. 最後返回一個通知,顯示總共更新的新聞數量。

使用自然語言處理(NLP)技術來判斷新聞的重要性和類型


    @api.depends('title', 'content')
    def _compute_importance(self):
        important_keywords = ['重大', '突破', '創新高', '創新低', '大漲', '大跌', '收購', '合併', '破產', '違約']
        for news in self:
            importance_score = 0

            # 關鍵詞匹配
            text = news.title + ' ' + (news.content or '')
            for keyword in important_keywords:
                if keyword in text:
                    importance_score += 1

            # 情感分析
            blob = TextBlob(self.preprocess_text(text))
            sentiment = blob.sentiment.polarity
            if abs(sentiment) > 0.5:
                importance_score += 1

            # 根據分數設置重要性
            if importance_score >= 2:
                news.importance = 'high'
            elif importance_score == 1:
                news.importance = 'medium'
            else:
                news.importance = 'low'

    @api.depends('title', 'content')
    def _compute_news_type(self):
        type_keywords = {
            'financial_report': ['財報', '季報', '年報', '營收', '獲利'],
            'major_event': ['重大事件', '重大訊息', '重大決策', '重大交易'],
            'product_launch': ['新產品', '發表', '上市', '推出'],
            'market_analysis': ['市場分析', '產業趨勢', '市場預測', '經濟展望']
        }
        for news in self:
            text = news.title + ' ' + (news.content or '')
            preprocessed_text = self.preprocess_text(text)
            
            news_type = 'other'
            max_count = 0
            for type, keywords in type_keywords.items():
                count = sum(1 for keyword in keywords if keyword in preprocessed_text)
                if count > max_count:
                    max_count = count
                    news_type = type
            
            news.news_type = news_type

    def preprocess_text(self, text):
        # 移除特殊字符和數字
        text = re.sub(r'[^\w\s]', '', text)
        text = re.sub(r'\d+', '', text)
        # 分詞
        words = jieba.cut(text)
        return ' '.join(words)

https://ithelp.ithome.com.tw/upload/images/20241013/20102255sVHMI7FAWo.jpg

https://ithelp.ithome.com.tw/upload/images/20241013/20102255PY9wYQzEz9.jpg

本章小結

本章探討了如何將市場新聞與公告整合進入個人投資管理系統。首先,根據使用者的需求,系統應該自動蒐集與觀察清單相關的股票新聞和公告。透過使用網路爬蟲、RSS訂閱或API介接,從台灣證券交易所、財經新聞網站等多個來源獲取資料。資料經過自然語言處理技術進行分類,如財務報告、重大事件、產品發布等,並評估其重要性,設定高、中、低優先級。

為了支援這一功能,我們新增了數據模型 stock.news,用來儲存每則新聞和公告的標題、內容摘要、來源、發布時間、新聞類型和重要性等資訊。這些新聞將會與 stock.watchlist 觀察名單關聯,並在用戶界面的觀察清單中,透過一個新的「相關新聞」頁籤來展示,且支援篩選與排序功能,讓用戶能快速檢視與其投資相關的最新資訊。

相關程式碼

https://github.com/kulius/odoo17_ithelp/tree/master/addons/personal_stock

上一篇
Day28:個案二:投資管理系統(8)-股票觀察清單,透LINE發送提醒通知
下一篇
Day30:完賽心得與感想
系列文
利用【AI】工具,聰明進行 Odoo 程式開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言