一眼看穿策略状态!PTrade 自定义可视化监控仪表盘
发布时间:1小时前阅读:37
很多量化投资者都有这样的困扰:
策略运行的时候,只能看枯燥的日志和数字,不知道策略的实时运行状态,也不知道当前的盈亏、持仓、风险情况。
如果能有一个可视化的仪表盘,实时显示这些信息,那就太方便了。
PTrade 提供了强大的自定义绘图功能,你可以在策略中绘制实时的净值曲线、持仓饼图、盈亏柱状图、风险指标等,制作出专业的量化监控仪表盘,让你一眼就能看穿策略的运行状态。
PTrade 绘图功能简介
PTrade 的绘图功能基于 Matplotlib 库,支持所有 Matplotlib 的绘图类型,包括:
- 折线图:用于显示净值曲线、价格走势等
- 柱状图:用于显示每日盈亏、成交量等
- 饼图:用于显示持仓分布、行业分布等
- 散点图:用于显示收益分布、风险收益比等
- 热力图:用于显示行业轮动、因子表现等
你可以在策略的handlebar函数中调用绘图函数,每次 K 线结束时自动更新图表,实现实时监控。
实战:制作一个完整的量化监控仪表盘
以下是一个完整的示例,制作一个包含净值曲线、持仓饼图、每日盈亏柱状图和风险指标的监控仪表盘。
python
运行
# -*- coding: gbk -*-
"""
PTrade量化监控仪表盘示例
"""
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from datetime import datetime
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def init(context):
# 策略配置
context.stocks = ["000001.SZ", "000002.SZ", "000004.SZ", "000005.SZ", "000006.SZ"]
context.initial_capital = context.get_account().total_assets
context.net_values = []
context.dates = []
context.daily_pnl = []
# 创建图表
context.fig = plt.figure(figsize=(16, 10))
context.fig.suptitle("量化策略实时监控仪表盘", fontsize=20)
# 子图1:净值曲线
context.ax1 = context.fig.add_subplot(2, 2, 1)
context.ax1.set_title("净值曲线", fontsize=14)
context.ax1.set_xlabel("日期")
context.ax1.set_ylabel("净值")
context.ax1.grid(True)
# 子图2:持仓分布饼图
context.ax2 = context.fig.add_subplot(2, 2, 2)
context.ax2.set_title("持仓分布", fontsize=14)
# 子图3:每日盈亏柱状图
context.ax3 = context.fig.add_subplot(2, 2, 3)
context.ax3.set_title("每日盈亏", fontsize=14)
context.ax3.set_xlabel("日期")
context.ax3.set_ylabel("盈亏(元)")
context.ax3.grid(True)
# 子图4:风险指标
context.ax4 = context.fig.add_subplot(2, 2, 4)
context.ax4.set_title("风险指标", fontsize=14)
context.ax4.axis('off') # 隐藏坐标轴
# 调整子图间距
context.fig.tight_layout(rect=[0, 0, 1, 0.96])
# 显示图表
plt.show(block=False)
def handlebar(context):
# 获取当前日期
current_date = datetime.now().strftime("%Y-%m-%d")
# 计算当前净值
current_assets = context.get_account().total_assets
net_value = current_assets / context.initial_capital
# 更新净值数据
if not context.dates or current_date != context.dates[-1]:
context.dates.append(current_date)
context.net_values.append(net_value)
# 计算每日盈亏
if len(context.net_values) > 1:
daily_pnl = current_assets - context.get_account().total_assets - (context.net_values[-2] * context.initial_capital)
context.daily_pnl.append(daily_pnl)
else:
context.daily_pnl.append(0)
# 清空所有子图
context.ax1.clear()
context.ax2.clear()
context.ax3.clear()
context.ax4.clear()
# 绘制净值曲线
context.ax1.plot(context.dates, context.net_values, label="策略净值", linewidth=2)
context.ax1.axhline(y=1, color='r', linestyle='--', label="初始净值")
context.ax1.set_title("净值曲线", fontsize=14)
context.ax1.set_xlabel("日期")
context.ax1.set_ylabel("净值")
context.ax1.legend()
context.ax1.grid(True)
# 旋转x轴标签,避免重叠
context.ax1.tick_params(axis='x', rotation=45)
# 绘制持仓分布饼图
positions = context.get_positions()
labels = []
sizes = []
for position in positions:
if position.quantity > 0:
market_value = position.quantity * position.last_price
labels.append(position.stock_code)
sizes.append(market_value)
# 如果有现金,添加现金项
cash = context.get_account().cash
if cash > 0:
labels.append("现金")
sizes.append(cash)
if sizes:
context.ax2.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)
context.ax2.set_title("持仓分布", fontsize=14)
# 绘制每日盈亏柱状图
if len(context.daily_pnl) > 0:
colors = ['g' if x >= 0 else 'r' for x in context.daily_pnl]
context.ax3.bar(context.dates, context.daily_pnl, color=colors)
context.ax3.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
context.ax3.set_title("每日盈亏", fontsize=14)
context.ax3.set_xlabel("日期")
context.ax3.set_ylabel("盈亏(元)")
context.ax3.tick_params(axis='x', rotation=45)
context.ax3.grid(True)
# 计算并显示风险指标
if len(context.net_values) > 1:
# 计算收益率
returns = np.diff(context.net_values) / context.net_values[:-1]
# 年化收益率
annual_return = (net_value ** (252 / len(returns))) - 1
# 最大回撤
max_drawdown = 0
peak = context.net_values[0]
for nv in context.net_values:
if nv > peak:
peak = nv
drawdown = (peak - nv) / peak
if drawdown > max_drawdown:
max_drawdown = drawdown
# 夏普比率(假设无风险收益率为3%)
sharpe_ratio = (np.mean(returns) * 252 - 0.03) / (np.std(returns) * np.sqrt(252)) if np.std(returns) > 0 else 0
# 胜率
win_rate = sum(1 for pnl in context.daily_pnl if pnl > 0) / len(context.daily_pnl) if context.daily_pnl else 0
# 显示风险指标
risk_text = f"""
总收益率:{(net_value - 1):.2%}
年化收益率:{annual_return:.2%}
最大回撤:{max_drawdown:.2%}
夏普比率:{sharpe_ratio:.2f}
胜率:{win_rate:.2%}
交易天数:{len(context.dates)}
"""
context.ax4.text(0.1, 0.9, risk_text, fontsize=12, verticalalignment='top')
context.ax4.set_title("风险指标", fontsize=14)
context.ax4.axis('off')
# 刷新图表
context.fig.canvas.draw()
context.fig.canvas.flush_events()
def after_trading(context):
# 收盘后保存图表
current_date = datetime.now().strftime("%Y%m%d")
context.fig.savefig(f"dashboard_{current_date}.png", dpi=300, bbox_inches='tight')
print(f"仪表盘已保存为:dashboard_{current_date}.png")
仪表盘功能说明
这个仪表盘包含四个核心部分:
- 净值曲线:实时显示策略的净值走势,和初始净值对比,直观展示策略的收益情况。
- 持仓分布饼图:显示当前的持仓分布,包括每只股票的市值占比和现金占比,让你一目了然地知道资金的去向。
- 每日盈亏柱状图:显示每天的盈亏情况,绿色表示盈利,红色表示亏损,直观展示策略的每日表现。
- 风险指标:显示总收益率、年化收益率、最大回撤、夏普比率、胜率等核心风险指标,让你全面了解策略的风险收益特征。
此外,每天收盘后,仪表盘会自动保存为图片文件,方便你复盘和记录。
进阶:添加更多监控内容
你可以根据自己的需求,在仪表盘中添加更多的监控内容:
- 行业分布饼图:显示持仓的行业分布,避免行业集中度过高。
- 因子暴露图:显示策略在价值、成长、动量等因子上的暴露情况。
- 交易记录表格:显示最近的交易记录,包括买卖时间、价格、数量、盈亏等。
- 实时行情图:显示持仓股票的实时价格走势。
如果你想学习更多可视化的技巧,或者需要现成的仪表盘模板,欢迎点我头像私信。我会免费为你开通 PTrade 量化权限,提供一对一的可视化开发指导,以及专业的量化监控仪表盘模板。
风险提示:可视化监控仅作为策略运行状态的参考,不能消除投资风险。量化交易存在市场风险、策略失效风险等。本内容仅为投资者教育目的,不构成任何投资建议。
免责声明:本栏目刊载的信息力求准确可靠,但对信息的准确性或完整性不作任何保证,亦不对因使用该等信息而引发的损失承担责任。
温馨提示:投资有风险,选择需谨慎。
-
REITs打新:本周共有4个商业REITs基金发售:唯品商业、首农商业、砂之船和地产商业
2026-05-25 16:03
-
网格交易条件单怎么选?小叩深度测评国金、华泰、国泰海通三大主流券商APP
2026-05-25 16:03
-
聪明投资者都会做的止盈止损,应该如何设置?(附自动交易工具)
2026-05-25 16:03


问一问

+微信
分享该文章
