跳轉到

finlab.analysis

策略分析模組提供深度分析工具,從流動性風險、波動特性、時期穩定性等多個角度評估策略品質。

使用情境

  • 流動性風險檢測: 大資金策略必須檢查是否會遇到成交量不足、漲跌停板等問題
  • 優化停損停利: 透過 MAE/MFE 分析找出最佳的停損停利點
  • 檢視長期穩定性: 分析策略在不同年度、月度的表現是否穩定
  • 評估超額報酬: 透過 Alpha/Beta 分析衡量策略是否有超越大盤的能力
  • 自訂分析邏輯: 繼承 Analysis 類別開發專屬的分析模組

快速範例

from finlab import data
from finlab.backtest import sim

# 完成回測
close = data.get('price:收盤價')
position = close > close.average(20)
report = sim(position, resample='M')

# 1. 流動性檢測
report.run_analysis('LiquidityAnalysis', required_volume=100000)

# 2. 波動分析(MAE/MFE)
report.display_mae_mfe_analysis()

# 3. 時期穩定性分析
report.run_analysis('PeriodStatsAnalysis')

# 4. Alpha/Beta 分析
report.run_analysis('AlphaBetaAnalysis')

內建分析模組對比

模組 用途 關鍵輸出
LiquidityAnalysis 流動性風險檢測 漲跌停、低成交量、處置股比例
MaeMfeAnalysis 波動分析 12 個子圖(MAE/MFE/勝率/Edge Ratio)
PeriodStatsAnalysis 時期穩定性 年度、月度、近期表現
InequalityAnalysis 不等式因子 報酬集中度、基尼係數
AlphaBetaAnalysis Alpha/Beta 超額報酬、市場敏感度
DrawdownAnalysis 回撤分析 回撤事件、持續時間

詳細教學

參考 策略分析模組完整指南,了解:

  • 每個模組的詳細功能與參數說明
  • 如何解讀輸出結果並做出決策
  • 如何繼承 Analysis 類別開發自訂分析
  • 針對不同策略類型的分析重點
  • 分析結果的決策樹

API Reference

LiquidityAnalysis - 流動性風險檢測

finlab.analysis.liquidityAnalysis.LiquidityAnalysis

LiquidityAnalysis(required_volume=200000, required_turnover=1000000)

Bases: Analysis

分析台股策略流動性風險項目的機率

Note

參考VIP限定文章更了解流動性檢測內容細節。

Args: required_volume (int): 要求進出場時的單日成交股數至少要多少? required_turnover (int): 要求進出場時的單日成交金額至少要多少元?避免成交股數夠,但因低價股因素,造成胃納量仍無法符合資金需求。

Examples:

# better syntax
report.run_analysis('LiquidityAnalysis', required_volume=100000)

# original syntax
from finlab.analysis.liquidityAnalysis import LiquidityAnalysis
report.run_analysis(LiquidityAnalysis(required_volume=100000))

is_market_supported

is_market_supported(market)

Check if the market is supported for liquidity analysis.

Currently only Taiwan stock market is supported, as it has unique features like disposal stocks, warning stocks, full delivery stocks, and price limit regulations.

策略流動性檢測

風險閾值建議

  • buy_highsell_low > 10%: 可能無法順利成交
  • low_volume_stocks > 20%: 大資金可能無法全部執行
  • 處置股 > 5%: 策略可能專挑高風險標的

InequalityAnalysis - 不等式因子分析

finlab.analysis.inequalityAnalysis.InequalityAnalysis

InequalityAnalysis(name, df=None, date_type='entry_sig_date', target='return')

Bases: Analysis

Analyze return of trades with condition inequality

PARAMETER DESCRIPTION
name

name of the condition

TYPE: str

df

value used in condition. If df is None, data.get(name) will be automatically perform to fetch the values.

TYPE: DataFrame or None DEFAULT: None

date_type

can be either entry_date, entry_sig_date, exit_date, exit_sig_date.

TYPE: str DEFAULT: 'entry_sig_date'

target

the target to optimize. Any column name in report.get_trades()

TYPE: str DEFAULT: 'return'

Examples:

report.run_analysis('InequalityAnalysis', name='price_earning_ratio:股價淨值比')

策略不等式因子分析

穩健性判斷

  • Gini 係數 > 0.7: 報酬過度集中,需分散風險
  • 前 5% 股票貢獻 > 50% 報酬: 策略穩健性不足

PeriodStatsAnalysis - 時期穩定性分析

finlab.analysis.periodStatsAnalysis.PeriodStatsAnalysis

PeriodStatsAnalysis()

Bases: Analysis

分析台股策略的不同時期與大盤指標作比較

Examples:

可以執行以下程式碼來產生分析結果:

report.run_analysis('PeriodStatsAnalysis')

產生的結果:

benchmark strategy
('overall_daily', 'calmar_ratio') 0.149192 0.0655645
('overall_daily', 'sortino_ratio') 0.677986 0.447837
('overall_daily', 'sharpe_ratio') 0.532014 0.306351
('overall_daily', 'profit_factor') 1.20022 1.07741
('overall_daily', 'tail_ratio') 0.914881 0.987751
('overall_daily', 'return') 0.0835801 0.0478957
('overall_daily', 'volatility') 0.182167 0.312543
('overall_monthly', 'calmar_ratio') 0.155321 0.0731378
('overall_monthly', 'sortino_ratio') 0.697382 0.439003
('overall_monthly', 'sharpe_ratio') 0.524943 0.307292
('overall_monthly', 'profit_factor') 1.75714 1.27059
('overall_monthly', 'tail_ratio') 1.03322 0.903335
('overall_monthly', 'return') 0.0836545 0.0479377
('overall_monthly', 'volatility') 0.186989 0.316178
('overall_yearly', 'calmar_ratio') 0.436075 0.127784
('overall_yearly', 'sortino_ratio') 0.738327 0.694786
('overall_yearly', 'sharpe_ratio') 0.407324 0.350986
('overall_yearly', 'profit_factor') 2.2 1.66667
('overall_yearly', 'tail_ratio') 1.71647 1.359
('overall_yearly', 'return') 0.0814469 0.0663674
('overall_yearly', 'volatility') 0.284742 0.419087

評估標準

  • 策略 sharpe_ratio < benchmark: 策略需改進
  • 某些年度表現特別差: 檢查是否遇到特定市場環境
  • 近期表現大幅衰退: 策略可能失效

AlphaBetaAnalysis - Alpha/Beta 分析

finlab.analysis.alphaBetaAnalysis.AlphaBetaAnalysis

AlphaBetaAnalysis()

Bases: Analysis

理想指標

  • Alpha > 0: 策略有超額報酬
  • Beta 0.5-1.5: 市場相關性適中
  • Beta < 0: 策略與市場負相關(適合避險)

DrawdownAnalysis - 回撤分析

finlab.analysis.drawdownAnalysis.DrawdownAnalysis

Bases: Analysis

風險控制

  • 最大回撤 > -50%: 風險過高
  • 回撤持續時間 > 1 年: 策略可能長期失效

MaeMfeAnalysis - 波動分析

finlab.analysis.maeMfeAnalysis.MaeMfeAnalysis

MaeMfeAnalysis(violinmode='group', mfe_scatter_x='mae', **kwargs)

Bases: Analysis

停損停利優化

  1. 停損點 = MAE 的 75 分位數 × 1.2
  2. 停利點 = GMFE 的 75 分位數 × 0.8
  3. Missed Win-profits PCT < 20%: 適合使用移動停利

自訂分析模組

假如希望開發交易分析系統,可以繼承 finlab.analysis.Analysis 來實做分析。

finlab.analysis.Analysis

Bases: ABC

analyze

analyze(report)

Analyze trading report.

One could assume self.caluclate_trade_info will be executed before self.analyze, so the report.get_trades() will contain the required trade info.

calculate_trade_info

calculate_trade_info(report)

Additional trade info can be calculated easily.

User could override this function if additional trade info is required for later anlaysis.

Examples:

from finlab.analysis import Analysis

class SomeAnalysis(Analysis):
  def calculate_trade_info(self, report):
    return [
      ['股價淨值比', data.get('price_earning_ratio:股價淨值比'), 'entry_sig_date']
    ]

report.run_analysis(SomeAnalysis())
trades = report.get_trades()

assert '股價淨值比@entry_sig_date' in trades.columns

print(trades)

display

display()

Display result

When implement this function, returning Plotly figure instance is recommended.

is_market_supported

is_market_supported(market)

Check if market info is supported

RETURNS DESCRIPTION
bool

True, support. False not support.

自訂範例

from finlab import data
from finlab.analysis import Analysis

class IndustryAnalysis(Analysis):
    """產業分析"""

    def calculate_trade_info(self, report):
        industry = data.get('etl:industry')
        return [['產業', industry, 'entry_sig_date']]

    def analyze(self, report):
        trades = report.get_trades()
        industry_stats = trades.groupby('產業@entry_sig_date')['return'].agg(['count', 'mean'])
        self.result = industry_stats.sort_values('mean', ascending=False)
        return self.result.to_dict()

    def display(self):
        return self.result

# 使用
report.run_analysis(IndustryAnalysis())

最佳實踐

標準分析流程

# Step 1: 基本績效檢視
report.display()

# Step 2: 流動性風險(大資金必檢)
if capital > 1000000:
    report.run_analysis('LiquidityAnalysis', required_volume=100000)

# Step 3: 波動分析(必做)
report.display_mae_mfe_analysis()

# Step 4: 時期穩定性
report.run_analysis('PeriodStatsAnalysis')

# Step 5: Alpha/Beta
report.run_analysis('AlphaBetaAnalysis')

針對不同策略類型

策略類型 重點分析模組
短線交易(日內、週線) MaeMfeAnalysis
長線投資(月線、季線) PeriodStatsAnalysis
大資金策略(> 1000 萬) LiquidityAnalysis
市場中性策略 AlphaBetaAnalysis
高頻交易 DrawdownAnalysis

參考資源