iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
Odoo

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

Day25:個案二:投資管理系統(5)-產生股票 K 線圖

  • 分享至 

  • xImage
  •  

使用者故事

**作為一名投資者,我希望能查看觀察名單中股票的K線圖,以便進行更深入的技術分析和趨勢判斷。**

預期的工作流程:
1.用戶在 stock.watchlist 視圖中點擊"更新K線數據"按鈕。
2.用戶點擊"顯示K線圖"按鈕。
3.系統從 stock.kline 模型中檢索該股票近一年的數據。
4.後端使用 'mplfinance', 'matplotlib', 'pandas' 生成K線圖的圖片。
5.系統打開一個新的彈窗或頁面,顯示生成的K線圖。
6.
參考程式
**050 K線圖**
   - https://github.com/jumpingchu/Stock-Chart/blob/master/0050%20K%E7%B7%9A%E5%9C%96.py

cursou 重點產生內容

新增 kline 更新股票的近一年資料

https://ithelp.ithome.com.tw/upload/images/20241006/20102255VMSf2HJErF.jpg

    def update_kline_data(self):
        for record in self:
            try:
                stock = twstock.Stock(record.stock_code)
                end_date = datetime.now().date()
                start_date = end_date - timedelta(days=365)

                # 獲取近一年的數據
                kline_data = stock.fetch_from(start_date.year, start_date.month)

                for data in kline_data:
                    if start_date <= data.date.date() <= end_date:
                        kline = self.env['stock.kline'].search([
                            ('watchlist_id', '=', record.id),
                            ('date', '=', data.date.date())
                        ])
                        kline_values = {
                            'open_price': data.open,
                            'close_price': data.close,
                            'high_price': data.high,
                            'low_price': data.low,
                            'volume': data.capacity
                        }
                        if kline:
                            kline.write(kline_values)
                        else:
                            kline_values.update({
                                'watchlist_id': record.id,
                                'date': data.date.date(),
                            })
                            self.env['stock.kline'].create(kline_values)

                record.last_update = datetime.now()
                _logger.info(f"成功更新股票 {record.stock_code} 的K線數據")
            except Exception as e:
                _logger.error(f"更新股票 {record.stock_code} K線數據時發生錯誤: {str(e)}")

產生K線圖,並下載呈現

https://ithelp.ithome.com.tw/upload/images/20241006/20102255kSm83jWdvk.jpg

    def show_kline_chart(self):
        self.ensure_one()
        kline_data = self.kline_ids.sorted(key=lambda r: r.date)

        # 將數據轉換為 pandas DataFrame
        df = pd.DataFrame({
            'Date': pd.to_datetime(kline_data.mapped('date')),
            'Open': kline_data.mapped('open_price'),
            'High': kline_data.mapped('high_price'),
            'Low': kline_data.mapped('low_price'),
            'Close': kline_data.mapped('close_price'),
            'Volume': kline_data.mapped('volume')
        })
        df.set_index('Date', inplace=True)

        # 確保索引是 DatetimeIndex 類型
        df.index = pd.to_datetime(df.index)

        # 設置 K 線圖樣式
        mc = mpf.make_marketcolors(up='r', down='g', inherit=True)
        s = mpf.make_mpf_style(marketcolors=mc)

        # 創建一個 BytesIO 對象來保存圖片
        buf = io.BytesIO()

        # 繪製 K 線圖
        mpf.plot(df, type='candle', style=s, title=f'{self.name} ({self.stock_code}) K線圖',
                 volume=True, figsize=(10, 8), savefig=dict(fname=buf, format='png'))

        # 將圖片保存為附件
        buf.seek(0)
        attachment = self.env['ir.attachment'].create({
            'name': f'{self.name}_{self.stock_code}_kline_chart.png',
            'datas': base64.b64encode(buf.getvalue()),
            'res_model': self._name,
            'res_id': self.id,
        })

        # 返回一個動作來顯示附件
        return {
            'type': 'ir.actions.act_url',
            'url': f'/web/content/{attachment.id}?download=true',
            'target': 'new',
        }

本章小結

在本章中,我們實現了Odoo系統中結合 twstockmplfinance 等Python套件,生成股票的K線圖,並展示於系統中。重點在於展示如何透過Odoo與外部Python庫的整合,快速實現技術分析功能,並且讓用戶能夠透過直觀的K線圖來判斷趨勢。

關鍵實作內容

  1. 資料更新:

    • 透過 twstock 庫自動抓取觀察名單中股票的歷史數據,並將其保存到 stock.kline 模型中。
    • 系統會定期更新近一年的K線數據,讓用戶能夠隨時查看最新的技術分析資料。
  2. 生成K線圖:

    • 使用 mplfinancepandas 庫將存儲的K線數據轉換成DataFrame,並生成圖表。
    • K線圖生成後,會自動保存為附件,並讓用戶下載或直接在新頁面中查看。
  3. 彈性與擴展性:

    • Odoo整合Python庫的能力讓此功能具備極大的靈活性。只要Python支持的套件,在Odoo中都可以輕鬆運行,例如K線圖的產生與呈現,過程中無需額外的複雜設定。

這些整合不僅實現了用戶故事中的需求,還展示了Python與Odoo協作的強大能力。只要Python能用的套件,Odoo都能有效地支持並擴展,這大幅提高了開發效率與功能的彈性。


上一篇
Day24:個案二:投資管理系統(4)-每日自動更新台灣股市股票價格擷取
下一篇
Day26:個案二:投資管理系統(6)-產生股票觀察清單,買入賣出建議
系列文
利用【AI】工具,聰明進行 Odoo 程式開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言