问题描述
解决方案
在 PTrade 量化交易平台中,Seaborn 是一个基于 Matplotlib 的高级数据可视化库,非常适合在 研究(Research) 环境中对策略的回测结果、历史行情或因子数据进行统计分析。
通常,我们在“回测”模块生成交易记录,然后在“研究”模块中提取数据并画图分析。
以下是如何在 PTrade 研究环境中使用 Seaborn 进行策略结果分析的完整流程和代码示例。
核心步骤
- 获取数据:使用
get_price获取标的的历史数据(模拟策略净值)和基准数据。 - 数据处理:计算日收益率、累计收益率等指标。
- 绘图分析:
- 收益分布图 (Histogram/KDE):分析策略收益的波动性和肥尾特征。
- 累计收益曲线 (Line Plot):对比策略与基准的走势。
- 相关性热力图 (Heatmap):分析策略与大盘的相关性。
PTrade 研究环境代码示例
您可以将以下代码直接复制到 PTrade 的 研究(Notebook) 单元格中运行。
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 1. 设置绘图风格
#设置风格为 darkgrid,适合金融数据展示
sns.set_theme(style="darkgrid")
# 处理中文显示问题 (根据PTrade环境不同,可能需要调整字体,这里使用通用设置)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 2. 获取数据 (模拟策略分析场景)
# 假设我们要分析 '600570.SS' (恒生电子) 作为策略标的,对比 '000300.SS' (沪深300)
# 获取过去 250 个交易日的数据
stock_code = '600570.SS'
benchmark_code = '000300.SS'
count = 250
# 使用 PTrade API 获取收盘价
df_stock = get_price(stock_code, count=count, frequency='1d', fields=['close'])
df_bench = get_price(benchmark_code, count=count, frequency='1d', fields=['close'])
# 3. 数据处理
# 提取收盘价列并重命名
data = pd.DataFrame({
'Strategy': df_stock['close'],
'Benchmark': df_bench['close']
})
# 计算日收益率 (Pct Change)
returns = data.pct_change().dropna()
# 计算累计收益率 (Cumulative Returns)
cum_returns = (1 + returns).cumprod() - 1
# 4. 使用 Seaborn 进行可视化分析
# --- 图表 1: 收益率分布分析 (直方图 + 核密度估计) ---
plt.figure(figsize=(12, 6))
plt.title('日收益率分布对比 (Daily Returns Distribution)', fontsize=14)
# 绘制策略收益分布
sns.histplot(returns['Strategy'], kde=True, stat="density", color="blue", label='Strategy', alpha=0.4)
# 绘制基准收益分布
sns.histplot(returns['Benchmark'], kde=True, stat="density", color="red", label='Benchmark', alpha=0.4)
plt.legend()
plt.show()
# --- 图表 2: 累计收益趋势对比 (折线图) ---
plt.figure(figsize=(12, 6))
plt.title('累计收益率趋势 (Cumulative Returns)', fontsize=14)
# Seaborn lineplot 需要长格式数据(Long Format)或直接传入 Series
sns.lineplot(data=cum_returns)
plt.ylabel('Cumulative Returns')
plt.xlabel('Date')
plt.show()
# --- 图表 3: 收益相关性热力图 (Heatmap) ---
plt.figure(figsize=(8, 6))
plt.title('策略与基准相关性矩阵 (Correlation Matrix)', fontsize=14)
# 计算相关系数矩阵
corr_matrix = returns.corr()
# 绘制热力图,annot=True 显示数值,cmap='coolwarm' 设置冷暖色调
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1, square=True)
plt.show()
# --- 图表 4: 联合分布图 (Jointplot) ---
# 用于观察策略收益与基准收益的回归关系
g = sns.jointplot(x="Benchmark", y="Strategy", data=returns, kind="reg", height=8, color="m")
g.fig.suptitle('策略 vs 基准 回归分析', y=1.02, fontsize=14)
plt.show()
代码解析
-
数据准备:
- 利用
get_price获取了股票和指数的收盘价。在实际策略分析中,您可以将df_stock替换为您回测产生的实际净值序列。 - 计算了
pct_change()(日涨跌幅)和cumprod()(累计净值),这是量化分析的基础数据。
- 利用
-
图表 1:收益分布 (histplot):
- 作用:观察策略收益是否服从正态分布,是否存在“肥尾”现象(即极端行情发生的概率是否比正态分布高)。
- Seaborn 优势:
kde=True参数可以自动添加核密度曲线,直观展示概率密度。
-
图表 2:累计收益 (lineplot):
- 作用:最直观的业绩展示,对比策略与基准的跑赢/跑输情况。
- Seaborn 优势:自动处理时间序列索引作为 X 轴,且默认配色美观。
-
图表 3:相关性热力图 (heatmap):
- 作用:分析策略是否只是简单的 Beta 收益(即随大盘涨跌)。如果相关性过高(接近 1),说明策略缺乏 Alpha(超额收益);如果相关性较低且收益为正,说明策略具有独特的抗风险能力。
-
图表 4:联合分布 (jointplot):
- 作用:展示策略收益与基准收益的散点图,并拟合回归线。回归线的斜率近似于策略的 Beta 值。
常见问题 (Q&A)
Q: 为什么在 PTrade 中中文显示为方框?
A: 这是因为 Matplotlib 默认字体不支持中文。代码中 plt.rcParams['font.sans-serif'] = ['SimHei'] 是用来指定黑体字体的。如果 PTrade 服务器未安装 SimHei,可以尝试使用 Microsoft YaHei 或 WenQuanYi Micro Hei,或者直接使用英文标签以避免乱码。
Q: 如何分析策略的最大回撤?
A: Seaborn 主要用于统计绘图。计算回撤通常先通过 Pandas 计算 drawdown = (cum_returns + 1) / (cum_returns + 1).cummax() - 1,然后使用 sns.lineplot 绘制回撤区域图(fill_between 效果在 Matplotlib 中实现更方便,但 Seaborn 也可以画线)。
Q: 这段代码可以在“回测”模式的 handle_data 中运行吗?
A: 不建议。handle_data 是逐根 K 线运行的,频率极高。绘图操作非常耗时,会严重拖慢回测速度,且回测日志中无法交互式查看图表。请在回测结束后的 “研究” 模块中运行此代码。