投資組合大擂台 Ver. 2
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

148 lines
4.9 KiB

#!/usr/bin/env python3
"""
LLM 投資建議功能演示
展示如何使用LLM服務生成投資建議
"""
import os
import json
from unittest.mock import Mock
# 模擬環境變數
os.environ['OPENAI_API_KEY'] = 'sk-fake-key-for-demo'
from llm_service import LLMInvestmentAdvisor
from prompts.investment_advice import get_comprehensive_analysis_prompt
def demo_strategy_data():
"""模擬策略資料"""
return {
'id': 123,
'name': '科技成長策略',
'role': '最大化夏普比率',
'annual_ret': 0.28, # 年化28%報酬
'vol': 0.22, # 年化22%波動
'annual_sr': 1.95, # 夏普比率1.95
'mdd': -0.15, # 最大回落15%
'alpha': 0.12, # Alpha 12%
'beta': 1.05, # Beta 1.05
'var10': 0.08, # 10% VaR 8%
'r2': 0.89, # R-squared 89%
'gamma': 2.8, # Gamma 2.8
'assets': ['AAPL', 'MSFT', 'GOOGL', 'NVDA', 'TSLA'],
'tw': False, # 美國市場
'weight': {
'data': [[0.25, 0.20, 0.18, 0.22, 0.15]],
'columns': ['AAPL', 'MSFT', 'GOOGL', 'NVDA', 'TSLA'],
'index': ['2024-01-01']
}
}
def demo_llm_service():
"""演示LLM服務"""
print("🤖 LLM 投資建議功能演示")
print("=" * 50)
# 模擬策略資料
strategy_data = demo_strategy_data()
print("\n📊 策略概況:")
print(f" 策略名稱:{strategy_data['name']}")
print(f" 投資目標:{strategy_data['role']}")
print(f" 年化報酬:{strategy_data['annual_ret']:.1%}")
print(f" 年化波動:{strategy_data['vol']:.1%}")
print(f" 夏普比率:{strategy_data['annual_sr']:.2f}")
print(f" 最大回落:{strategy_data['mdd']:.1%}")
print(f" 持有資產:{', '.join(strategy_data['assets'])}")
print("\n🔧 測試 Prompt 生成...")
try:
# 直接調用函數,不使用快取
prompt = get_comprehensive_analysis_prompt(strategy_data)
print(f" ✅ Prompt 生成成功,長度:{len(prompt)} 字符")
print(" 📝 Prompt 預覽:")
print(f" {prompt[:200]}...")
except Exception as e:
print(f" ❌ Prompt 生成失敗:{e}")
print(f" 錯誤詳情:{str(e)}")
return
print("\n🤖 測試 LLM 服務...")
try:
# 由於是演示,我們使用模擬的OpenAI客戶端
advisor = LLMInvestmentAdvisor(api_key="fake-key")
# 模擬生成建議
demo_advice = advisor._get_fallback_advice(strategy_data)
print(" ✅ 建議生成成功:")
print(" " + "=" * 30)
print(f" {demo_advice}")
print(" " + "=" * 30)
except Exception as e:
print(f" ❌ LLM 服務測試失敗:{e}")
print("\n📝 真實使用場景:")
print(" 1. 用戶訪問策略詳情頁面")
print(" 2. 點擊「🤖 LLM 投資建議」區塊")
print(" 3. 前端調用 /api/llm_advice/123")
print(" 4. 後端查詢策略資料並生成建議")
print(" 5. 顯示專業的投資分析報告")
print("\n 設置說明:")
print(" 1. 設置 OPENAI_API_KEY 環境變數")
print(" 2. 選擇合適的模型 (GPT-4 或 GPT-3.5)")
print(" 3. 調整 prompt 模板以符合需求")
print(" 4. 監控 API 使用量和成本")
print("\n🚀 功能特色:")
print(" ✅ 智能投資分析")
print(" ✅ 風險評估報告")
print(" ✅ 市場適配建議")
print(" ✅ 快取機制")
print(" ✅ 錯誤處理")
print(" ✅ 專業UI介面")
def demo_prompt_templates():
"""演示不同的Prompt模板"""
print("\n🔧 Prompt 模板演示")
print("=" * 30)
strategy_data = demo_strategy_data()
templates = [
("基本分析", "basic"),
("全面分析", "comprehensive"),
("風險導向", "risk"),
]
for name, template_type in templates:
print(f"\n{name}模板:")
try:
if template_type == "risk":
from prompts.investment_advice import get_risk_focused_prompt
prompt = get_risk_focused_prompt(strategy_data)
elif template_type == "comprehensive":
prompt = get_comprehensive_analysis_prompt(strategy_data)
else:
prompt = get_comprehensive_analysis_prompt(strategy_data) # fallback
print(f" 長度:{len(prompt)} 字符")
print(f" 預覽:{prompt[:100]}...")
except Exception as e:
print(f" ❌ 錯誤:{e}")
print(f" 錯誤詳情:{str(e)}")
if __name__ == "__main__":
demo_llm_service()
demo_prompt_templates()
print("\n" + "=" * 50)
print("🎉 LLM 投資建議功能演示完成!")
print("📖 詳細設置說明請參閱 LLM_SETUP.md")
print("🧪 運行測試:python test_llm_service.py")