BigQuant使用文档

305-如何创建新的可视化模块并发布

由qxiao创建,最终由stephen1231234 被浏览 7 用户

导语

可视化策略开发是一种高效的开发方式,但平台默认只提供了部分经常使用的一些模块,如果用户自己有不同的加工处理逻辑,需要自己写代码。我们怎么新建一个可视化模块并发布上线呢。本文主要对此进行介绍,并给出详细的使用示例:如何绘制一个净值图。

虽然我们的回测模块会输出累计收益率曲线,但这并不是净值曲线(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的工作目录下看到这么模块的目录文件。


作者如何查看这个模块的原始完整代码呢,还记得我们可以在AIStudio工作目录看到你这个模块名称的文件夹吗。我们直接点击展开这个文件夹,找到init这个py文件,这个文件就是咱的原始完整的模块代码,模块的全部信息都在这个文件中。

\

模块升级

目前模块不能删除,因为上线的模块别人在使用的话,您这边删除了别人的策略会收到影响。但我们可以修改和升级模块。

我们找到模块的文件夹,右键选中”在集成终端中打开“,进入集成终端:



模块内容的修改就是编辑init这个文件,编辑保存后,我们直接在集成终端的窗口运行命令:bq module publish

就完成了模块的修改、升级和重新发布(这是一种命令行发布的方式)。

运行后,我们看到日志 模块发布成功,并可以看到最新的模块版本号。

好的,本文行文至此结束,介绍了模块的创建、发布和升级,小伙伴赶紧去自己开发吧,未来是大模型ai智能时代,你们的模块在哪里呢?


\

评论
  • 👍👍👍
{link}