305-如何创建新的可视化模块并发布
由qxiao创建,最终由qxiao 被浏览 4 用户
导语
可视化策略开发是一种高效的开发方式,但平台只提供了部分经常使用的一些模块,如果用户自己有不同的加工处理逻辑,我们怎么新建一个模块并发布上线呢。本文主要对此进行介绍,并给出详细的使用示例。
虽然我们的回测模块会输出累计收益率曲线,但这并不是净值曲线(NAV),净值曲线起点是1,大于1 表示盈利,小于1表示亏损。我们今天演示如何开发一个绘制净值曲线与动态回撤曲线的可视化模块。
打开一个画布
我们进入AIStudio,直接点击新建➕按钮,选择”可视化AI策略-基础版“,我们新建一个带画布的策略。
拖入自定义模块到画布
我们在画布的左侧,需要找到”自定义模块“。如何寻找呢?我们直接在搜索框输入”自定义“3个字,在”通用“目录下,我们找到了”自定义模块“。直接鼠标拖入这个模块到画布。
因为我们的上游模块是”BigTrader高性能回测“模块,因此我们直接连线到”自定义模块“,如图:
\
写入代码到自定义模块
我们的绩效数据来自m19模块,净值和动态回撤的代码,可以直接大模型帮我们编写,我们直接将代码写入到拖入的这个自定义模块中。
具体代码:
from bigmodule import I
def bigquant_run(
input_1: I.port("某个输入端,对这个输入数据源的说明") = None,
param1: I.int("没有限制的int参数") = 10,
param2: I.int("一个int参数", min = 0, max = 100) = 50,
param3: I.float("一个float参数", min = -100.21, max = 10) = 0.23,
)->[
I.port("一个DataFrame", "data")
]:
# 读取绩效数据
raw_perf = input_1.read()[['returns','date']]
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import dai
def plot_nav_and_drawdown_matplotlib(df, date_col='date', returns_col='returns', initial_nav=1.0,
drawdown_as_pct=True, figsize=(10,6)):
"""
绘制时序净值与动态回撤(Matplotlib 版本,静态图)。
参数:
df: 包含 date_col 与 returns_col 的 DataFrame
date_col: 日期列名
returns_col: 每日收益率列名(小数,例如 0.01 = 1%)
initial_nav: 初始净值(例如 1 或 100)
drawdown_as_pct: True 则回撤以百分比显示(例如 -10%),False 显示绝对差值
figsize: 图像大小
返回:
fig, ax:Matplotlib Figure 与 Axes 对象
"""
data = df.copy()
data[date_col] = pd.to_datetime(data[date_col])
data = data.sort_values(date_col).reset_index(drop=True)
# 将 returns 清洗为数值并填充 NaN (可调整为更合理的处理)
data[returns_col] = pd.to_numeric(data[returns_col], errors='coerce').fillna(0.0)
# 计算 NAV(顺序复利)
data['nav'] = (1 + data[returns_col]).cumprod() * initial_nav
# 历史峰值与回撤
data['cum_max_nav'] = data['nav'].cummax()
data['drawdown'] = data['nav'] / data['cum_max_nav'] - 1.0 # 通常为 <= 0
# 如果想显示为正数百分比的回撤(例如 10%),可用 draw = -drawdown * 100
if drawdown_as_pct:
draw_y = data['drawdown'] * 100.0 # 负数,如 -10.0
draw_label = 'Drawdown (%)'
else:
draw_y = data['drawdown'] # 负数或 0
draw_label = 'Drawdown'
# 开始绘图
fig, (ax_nav, ax_dd) = plt.subplots(2, 1, figsize=figsize, sharex=True,
gridspec_kw={'height_ratios': [3, 1]})
fig.suptitle('时序净值 (NAV) 与 动态回撤', fontsize=14)
# NAV 图
ax_nav.plot(data[date_col], data['nav'], label='NAV', color='tab:blue', linewidth=1.5)
ax_nav.plot(data[date_col], data['cum_max_nav'], label='Peak NAV', color='gray', linestyle='--', linewidth=1.0)
ax_nav.set_ylabel('NAV')
ax_nav.grid(True, linestyle='--', linewidth=0.5, alpha=0.6)
ax_nav.legend(loc='best')
# 回撤图
ax_dd.plot(data[date_col], draw_y, label=draw_label, color='tab:red', linewidth=1.2)
# 填充回撤区域
ax_dd.fill_between(data[date_col], draw_y, 0, where=(draw_y < 0), interpolate=True,
color='tab:red', alpha=0.2)
ax_dd.set_ylabel(draw_label)
ax_dd.set_xlabel('Date')
ax_dd.grid(True, linestyle='--', linewidth=0.5, alpha=0.6)
# 格式化 x 轴的日期显示(更紧凑)
ax_dd.xaxis.set_major_locator(mdates.AutoDateLocator())
ax_dd.xaxis.set_major_formatter(mdates.ConciseDateFormatter(ax_dd.xaxis.get_major_locator()))
# 使布局更紧凑
plt.tight_layout(rect=[0, 0, 1, 0.96])
return fig, data
fig, data_used = plot_nav_and_drawdown_matplotlib(raw_perf, date_col='date', returns_col='returns',
initial_nav=1.0, drawdown_as_pct=True)
plt.show()
return I.Outputs(data=dai.DataSource.write_bdb(raw_perf))
模块的输入和参数:
input_1 # 输入的是dai.DataSource的对象,来自于连线的上一个模块
param1 # 需要用到的参数,本例其实没有用到,可以不要参数
模块的返回:
I.Outputs # 其中返回的是dai.DataSource的对象
保存和发布模块
右键展开模块,点击”另存为模块“,进行模块的发布
发布模块的时候我们需要按要求的格式输入模块名字和模块描述,不能不填,格式也需要填对,格式不对的话发布会失败。
我们的模块名称和模块描述输入如下,然后直接点击”创建并发布“按钮:
\
查看和测试模块
模块发布后,我们可以在页面上看到发布成功的窗口提示。同时,会在aistudio的工作目录下看到这么模块的目录文件。
\
模块升级
\