跳轉到

Investment Agent 規格文檔

概述

Investment Agent 是 Cortex 的第一個應用實例,提供股票技術分析能力。

核心功能: - 單一股票分析(台股全部 + 美股七巨頭) - 28 種技術指標計算與解讀(62 個欄位) - Meta-Agent 動態生成分析策略 - VRR 驗證分析可靠性 - 對話式互動 + 圖表視覺化

資料範圍: - 台灣股票: ~1,700 支(全部上市上櫃) - 美國股票: 7 支(AAPL, MSFT, GOOGL, AMZN, NVDA, META, TSLA) - 歷史資料: 2020-01-01 至今 - 更新頻率: 每日 06:00 AM


系統架構

模組劃分

investment-agent/
├── backend/
│   ├── api/              # FastAPI 端點
│   ├── agents/           # 領域 Agents
│   ├── data_pipeline/    # 資料服務
│   ├── database/         # 資料庫層
│   ├── knowledge/        # 投資領域知識
│   └── config/           # 配置檔
│
└── streamlit_ui/         # Streamlit 前端

1. Agent 層 (backend/agents/)

1.1 StockAnalyzer (主要 Agent)

檔案: backend/agents/analyzer.py

職責: 協調整個分析流程,使用 Meta-Agent 生成策略

類別定義:

from core.agent_framework import BaseAgent, MetaAgent, VRREngine
from core.llm import GeminiLLM

class StockAnalyzer(BaseAgent):
    """股票分析 Agent"""

    def __init__(
        self,
        llm: GeminiLLM,
        meta_agent: MetaAgent,
        vrr_engine: VRREngine,
        rag_service: RAGService,
        db_session: AsyncSession
    ):
        """
        初始化股票分析 Agent

        Args:
            llm: Gemini LLM 實例
            meta_agent: Meta-Agent 實例
            vrr_engine: VRR Engine 實例
            rag_service: RAG 服務(投資知識庫)
            db_session: 資料庫 session
        """
        super().__init__(name="stock_analyzer", llm=llm, config={})
        self.meta_agent = meta_agent
        self.vrr_engine = vrr_engine
        self.rag = rag_service
        self.db = db_session

    async def analyze(
        self,
        ticker: str,
        analysis_type: str = "comprehensive",
        timeframe: str = "3_months"
    ) -> AnalysisResult:
        """
        分析股票

        Args:
            ticker: 股票代碼 (e.g., "2330.TW", "AAPL")
            analysis_type: 分析類型
                - "comprehensive": 全面分析
                - "technical": 純技術面
                - "trend": 趨勢分析
            timeframe: 時間範圍
                - "1_month", "3_months", "6_months", "1_year"

        Returns:
            AnalysisResult:
                - summary: 分析摘要
                - trend: 趨勢判斷 (bullish/bearish/neutral)
                - key_levels: 關鍵價位
                - indicators: 技術指標解讀
                - risks: 風險提示
                - confidence: 分析信心分數
                - chart_data: 圖表資料

        Flow:
            1. Meta-Agent 生成分析策略
            2. 從 DB 讀取 OHLC 和技術指標
            3. 從 RAG 獲取相關投資知識
            4. LLM 生成分析
            5. VRR Engine 驗證與改進
            6. 返回結果
        """
        # Step 1: 生成策略
        strategy = await self.meta_agent.generate_strategy(
            task_description=f"分析 {ticker}{analysis_type}",
            domain="investment",
            context={
                "ticker": ticker,
                "timeframe": timeframe,
                "analysis_type": analysis_type
            }
        )

        # Step 2: 獲取資料
        stock_data = await self._fetch_stock_data(ticker, timeframe)

        # Step 3: 獲取領域知識
        knowledge = await self._fetch_domain_knowledge(ticker, analysis_type)

        # Step 4: 生成分析
        analysis = await self._generate_analysis(
            ticker, stock_data, knowledge, analysis_type
        )

        # Step 5: VRR 驗證與改進
        vrr_result = await self.vrr_engine.execute(
            initial_result=analysis,
            strategy=strategy,
            task_context={
                "ticker": ticker,
                "data": stock_data
            }
        )

        # Step 6: 結構化輸出
        return self._parse_analysis_result(vrr_result)

    async def _fetch_stock_data(
        self,
        ticker: str,
        timeframe: str
    ) -> StockData:
        """從資料庫獲取股票資料"""
        # 詳細實現在 DATABASE_SCHEMA.md
        pass

    async def _fetch_domain_knowledge(
        self,
        ticker: str,
        analysis_type: str
    ) -> List[str]:
        """從 RAG 獲取相關投資知識"""
        queries = [
            f"{ticker} 的行業特性",
            f"{analysis_type} 分析方法",
            "技術指標解讀原則"
        ]
        knowledge_chunks = []
        for query in queries:
            results = await self.rag.query(query, k=3)
            knowledge_chunks.extend(results.sources)
        return knowledge_chunks

    async def _generate_analysis(
        self,
        ticker: str,
        stock_data: StockData,
        knowledge: List[str],
        analysis_type: str
    ) -> str:
        """使用 LLM 生成分析"""
        # 建構 prompt
        prompt = self._build_analysis_prompt(
            ticker, stock_data, knowledge, analysis_type
        )

        # 使用 Gemini Pro 進行深度分析
        analysis = await self.llm.generate(
            prompt=prompt,
            system_prompt=STOCK_ANALYST_SYSTEM_PROMPT,
            temperature=0.3,  # 較低溫度確保一致性
            max_tokens=3000
        )

        return analysis

    def _build_analysis_prompt(
        self,
        ticker: str,
        stock_data: StockData,
        knowledge: List[str],
        analysis_type: str
    ) -> str:
        """建構分析 prompt"""
        # 使用 PromptManager
        pass

Prompt 模板 (prompts/stock_analysis.txt):

你是一位專業的股票分析師,專精於技術分析。

股票資訊:
- 代碼: {{ ticker }}
- 名稱: {{ stock_name }}
- 產業: {{ industry }}
- 當前價格: {{ current_price }}

歷史資料 ({{ timeframe }}):
{{ ohlc_summary }}

技術指標:
{% for indicator, value in indicators.items() %}
- {{ indicator }}: {{ value }}
  {% if indicator in ['RSI', 'KD'] %}
  (超買: >70, 超賣: <30)
  {% elif indicator == 'MACD' %}
  (交叉訊號: {{ macd_signal }})
  {% endif %}
{% endfor %}

相關知識:
{{ domain_knowledge }}

請提供以下分析:

1. **趨勢判斷** (bullish/bearish/neutral)
   - 短期趨勢 (1個月)
   - 中期趨勢 (3個月)
   - 理由說明

2. **關鍵價位**
   - 支撐位: 
   - 壓力位:
   - 依據:

3. **技術指標解讀**
   - 各指標當前含義
   - 指標之間的互相印證
   - 注意事項

4. **風險提示**
   - 技術面風險
   - 可能的轉折訊號

5. **建議**
   - 觀察要點
   - 進出場參考 (僅供參考,非投資建議)

**重要提醒**:
- 基於事實數據分析
- 避免過度樂觀或悲觀
- 明確指出不確定性
- 強調「僅供參考,非投資建議」

1.2 TechnicalCalculator

檔案: backend/agents/calculator.py

職責: 計算技術指標(用於實時計算或驗證預算指標)

類別定義:

class TechnicalCalculator(BaseAgent):
    """技術指標計算 Agent"""

    async def calculate_indicators(
        self,
        ticker: str,
        ohlc_data: pd.DataFrame,
        indicators: List[str]
    ) -> Dict[str, Any]:
        """
        計算技術指標

        Args:
            ticker: 股票代碼
            ohlc_data: OHLC DataFrame
            indicators: 要計算的指標列表
                ["MA", "RSI", "MACD", "KD", "BB", etc.]

        Returns:
            指標字典 {indicator_name: values}
        """
        results = {}

        for indicator in indicators:
            if indicator == "MA":
                results["MA"] = self._calculate_ma(ohlc_data)
            elif indicator == "RSI":
                results["RSI"] = self._calculate_rsi(ohlc_data)
            elif indicator == "MACD":
                results["MACD"] = self._calculate_macd(ohlc_data)
            # ... 其他指標

        return results

    def _calculate_ma(
        self,
        df: pd.DataFrame,
        periods: List[int] = [5, 10, 20, 50, 100, 200]
    ) -> Dict[int, float]:
        """計算移動平均線"""
        pass

    def _calculate_rsi(
        self,
        df: pd.DataFrame,
        period: int = 14
    ) -> float:
        """計算 RSI"""
        pass

    def _calculate_macd(
        self,
        df: pd.DataFrame,
        fast: int = 12,
        slow: int = 26,
        signal: int = 9
    ) -> Dict[str, float]:
        """計算 MACD"""
        pass

    # 其他指標方法...

技術指標清單 (Option B - 完整指標):

INDICATORS_CONFIG = {
    "MA": {
        "periods": [5, 10, 20, 50, 100, 200],
        "library": "pandas"
    },
    "EMA": {
        "periods": [5, 10, 20, 50, 100, 200],
        "library": "pandas"
    },
    "RSI": {
        "period": 14,
        "library": "pandas_ta"
    },
    "MACD": {
        "fast": 12,
        "slow": 26,
        "signal": 9,
        "library": "pandas_ta"
    },
    "KD": {
        "k_period": 9,
        "d_period": 3,
        "smooth": 3,
        "library": "pandas_ta"
    },
    "BB": {  # 布林通道
        "period": 20,
        "std": 2,
        "library": "pandas_ta"
    },
    "ATR": {  # 真實波動幅度
        "period": 14,
        "library": "pandas_ta"
    },
    "ADX": {  # 趨勢強度
        "period": 14,
        "library": "pandas_ta"
    },
    "OBV": {  # 能量潮
        "library": "pandas_ta"
    },
    "William_R": {
        "period": 14,
        "library": "pandas_ta"
    },
    "Volume_MA": {
        "periods": [5, 20],
        "library": "pandas"
    },
    "VWAP": {  # 成交量加權均價
        "library": "pandas_ta"
    },
    "Ichimoku": {  # 一目均衡表
        "tenkan": 9,
        "kijun": 26,
        "senkou": 52,
        "library": "pandas_ta"
    },
    "CCI": {  # 商品通道指標
        "period": 20,
        "library": "pandas_ta"
    },
    "MFI": {  # 資金流量指標
        "period": 14,
        "library": "pandas_ta"
    }
}

1.3 VerifierAgent

檔案: backend/agents/verifier.py

職責: 驗證分析結果的合理性

類別定義:

class VerifierAgent(BaseAgent):
    """驗證 Agent"""

    async def verify(
        self,
        analysis: str,
        criteria: List[str],
        stock_data: StockData
    ) -> VerificationResult:
        """
        驗證分析結果

        Args:
            analysis: 分析結果文字
            criteria: 驗證標準(由 Meta-Agent 生成)
            stock_data: 原始股票資料

        Returns:
            VerificationResult
        """
        failed_criteria = []
        details = {}

        for criterion in criteria:
            passed, detail = await self._check_criterion(
                analysis, criterion, stock_data
            )
            if not passed:
                failed_criteria.append(criterion)
            details[criterion] = detail

        return VerificationResult(
            passed=(len(failed_criteria) == 0),
            failed_criteria=failed_criteria,
            details=details
        )

    async def _check_criterion(
        self,
        analysis: str,
        criterion: str,
        stock_data: StockData
    ) -> Tuple[bool, str]:
        """檢查單一驗證標準"""
        # 使用 LLM 進行語義驗證
        prompt = f"""
        驗證以下分析是否符合標準:

        標準: {criterion}

        分析內容:
        {analysis}

        參考資料:
        {stock_data.summary()}

        回答格式:
        {{
          "passed": true/false,
          "reason": "原因說明"
        }}
        """

        result = await self.llm.generate_structured(
            prompt=prompt,
            schema={
                "type": "object",
                "properties": {
                    "passed": {"type": "boolean"},
                    "reason": {"type": "string"}
                }
            }
        )

        return result["passed"], result["reason"]


2. LangGraph 工作流程

2.1 StockAnalysisWorkflow

檔案: backend/agents/coordinator.py

用途: 使用 LangGraph 編排完整分析流程

狀態定義:

from typing import TypedDict
from langgraph.graph import StateGraph, END

class AnalysisState(TypedDict):
    """分析工作流程狀態"""

    # 輸入
    ticker: str
    analysis_type: str
    timeframe: str

    # 中間狀態
    strategy: Optional[VRRStrategy]
    stock_data: Optional[StockData]
    knowledge: Optional[List[str]]
    initial_analysis: Optional[str]

    # VRR 狀態
    verification_result: Optional[VerificationResult]
    reflection_result: Optional[ReflectionResult]
    iteration: int

    # 輸出
    final_analysis: Optional[AnalysisResult]
    error: Optional[str]

工作流程圖:

class StockAnalysisWorkflow:
    """股票分析 LangGraph 工作流程"""

    def __init__(
        self,
        meta_agent: MetaAgent,
        analyzer: StockAnalyzer,
        calculator: TechnicalCalculator,
        verifier: VerifierAgent,
        db_session: AsyncSession,
        rag_service: RAGService
    ):
        self.meta_agent = meta_agent
        self.analyzer = analyzer
        self.calculator = calculator
        self.verifier = verifier
        self.db = db_session
        self.rag = rag_service

        self.graph = self._build_graph()

    def _build_graph(self) -> StateGraph:
        """建立工作流程圖"""

        workflow = StateGraph(AnalysisState)

        # 節點
        workflow.add_node("generate_strategy", self._generate_strategy)
        workflow.add_node("fetch_data", self._fetch_data)
        workflow.add_node("fetch_knowledge", self._fetch_knowledge)
        workflow.add_node("calculate_indicators", self._calculate_indicators)
        workflow.add_node("generate_analysis", self._generate_analysis)
        workflow.add_node("verify", self._verify)
        workflow.add_node("reflect", self._reflect)
        workflow.add_node("refine", self._refine)

        # 邊
        workflow.set_entry_point("generate_strategy")
        workflow.add_edge("generate_strategy", "fetch_data")
        workflow.add_edge("fetch_data", "fetch_knowledge")
        workflow.add_edge("fetch_knowledge", "calculate_indicators")
        workflow.add_edge("calculate_indicators", "generate_analysis")
        workflow.add_edge("generate_analysis", "verify")

        # 條件邊: 驗證通過 -> END, 失敗 -> 反思
        workflow.add_conditional_edges(
            "verify",
            self._should_refine,
            {
                "continue": "reflect",
                "end": END
            }
        )
        workflow.add_edge("reflect", "refine")
        workflow.add_edge("refine", "verify")

        return workflow.compile()

    async def _generate_strategy(self, state: AnalysisState) -> AnalysisState:
        """節點: 生成策略"""
        strategy = await self.meta_agent.generate_strategy(
            task_description=f"分析 {state['ticker']}",
            domain="investment",
            context={
                "ticker": state["ticker"],
                "analysis_type": state["analysis_type"]
            }
        )
        state["strategy"] = strategy
        return state

    async def _fetch_data(self, state: AnalysisState) -> AnalysisState:
        """節點: 獲取股票資料"""
        # 從資料庫讀取
        stock_data = await self._query_stock_data(
            state["ticker"],
            state["timeframe"]
        )
        state["stock_data"] = stock_data
        return state

    async def _fetch_knowledge(self, state: AnalysisState) -> AnalysisState:
        """節點: 獲取領域知識"""
        knowledge = await self.rag.query(
            question=f"{state['ticker']} 技術分析知識",
            k=5
        )
        state["knowledge"] = knowledge.sources
        return state

    async def _calculate_indicators(self, state: AnalysisState) -> AnalysisState:
        """節點: 計算技術指標"""
        # 如果資料庫已有預算指標,直接讀取
        # 否則實時計算
        indicators = await self.calculator.calculate_indicators(
            ticker=state["ticker"],
            ohlc_data=state["stock_data"].ohlc,
            indicators=list(INDICATORS_CONFIG.keys())
        )
        state["stock_data"].indicators = indicators
        return state

    async def _generate_analysis(self, state: AnalysisState) -> AnalysisState:
        """節點: 生成分析"""
        analysis = await self.analyzer._generate_analysis(
            ticker=state["ticker"],
            stock_data=state["stock_data"],
            knowledge=state["knowledge"],
            analysis_type=state["analysis_type"]
        )
        state["initial_analysis"] = analysis
        state["iteration"] = 0
        return state

    async def _verify(self, state: AnalysisState) -> AnalysisState:
        """節點: 驗證分析"""
        # 使用當前分析(initial 或 refined)
        current_analysis = (
            state.get("refined_analysis") or state["initial_analysis"]
        )

        verification = await self.verifier.verify(
            analysis=current_analysis,
            criteria=state["strategy"].verify_criteria,
            stock_data=state["stock_data"]
        )
        state["verification_result"] = verification
        return state

    async def _reflect(self, state: AnalysisState) -> AnalysisState:
        """節點: 反思問題"""
        # 使用 LLM 分析失敗原因
        reflection_prompt = f"""
        分析結果驗證失敗,請反思問題:

        失敗標準:
        {state["verification_result"].failed_criteria}

        原始分析:
        {state.get("refined_analysis") or state["initial_analysis"]}

        反思重點:
        {state["strategy"].reflect_focus}

        請指出:
        1. 問題所在
        2. 根本原因
        3. 改進建議
        """

        reflection_text = await self.analyzer.llm.generate(reflection_prompt)

        state["reflection_result"] = ReflectionResult(
            identified_issues=[],  # 從 reflection_text 解析
            root_causes=[],
            improvement_suggestions=[]
        )
        return state

    async def _refine(self, state: AnalysisState) -> AnalysisState:
        """節點: 改進分析"""
        refine_prompt = f"""
        基於反思結果改進分析:

        原始分析:
        {state.get("refined_analysis") or state["initial_analysis"]}

        反思結果:
        {state["reflection_result"]}

        改進優先順序:
        {state["strategy"].refine_priority}

        請提供改進後的分析。
        """

        refined = await self.analyzer.llm.generate(refine_prompt)
        state["refined_analysis"] = refined
        state["iteration"] += 1
        return state

    def _should_refine(self, state: AnalysisState) -> str:
        """決策函數: 是否需要改進"""
        if state["verification_result"].passed:
            # 驗證通過,結束
            state["final_analysis"] = self._build_final_result(state)
            return "end"

        if state["iteration"] >= 3:
            # 達到最大迭代次數,強制結束
            state["final_analysis"] = self._build_final_result(state)
            state["error"] = "達到最大迭代次數,分析可能不完整"
            return "end"

        # 繼續改進
        return "continue"

    def _build_final_result(self, state: AnalysisState) -> AnalysisResult:
        """建構最終結果"""
        final_text = state.get("refined_analysis") or state["initial_analysis"]

        # 解析 LLM 輸出為結構化結果
        return AnalysisResult(
            ticker=state["ticker"],
            summary=final_text,
            # ... 解析其他欄位
            verification_passed=state["verification_result"].passed,
            iterations=state["iteration"]
        )

    async def run(
        self,
        ticker: str,
        analysis_type: str = "comprehensive",
        timeframe: str = "3_months"
    ) -> AnalysisResult:
        """執行完整工作流程"""
        initial_state: AnalysisState = {
            "ticker": ticker,
            "analysis_type": analysis_type,
            "timeframe": timeframe,
            "iteration": 0
        }

        final_state = await self.graph.ainvoke(initial_state)
        return final_state["final_analysis"]


3. 資料模型

3.1 StockData

檔案: backend/agents/models.py

from pydantic import BaseModel
from datetime import datetime
import pandas as pd

class StockData(BaseModel):
    """股票資料模型"""

    ticker: str
    name: str
    industry: Optional[str] = None

    # OHLC 資料
    ohlc: pd.DataFrame  # columns: [date, open, high, low, close, volume]

    # 技術指標
    indicators: Dict[str, Any] = {}

    # 統計資訊
    current_price: float
    price_change_pct: float
    volume_avg: float

    # 時間範圍
    start_date: datetime
    end_date: datetime

    class Config:
        arbitrary_types_allowed = True  # 允許 pd.DataFrame

    def summary(self) -> str:
        """生成資料摘要"""
        return f"""
        股票: {self.ticker} ({self.name})
        當前價格: {self.current_price}
        漲跌幅: {self.price_change_pct:.2f}%
        資料範圍: {self.start_date} ~ {self.end_date}
        指標數量: {len(self.indicators)}
        """

class AnalysisResult(BaseModel):
    """分析結果模型"""

    ticker: str
    timestamp: datetime = Field(default_factory=datetime.now)

    # 分析內容
    summary: str
    trend: Literal["bullish", "bearish", "neutral"]
    trend_short: Optional[str] = None  # 短期趨勢
    trend_medium: Optional[str] = None  # 中期趨勢

    # 關鍵價位
    support_levels: List[float] = []
    resistance_levels: List[float] = []

    # 技術指標解讀
    indicators_interpretation: Dict[str, str] = {}

    # 風險提示
    risks: List[str] = []

    # 建議
    recommendations: List[str] = []

    # 元資料
    confidence: float  # 0-1
    verification_passed: bool
    iterations: int

    # 圖表資料
    chart_data: Optional[Dict[str, Any]] = None

4. 投資領域知識

4.1 InvestmentKnowledge

檔案: backend/knowledge/stock_knowledge.py

用途: 管理投資分析相關的領域知識

類別定義:

from core.knowledge import DomainKnowledge

class InvestmentKnowledge(DomainKnowledge):
    """投資領域知識管理"""

    async def initialize(self) -> None:
        """初始化知識庫"""

        # 載入知識文件
        knowledge_docs = [
            self._load_technical_analysis_basics(),
            self._load_indicator_interpretations(),
            self._load_market_concepts(),
            self._load_risk_management()
        ]

        # 加入向量資料庫
        await self.rag_service.add_knowledge(
            documents=knowledge_docs,
            metadata={"domain": "investment"}
        )

    def _load_technical_analysis_basics(self) -> List[Document]:
        """載入技術分析基礎知識"""
        # 從 markdown 檔案讀取
        # docs/knowledge/technical_analysis.md
        pass

    def _load_indicator_interpretations(self) -> List[Document]:
        """載入指標解讀知識"""
        # docs/knowledge/indicators/*.md
        # - rsi.md
        # - macd.md
        # - ma.md
        # - etc.
        pass

    def get_concepts(self) -> List[str]:
        """獲取核心概念"""
        return [
            "趨勢線",
            "支撐壓力",
            "技術指標",
            "K線型態",
            "成交量分析",
            "風險管理"
        ]

知識文件範例 (docs/knowledge/indicators/rsi.md):

# RSI (Relative Strength Index) 相對強弱指標

## 定義
RSI 是衡量價格變動速度和幅度的動量指標,範圍 0-100。

## 計算方法
RSI = 100 - (100 / (1 + RS))
其中 RS = 平均上漲幅度 / 平均下跌幅度(通常 14 日)

## 解讀
- **RSI > 70**: 超買區,可能面臨回調
- **RSI < 30**: 超賣區,可能出現反彈
- **RSI 50**: 中性區,多空均勢

## 注意事項
- 強勢行情中,RSI 可能長期停留在超買區
- 應結合其他指標綜合判斷
- 背離訊號(價格創新高但 RSI 未創新高)值得關注

## 常見錯誤
- 僅依賴 RSI 單一指標做決策
- 忽略市場大趨勢
- 在震盪市中過度交易


5. 配置檔案

5.1 markets.yaml

檔案: backend/config/markets.yaml

markets:
  taiwan:
    enabled: true
    source: yfinance
    market_type: full  # full: 全市場, custom: 自訂清單
    suffix: .TW

    # 全市場模式:自動爬取台股清單
    auto_fetch_tickers: true
    fetch_url: "https://isin.twse.com.tw/isin/C_public.jsp?strMode=2"

    # 或使用靜態清單
    tickers_file: null

    # 市場資訊
    timezone: Asia/Taipei
    trading_hours:
      start: "09:00"
      end: "13:30"

  us:
    enabled: true
    source: yfinance
    market_type: custom

    # 七巨頭清單
    tickers:
      - AAPL    # Apple
      - MSFT    # Microsoft
      - GOOGL   # Alphabet
      - AMZN    # Amazon
      - NVDA    # NVIDIA
      - META    # Meta
      - TSLA    # Tesla

    timezone: America/New_York
    trading_hours:
      start: "09:30"
      end: "16:00"

  japan:
    enabled: false  # Phase 2

data_settings:
  start_date: "2020-01-01"
  end_date: null  # null = 至今

  # 更新排程
  update_schedule:
    cron: "0 6 * * *"  # 每天早上 6:00 (台北時間)
    timezone: Asia/Taipei

  # 重試設定
  retry:
    max_attempts: 3
    backoff_factor: 2
    timeout_seconds: 30

5.2 indicators.yaml

檔案: backend/config/indicators.yaml

indicators:
  MA:
    enabled: true
    periods: [5, 10, 20, 50, 100, 200]
    library: pandas

  EMA:
    enabled: true
    periods: [5, 10, 20, 50, 100, 200]
    library: pandas

  RSI:
    enabled: true
    period: 14
    library: pandas_ta

  MACD:
    enabled: true
    fast: 12
    slow: 26
    signal: 9
    library: pandas_ta

  KD:
    enabled: true
    k_period: 9
    d_period: 3
    smooth: 3
    library: pandas_ta

  BB:  # Bollinger Bands
    enabled: true
    period: 20
    std: 2
    library: pandas_ta

  ATR:
    enabled: true
    period: 14
    library: pandas_ta

  ADX:
    enabled: true
    period: 14
    library: pandas_ta

  OBV:
    enabled: true
    library: pandas_ta

  William_R:
    enabled: true
    period: 14
    library: pandas_ta

  Volume_MA:
    enabled: true
    periods: [5, 20]
    library: pandas

  VWAP:
    enabled: true
    library: pandas_ta

  Ichimoku:
    enabled: true
    tenkan: 9
    kijun: 26
    senkou: 52
    library: pandas_ta

  CCI:
    enabled: true
    period: 20
    library: pandas_ta

  MFI:
    enabled: true
    period: 14
    library: pandas_ta

# 預算設定
precompute:
  enabled: true  # 是否預先計算並存入資料庫
  batch_size: 100  # 批次處理大小

6. 系統 Prompts

檔案: backend/prompts/system_prompts.py

STOCK_ANALYST_SYSTEM_PROMPT = """
你是一位專業的股票技術分析師,具有以下特質:

1. **客觀中立**: 基於數據和技術指標進行分析,避免情緒化判斷
2. **風險意識**: 總是提醒投資風險,明確指出不確定性
3. **專業術語**: 使用正確的技術分析術語
4. **結構化表達**: 條理清晰,邏輯嚴謹
5. **教育導向**: 解釋技術指標的含義,幫助用戶理解

**重要原則**:
- 所有分析「僅供參考,非投資建議」
- 不做價格預測或買賣推薦
- 承認分析的局限性
- 鼓勵用戶多方面研究

**語言**: 繁體中文(台灣用戶)或英文(美股用戶)
"""

META_AGENT_SYSTEM_PROMPT = """
你是一個 Meta-Agent,負責為股票分析任務生成 Verify-Reflect-Refine 策略。

你的目標是:
1. 分析任務需求
2. 識別關鍵驗證點
3. 預見可能的失敗模式
4. 設計有效的驗證標準

輸出 JSON 格式的策略,包含:
- verify_criteria: 具體可檢查的驗證點
- reflect_focus: 失敗時應反思的面向
- refine_priority: 改進的優先順序
"""

文檔版本: 1.0
最後更新: 2025-02-01

(繼續閱讀 DATA_PIPELINE_SPEC.md 了解資料管道實現)