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
Bases: Analysis
分析台股策略流動性風險項目的機率
Note
參考VIP限定文章更了解流動性檢測內容細節。
Args: required_volume (int): 要求進出場時的單日成交股數至少要多少? required_turnover (int): 要求進出場時的單日成交金額至少要多少元?避免成交股數夠,但因低價股因素,造成胃納量仍無法符合資金需求。
Examples:

風險閾值建議
buy_high或sell_low> 10%: 可能無法順利成交low_volume_stocks> 20%: 大資金可能無法全部執行處置股> 5%: 策略可能專挑高風險標的
InequalityAnalysis - 不等式因子分析
finlab.analysis.inequalityAnalysis.InequalityAnalysis
Bases: Analysis
Analyze return of trades with condition inequality
| PARAMETER | DESCRIPTION |
|---|---|
name
|
name of the condition
TYPE:
|
df
|
value used in condition. If df is None,
TYPE:
|
date_type
|
can be either
TYPE:
|
target
|
the target to optimize. Any column name in report.get_trades()
TYPE:
|
Examples:

穩健性判斷
- Gini 係數 > 0.7: 報酬過度集中,需分散風險
- 前 5% 股票貢獻 > 50% 報酬: 策略穩健性不足
PeriodStatsAnalysis - 時期穩定性分析
finlab.analysis.periodStatsAnalysis.PeriodStatsAnalysis
Bases: Analysis
分析台股策略的不同時期與大盤指標作比較
Examples:
可以執行以下程式碼來產生分析結果:
產生的結果:
| 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 分析
理想指標
- Alpha > 0: 策略有超額報酬
- Beta 0.5-1.5: 市場相關性適中
- Beta < 0: 策略與市場負相關(適合避險)
DrawdownAnalysis - 回撤分析
finlab.analysis.drawdownAnalysis.DrawdownAnalysis
Bases: Analysis
風險控制
- 最大回撤 > -50%: 風險過高
- 回撤持續時間 > 1 年: 策略可能長期失效
MaeMfeAnalysis - 波動分析
finlab.analysis.maeMfeAnalysis.MaeMfeAnalysis
Bases: Analysis
停損停利優化
- 停損點 = MAE 的 75 分位數 × 1.2
- 停利點 = GMFE 的 75 分位數 × 0.8
- Missed Win-profits PCT < 20%: 適合使用移動停利
自訂分析模組
假如希望開發交易分析系統,可以繼承 finlab.analysis.Analysis 來實做分析。
finlab.analysis.Analysis
Bases: ABC
analyze
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
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 result
When implement this function, returning Plotly figure instance is recommended.
自訂範例
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 |