🔐
上传前先看:我们怎么存你的持仓数据 — 加密保存,数据库里查不到明文。
免费试用 了解详情
Privora 泊睿

Privora 泊睿操作手册

你的云原生数据工作站与量化盯盘神器。无论是构建自动化的数据流水线,还是利用系统内置的 A/H 股数据源运行个人的量化策略,在这里都无需编写繁琐的底层代码即可轻松实现。

新手起步

  • 注册与问卷: 首次注册登录后,系统会引导您填写「欢迎问卷」(所属角色、使用目的等),完成后系统将自动为您播放功能引导(Product Tour),逐一走一遍侧边栏各个模块,帮助您快速熟悉布局。
  • 重新触发引导: 若您跳过了引导,可随时点击左侧导航栏底部的「功能引导」重新学习。
  • 中英切换: 点击侧边栏的「语言」即可实时切换系统语言。

AI 助手

常驻在侧边栏的对话式助手,跳过菜单层级,直接用自然语言完成查询与记账。

1. 入口

  • 登录后,侧边栏底部(语言切换旁)会出现「AI 助手」入口,点击展开对话抽屉;当前以文字输入为主,不需要开麦克风也能使用。该入口仅在管理员为你所在环境启用此功能后才会出现。

2. 能做什么

  • 用自然语言问平台怎么用、查某个看板/资产的数据;也可以问「你能做什么」,它会列出当前对你开放的操作清单。

3. 口述记账

  • 可以口述录入一笔真实持仓交易(买/卖),资产类型覆盖股票、黄金、场外基金(说 6 位基金代码);账户、金额等关键信息会先在确认卡片里回显,你确认后才真正入账。

4. 组合摘要卡

  • 问类似「我的持仓怎么样」的问题,会返回一张汇总卡:合计市值与浮动盈亏一目了然。
口述记账、组合摘要卡等子能力由管理员按功能开关分别启停,具体可用范围以你所在团队的开放情况为准。

首页总览

登录后的第一屏,按你的使用阶段自适应展示统计、待办与场景引导。

1. 六张统计卡

  • 持仓总市值、当日盈亏、订阅数、Token 数、近 7 天 API 调用次数、调度作业总数/活跃数——任意一张卡没有数据时都会给出对应的引导操作(如「去创建 Token」),不会只显示一个冷冰冰的 0。

2. 新用户引导

  • 刚注册、还没有持仓或订阅的账号会看到 2 张场景卡,指向典型用法的入口;同时提供一份 7 步上手清单:创建 Token → 订阅一个数据资产 → 完成第一次 API 调用 → 配置一条告警规则 → 接入 Webhook(飞书/微信)→ 跑一次回测 → 接入 Agent,完成度会体现在欢迎语和进度条里。

3. 活跃用户运营看板

  • 清单全部完成后,该区域切换为 Quick Actions 快捷入口,加上近 24 小时作业健康与今日告警三栏,方便日常巡检,不再展示新手清单。

洞察工作室(仪表盘)

将底层数据快速转化为实时的数据大屏与指标告警,老板看了都说好。

1. 搭建仪表板与全局变量

洞察工作室 -> 仪表板构建 -> [创建面板]
  • 数据绑定: 将时序图、表格直接绑定到「资产目录」中已注册的资产,或选择「Custom SQL Query」直写底层 SQL。
  • 联动筛选: 添加全局下拉变量(如 stock_code),在图表 SQL 中通过 ${stock_code} 引用。切换下拉框,全量图表秒级联动刷新。

2. 指标告警

侧边栏 -> 洞察工作室 -> 指标告警(独立页面 /alerts,已与仪表板解耦)
  • 点击「新建规则」,选择监控场景(A股 / 港股 / 基金 / 黄金内置标的搜索,或选择「自定义指标」绑定任意已订阅的数据资产 + 字段过滤)来确定监控范围。
  • 设定触发条件(如:当收盘价的最新值小于 1500 时通知我),并在「通知方式」里选择一个已配置的 Webhook 数据源作为通知渠道——如果还没有,需先在「资产工作室 -> 数据源连接」里添加一个 WEBHOOK 类型的数据源。
  • 在「高级设置」中设置静默期(分钟,默认 60)与每日触发上限次数,避免短时间内被同一条规则反复轰炸。

资产工作室(数据基座)

将杂乱的底层数据库和接口,规范化为平台可供直接消费的标准化「数据资产」。

1. 配置数据源连接

资产工作室 -> 数据源连接 -> [添加数据源]
  • Category: 选择系统类型,如 Database(数据库)、API、Webhook(用于绑定告警通知,如飞书/钉钉群机器人)等。
  • Authentication: 数据库填账密;API/Webhook 可配置 Token 或在高级设置中填写 Sign Secret 验签以确保安全。
  • Server Type: 可选 Production(生产)、Development(开发)或 Test(测试),实现数据源的多环境物理隔离。
  • 数据源类型新增 Hologres(阿里云实时数仓)。

2. 注册与管理数据资产

资产工作室 -> 资产目录 -> [编辑 / 添加数据资产]
  • 敏感度管控: Public — 公开资产,平台内其他团队可见。Internal — 内部私密资产。
Internal 级别的资产如果想要对外发布,必须在标签中包含 permission_field(例如 permission_field:tenant_id),系统会借此自动应用行级数据权限隔离(RLS)。
  • 数据探查: 在详情页点击「Data Profile」,系统会自动统计并生成各列的空值率、极大极小值与数据分布图。

3. 新增数据资产家族

  • 市场目录新增了两类可直接订阅的数据集:场外/场内基金日行情与净值(fund_day,历史约 15 年)、基金分红(fund_dividend);用法与个股行情类资产一致,在 Marketplace 里搜索订阅即可。

流程工作室(数据加工厂)

无需手动编写冗长的脚本,通过拖拽和 SQL 即可完成数据清洗、加工的流水线编排。

1. 流程编排画布

  • 节点拖拽与配置: 从左侧面板将 Database、API、Transform、Filter 等节点拖入网格并双击配置。对于 SQL 节点,可直接编写业务逻辑并点击「Format SQL」美化。支持配置节点失败的 Retry Times。
  • 连线控制: 从节点右侧拖出连线到下一个节点。双击连线可设置触发条件(On Success 正常流转,或 On Failure 降级补偿)。
  • 版本快照: 系统会自动保存每次修改的快照,支持版本差异对比「Compare」与一键回滚「Restore」。
  • Agent / API 更新: Agent 或脚本可通过 PUT /api/ingestions/{id}(scope process.pipeline.update)更新已有流程:省略 nodes = 只改名/描述,保留步骤;nodes=[...] = 完整替换。每次 PUT 都会写入版本快照,出问题可直接在「版本管理」Tab 里一键回滚。`team_name` 为空的历史流程会直接 403,需先补齐归属团队。

2. 内置组件说明

流程编辑器左侧面板提供多种组件,拖入画布后双击配置。每个组件都可以切换到「说明」Tab 查看详细用法。

Python 脚本 (python_script)

运行自定义 Python 代码,内置 lg_utils 工具库,无需安装即可调用:

  • get_context() — 查看当前团队可用的资产、数据源、仪表盘、流程列表
  • get_asset_data("name", filter_column=..., filter_value=[...], filter_operator="eq") — 按名称或 ID 获取资产数据。filter_value 传 list + filter_operator="eq" 可一次 IN 查询多只标的(如 stock_num IN (601985,600050,002085))
  • get_portfolio_positions(stock_num=None) — 读取当前团队持仓;每一行都带最近一次 Process 推荐(Action / Add1,2 / Reduce1,2)
  • get_trading_records(account_id=None, market=None, stock_num=None, trade_type=None, page=1, size=50) — 分页读取当前团队的交易记录。可选过滤 accountId / market / stockNum / tradeType。适用于做摇摆监控(取最近 BUY/SELL 锚点)或交易记录驱动的回测。
  • write_recommendations([{...}]) — 追加写入个股推荐(历史全保留)。持仓页每行「推荐」按钮弹出分页历史,按时间倒序显示。
  • get_connection("ds_name") — 连接团队数据源(自动获取配置,支持 PostgreSQL/MySQL/Oracle/SQL Server)
  • get_variable("key") — 读取调度上下文变量(作业名称、批次号等)
  • put_variable("key", value) — 把变量回写到流程上下文,下游 step 可用 ${key} 引用(适合传递日志摘要、计数、字典等小型 JSON 值,单个值 ≤ 64 KB)
  • log.info() / warn() / error() — 标准化日志输出,实时显示在执行日志中
  • backtest(..., persist=True, persist_name="...") — 跑历史回测并一步持久化结果到「我的回测」页;支持多次回测按 persist_name 对比夏普、最大回撤、总收益。
  • result.persist(name="...") — 手动把已有的回测结果写入「我的回测」页,用于在 backtest() 之外的位置追加持久化或补录。

SQL 执行 (sql)

在指定数据源上执行 SQL 语句。支持多条 SQL 分号分隔、变量替换 ${variable},执行后 row_count 变量记录影响行数。

获取资产数据 (fetchAssetData)

把某个资产的分页数据取进流程变量,下游 Python / SQL / 循环节点通过 ${变量.data} 读取;支持单值和多值过滤(如 stock_num="601985,600050" 走 IN 查询)。团队权限自动校验,步骤配置里无需填任何凭证。

获取团队持仓 (fetchPortfolioPositions)

把当前团队持仓取进流程变量,每行自带最近的 Process 推荐。典型用法:fetchPortfolioPositions → pythonScript 给每只股票算档位 → write_recommendations() 把结果写回持仓页。

条件分支 (if)

根据条件表达式将流程导向不同分支。支持比较运算符(>、<、==)、逻辑运算符(&&、||)和 else 默认分支。

循环 (for)

循环执行子步骤。支持三种模式:计数循环(i=0;i<10;i++)、SQL 游标循环(row in SELECT ...#datasource)、文件行循环(line open path)。

变量赋值 (var)

设置或计算变量值。支持字符串、数字、JSON、SQL 查询结果、数学表达式等多种赋值方式。勾选 setGlobal 可将变量写入全局上下文。

HTTP 调用 (callService)

调用外部 REST API。支持 GET/POST/PUT/DELETE 及自定义 Headers,响应内容通过 ${logInfo} 在后续步骤中引用。

发送邮件 (sendMail)

通过 SMTP 发送邮件通知。支持 HTML/纯文本正文、多收件人/抄送、变量替换。适用于执行完成通知和异常告警。

提示:双击任意组件后,切换到「说明」Tab 可查看完整的配置参数和代码示例。

3. 团队公共 Python 方法

个人设置 → 团队公共方法
  • 把团队里反复用到的函数/类沉淀成公共模块,在 python_script 步骤里用 from team_lib.<模块名> import ... 直接调用;保存时会做安全扫描,禁止 os.system/subprocess/eval 等高危调用;模块内部可以直接用 get_variable/put_variable 读写与 python_script 步骤共享的流程上下文变量。

3.5 流程运行时 — 回测 API

在 python_script 步骤内用历史行情数据模拟并量化策略表现,无需额外基础设施。

1. 三步快速开始

  1. 流程列表 新建一个流程。
  2. 拖入 python_script 节点,编写策略代码(参考下方示例)。
  3. 执行流程,结果自动保存到 我的回测

2. 最小可运行示例(stock_day 单股)

使用平台内置的 stock_day 资产(A/H 股日线)。列名映射:date_column="day_id",price_columns={open: "OPEN_PRICE", close: "CLOSE_PRICE"},filter_column="STOCK_NUM"。

from lg_utils import get_variable
from lg_utils.backtest_examples.stock_day import run_stock_day_backtest

def my_strategy(bar, ctx):
    if len(ctx.history) < 20:
        return
    ma20 = sum(b.close for b in ctx.history[-20:]) / 20
    if bar.close > ma20 and ctx.position == 0:
        ctx.buy(size="all")
    elif bar.close < ma20 and ctx.position > 0:
        ctx.sell(size="all")

result = run_stock_day_backtest(
    strategy=my_strategy,
    stock_num=get_variable("stock_num", "000001"),
    start=get_variable("start_date"),   # 'YYYYMMDD' or 'YYYY-MM-DD'
    end=get_variable("end_date"),
    initial_cash=1_000_000,
    commission_bps=3,
    slippage_bps=1,
)
print(result.summary())
result.export_to_context("run1")   # snapshot to run log
result.persist(name="run1")        # save to My Backtests

3. 完整 backtest() 函数签名(24 个参数)

所有参数及默认值——只需传入与默认值不同的部分:

  • strategy — 可调用对象 fn(bar, ctx),或带 on_bar(bar, ctx) 方法的实例。可选钩子:on_start(ctx) / on_end(ctx)
  • asset — 资产 ID(int)或资产名称(str),传给 get_asset_data
  • start, end — 日期字符串(闭区间),用于裁剪 bar。None 表示不裁剪。'YYYYMMDD' 与 'YYYY-MM-DD' 均可自动规范化。
  • initial_cash — 初始现金。默认:1_000_000.0
  • commission_bps — 按成交金额计算的佣金,基点(1 bp = 1/10 000)。默认:0.0
  • slippage_bps — 滑点,基点。默认:0.0
  • fill"next_open"(默认)——在下一根 bar 开盘价成交。"this_close"——在当根收盘价成交。
  • date_column — bar 日期字段名。默认:"trade_date"。stock_day 请用 "day_id"
  • price_columns — 价格字段映射,例如 {"open": "OPEN_PRICE", "close": "CLOSE_PRICE"}。默认:open/high/low/close/volume。
  • filter_column, filter_value — 下推给 get_asset_data 的服务端过滤,用于多标的共用一张表的场景(如 filter_column="STOCK_NUM", filter_value="000001")。
  • warmup_bars — 前 N 根 bar 只喂给 ctx.history,不调用策略回调。默认:0
  • max_bars — 加载 bar 的数量上限,防止意外拉取失控。默认:1_000_000
  • max_historyctx.history 的最大长度,None 表示不限。
  • on_trade — 每次完整平仓时触发的回调,签名 fn(trade_dict)
  • benchmark_asset — 可选基准资产名称/ID,计算后会在 metrics 中增加 benchmark_returnalphabeta
  • benchmark_price_column — 基准收盘价列名,默认与 price_columns["close"] 相同。
  • benchmark_filter_column, benchmark_filter_value — 基准资产的服务端过滤(语义与 filter_column / filter_value 相同)。
  • persist — 为 True 时,回测结束后自动调用 result.persist(name=persist_name)。默认:False
  • persist_namepersist=True 时使用的标签,与 BacktestResult.persist(name=...) 的 name 参数含义相同。
  • bars — 直接传入已加载的 bar 列表(跳过 get_asset_data,用于单测或自定义数据源)。

4. 运行时对象:Bar / Context / BacktestResult

Bar — 每个 tick 传给策略回调的具名元组。

  • bar.dt — bar 日期字符串(与 date_column 字段原始值相同)。
  • bar.open, bar.high, bar.low, bar.close, bar.volume — 解析后的数值型价格与成交量。若资产中不存在对应列则为 None
  • bar.raw — 原始行字典,可用于读取非价格列。

Context — 策略运行时上下文,持有账户状态并提供下单方法。

  • ctx.position — 当前持仓股数(整数,仅多头)。
  • ctx.cash — 可用现金。
  • ctx.equity — 账户总权益:现金 + 持仓 × 当前收盘价。
  • ctx.nav — 相对初始现金的净值(equity / initial_cash)。
  • ctx.history — 到当前 bar 为止所有已接收的 Bar 对象列表(长度上限为 max_history)。
  • ctx.buy(size="all", limit_price=None)size"all"(用全部可用现金),浮点数 ∈ (0,1](现金比例),或正整数股数。limit_price 为上限,成交价超过时跳过。
  • ctx.sell(size="all", limit_price=None)size"all"(全部平仓),浮点数 ∈ (0,1](持仓比例),或正整数股数。limit_price 为下限,成交价低于时跳过。
  • ctx.close_all() — 便捷方法:如有持仓则全部卖出。
  • ctx.order_target_pct(pct) — 将持仓调整到目标权重 pct × equity 对应的股数。pct ∈ [0, 1]

BacktestResultbacktest() 的返回值,包含全部结果数据。

  • result.metrics — 包含 total_return、cagr、sharpe、sortino、max_drawdown、win_rate、profit_factor、num_trades、exposure 等指标;配置了基准时额外包含 benchmark_return、alpha、beta。
  • result.trades — 逐笔成交记录列表:entry_dt、exit_dt、qty、entry_px、exit_px、pnl、return_bps。
  • result.equity_curve — 每根 bar 的账户快照列表(schema 见 §7)。
  • result.summary() — 返回格式化的多行指标摘要字符串,可直接 print() 到执行日志。
  • result.export_to_context(name) — 向 stdout 写入哨兵行,由 PythonScriptStep 捕获到作业日志。
  • result.persist(name=...) — 将结果写入 process_backtest_result 表(追加写入,按团队隔离)。需运行在 PythonScriptStep 内部。

5. 组合回测(backtest_portfolio)

多资产共享一个现金池。内置 stock_day 资产可直接用 run_stock_day_portfolio_backtestresult.metrics["per_asset"] 包含每只股票的收益率、最大回撤、交易次数和贡献度。assets / stock_nums 列表顺序决定同一 bar 上 size='all' 的现金消耗顺序。

from lg_utils.backtest_examples.stock_day import run_stock_day_portfolio_backtest

def make_ma_strategy(fast, slow):
    def strategy(bar, ctx):
        if len(ctx.history) < slow:
            return
        ma_fast = sum(b.close for b in ctx.history[-fast:]) / fast
        ma_slow = sum(b.close for b in ctx.history[-slow:]) / slow
        if ma_fast > ma_slow and ctx.position == 0:
            ctx.buy(size=0.5)   # use 50% of available cash
        elif ma_fast < ma_slow and ctx.position > 0:
            ctx.sell(size="all")
    return strategy

result = run_stock_day_portfolio_backtest(
    strategies={
        "000001": make_ma_strategy(5, 20),
        "600519": make_ma_strategy(10, 30),
    },
    stock_nums=["000001", "600519"],  # settlement order for size='all'
    start="20240101", end="20241231",
    initial_cash=1_000_000,
    commission_bps=3,
)
print(result.summary())
# result.metrics["per_asset"] has per-stock contribution / max_dd
result.persist(name="portfolio-v1")

6. 交易记录驱动的回测

通过 get_trading_records() 读取历史真实买卖锚点,将这些入场日期复现到回测引擎,量化「如果当时那样操作」的结果。

import datetime
from lg_utils import get_trading_records
from lg_utils.backtest_examples.stock_day import run_stock_day_backtest

# Load actual BUY anchors from trading history
# Response shape: {"success": True, "data": [...], "totalElements": N, ...}
# Field names use Jackson camelCase: tradeDate, stockNum, price, tradeType
records = get_trading_records(stock_num="000001", trade_type="BUY", size=1)
if records.get("totalElements", 0) == 0:
    print("No BUY records found.")
else:
    latest_buy = records["data"][0]
    last_buy_date = str(latest_buy["tradeDate"])[:10]  # e.g. '2024-01-15'
    buy_price = float(latest_buy["price"])
    upper = buy_price * 1.10
    lower = buy_price * 0.90

    def swing_strategy(bar, ctx):
        if bar.close is None:
            return
        if ctx.position == 0 and bar.close <= lower:
            ctx.buy(size="all")
        elif ctx.position > 0 and bar.close >= upper:
            ctx.sell(size="all")

    end_date = datetime.date.today().strftime("%Y-%m-%d")
    result = run_stock_day_backtest(
        strategy=swing_strategy,
        stock_num="000001",
        start=last_buy_date,
        end=end_date,
        initial_cash=500_000,
    )
    result.persist(name="replay-from-records")

7. equity_curve JSON Schema

result.equity_curve 中每个元素对应一根 bar:

// equity_curve: list of objects, one per bar
[
  {
    "dt":       "20240101",   // bar date (string, same format as date_column)
    "equity":   1_000_000.0, // total portfolio value (cash + position mark)
    "cash":     800_000.0,   // available cash
    "position": 100,         // shares held (int; portfolio mode: count of non-zero positions)
    "close":    55.80        // bar close price (portfolio mode: weighted mark equity)
  },
  ...
]

「我的回测」页面将此曲线渲染为折线图(权益随时间变化),并用 equity 字段计算最大回撤。cash 和 position 字段显示在详情面板中。

8. __LG_BACKTEST_RESULT__ 哨兵行

调用 result.export_to_context() 时执行日志会自动出现此行。请勿将其复制回 Python 代码——这是机器输出,不是源码。

回测结果有两种对外输出方式:

// Emitted by result.export_to_context("name") — appears in the run log:
__LG_BACKTEST_RESULT__:<name>:<json-payload>

// Emitted by result.persist(...) — writes to process_backtest_result table:
// Returns the new row id. Visible at /profile/backtest-results.

9. 执行后结果在哪里查看

通过 result.persist()backtest(..., persist=True) 保存的结果,可在 个人设置 → 我的回测 查看。该页面展示所有命名回测的可排序指标表格;点击任意行可打开权益曲线图和交易明细。

10. CLI 参数注入(get_variable)

后端将调度变量作为命令行参数传给脚本。--start_date-start_date 等价——运行时会剥离所有前导短横线,通过 get_variable("start_date") 暴露值。

# Both forms are equivalent — the runtime strips leading dashes:
#   --start_date 2024-01-01
#    -start_date 2024-01-01
# Both surface as:
from lg_utils import get_variable
start = get_variable("start_date")   # => "2024-01-01"
推荐工作流: 将生产推荐流程与回测流程分开管理。在生产流程中直接加回测调用会有写入不完整结果或阻塞生产运行的风险。请单独创建一个回测专用流程,通过 get_variable() 参数化 start_date / end_date / stock_num,并独立调度。

调度工作室(自动化引擎)

替代本地 Cron,让数据流程、量化策略或自动化脚本按时按依赖顺序在云端执行,失败即告警。

1. 配置调度作业

调度工作室 -> 作业列表 -> [添加作业]
  • 绑定需要执行的 Process 流程代码或脚本。利用自带的「Cron Expression Builder」快速生成定时策略(如每天凌晨2点)。可配置依赖(Dependencies),确保上游成功后才触发下游。

2. 实例监控与干预

  • 开启右上角「Auto Refresh: ON」即可作为实时监控大屏使用,实时掌控 Pending/Running/Success/Failed 状态。
  • 人工干预: 支持 View Logs(调取底层真实执行日志)、Kill(强杀卡死任务)、Redo Job(修复逻辑后一键重跑)以及 View Lineage(查看三级血缘依赖关系)。

3. 依赖组:组内 OR、组间 AND

  • 给多个依赖填上同一个 Group 名字,组内任意一个依赖满足即可触发(OR);不同 Group 之间仍然要求全部满足才触发(AND)。不填 Group 的依赖各自独立,等价于原来「全部 AND」的行为,不受影响。
这是一次语义变化:「必须所有上游都成功才会触发」这句话现在只对不同 Group 之间成立;同一个 OR 组内只要有一个依赖满足,作业就会触发,不会等其它组内成员。

4. 远程执行:多机器池 + 分发策略

  • 执行方式选择「Remote machine (SSH)」后,可以从已有数据源连接里勾选多台机器组成一个池并设置优先级;分发策略支持轮询(Round Robin)、故障转移(Failover)、随机(Random)三种,决定每次实际运行在哪台机器上。

理财工作室(Wealth Studio)

告别高昂的第三方行情 API 费用,在云端搭建并托管你的私人量化与盯盘引擎。
此模块属于特定行业扩展,需联系管理员在 Admin Studio 授权后可见。
自带高频数据源: 平台内置 A 股/H 股实时行情与分钟线数据池,并已扩展到基金净值(fund_day)与黄金现货(metal_day)日频数据。您无需自行购买 TuShare 或聚宽等昂贵的第三方账号,也无需在本地维护沉重的历史数据库。
自动化盈亏推算: 录入账户初始的基线数据(成本价、数量)及日常买卖流水(BUY/SELL)。系统将基于最新行情自动、实时地推算最新持仓的平均成本和未实现盈亏(Unrealized P/L)。支持删除最后一条错误流水进行安全回滚。
Process 推荐直达持仓页: 任何 Process 里的 Python 节点都可以调 write_recommendations(),写入每只股票的信号(Action / Add1、Add2 / Reduce1、Reduce2 / no_more_add)。每次调用都是追加,历史都会保留。持仓页每行都有一个「推荐」按钮,点开弹窗里分页展示该股票的历史推荐(时间倒序)。搭配调度工作室,每天收盘的推荐直接到持仓视图。
AI 盯盘与推送: 配合调度工作室与官方大模型插件,您可以轻松实现「股价突破预警 -> 飞书/微信毫秒级推送」。甚至可以直接对着 Agent 说:「帮我查下今天的持仓盈亏」。
账户类型筛选 持仓、交易记录、盈亏日历、模拟交易等页面顶部都有「真实 / 模拟」下拉,只看其中一类账户,每行也带对应徽章。注意:下拉不再提供「全部账户」选项,带 accountType=all 的旧书签会自动按「真实」显示。
净值曲线与收益归因 持仓详情页新增两个小组件:组合净值曲线(与基准的累计收益对比)、以及收益归因(Alpha/Beta 拆解,可展开看二级归因),两者都跟随页面顶部的账户类型筛选联动刷新。

模拟交易(Paper Trading)

用平台行情驱动一份单独的 ¥1,000,000 虚拟账户,把策略从纸面验证到真金白银前,先在零风险沙盘里把规则跑顺。
此模块属于特定行业扩展,需联系管理员在 Admin Studio 授权后可见。
入口与开通: 侧边栏「理财工作室 -> 模拟交易」;需要 investment_studio 或 stock_studio 权限(与持仓管理同一道闸)。首次进入自动创建一个默认账户,初始资金 ¥1,000,000(默认账户不可归档);页面右上角「新建账户」可创建更多具名账户并自定义初始资金,账户间可随时切换、归档 / 取消归档。重置按钮重置的是当前选中账户,会清空该账户的持仓与挂单并恢复其初始资金,不影响其他账户。
MARKET / LIMIT 双订单类型: MARKET 单同步成交于当前 stock_day 价(交易时段才会撮合,非交易时段返 OUTSIDE_TRADING_HOURS)。LIMIT 单先 SUBMITTED 并冻结资金(BUY),后台撮合器每 60 秒扫一次,触发条件 BUY 时 live ≤ limit、SELL 时 live ≥ limit;15:00 收盘扫剩余 SUBMITTED 自动 EXPIRED 并退回冻结资金。SUBMITTED 单可主动取消,资金即时退回。
A 股规则与限制: 强制一手 100 股(基金/黄金跳过);T+1(当日买入次日才能卖出,仅在模拟盘强制,真金交易不受影响);佣金 0.025% 最低 5 元 + 过户费 0.001%(只买)+ 印花税 0.05%(只卖)。当前不支持涨跌停 / 停牌 / 集合竞价 / 跨日 GTC LIMIT,全部在 v2 路线图。
Process 量化策略自动下单: 进阶用户可以在 Process 里写 Python 节点,import lg.paper 调 submit_order / get_account / get_positions / cancel_order 等。Process 起跑时后端会铸造一个短期 scope-limited Bearer token 注入到执行环境,执行结束自动撤销。资源市场已上线 starter_paper_trade_strategy 模板,订阅一键起手。
策略历史回测(同一脚本,两种模式): 在 Process 执行环境上加 LG_PAPER_MODE=backtest + LG_PAPER_BACKTEST_FROM=2025-01-01 + LG_PAPER_BACKTEST_TO=2026-01-01 三个环境变量,同一份 lg.paper 脚本不改一行代码即可对历史 stock_day 数据回放,产出 BacktestResult 写入「我的-回测结果」。手续费 / T+1 / 一手 100 股 / ±10% 涨跌停全部和实盘逐位一致(Java 后端为基准,Python 模拟器有 fixture 平价测试守护,规则漂移会让 CI 红)。脚本末尾显式调 lg.paper.persist_backtest(name=...) 入库;策略验证通过后,去掉环境变量挂回调度器即切换实盘。资源市场已上线 starter_paper_trade_strategy_backtest 模板,订阅即用。
什么时候重置: 策略迭代节点、月度复盘、给客户/同行展示前。重置是原子事务(取消未成交单 + 归档当前持仓快照 + 还原资金),不会影响真金账户。

资源市场与 API 消费

打破数据孤岛,对外提供极其简单的数据调取 API,完美适配自动化脚本与 AI 大模型。

1. 资源市场

  • 查阅全平台已公开(Published)的优质数据资产与看板。点击「Subscribe(订阅)」后,该资产即进入您的可用权限池。发布方新发布或修改条目需先经过管理员审核,审核通过前会显示「审核中」,其他用户暂时看不到也无法订阅;条目若被管理员强制下架,已订阅用户的访问权限会被同步撤销。

2. Token 管理

个人设置 -> Token 管理 -> [创建 Token]
  • 高光场景: 将生成的 Token 直接配置到官方的 OpenClaw Agent 插件中,或传递给你自己的 Python 脚本,即可实现无需登录的底层数据全自动化抓取。
  • 安全机制: 可控制细粒度权限(Scopes),Token 仅生成时明文展示一次。如遇泄漏请立刻点击「Revoke(撤销)」阻断访问。
  • Scope 选择: 新建 Token 默认就带一组可直接取数的 scope(资产列表/详情/数据读取等),不用先摸索该勾哪些;勾选面板按接口的真实 HTTP 方法分组展示,并提供几套按场景预置的快捷勾选。

3. 免登录预览

  • 未登录也可以直接打开 Marketplace 浏览已发布的数据资产和看板(默认停在「数据资产」标签页);点击「获取 API / 订阅」等写操作会被拦下并跳转到登录页,登录后再重试即可完成。

4. 积分用量(影子模式)

  • 个人设置页新增「积分用量」卡片,市场里部分数据集条目会带一个费率徽章(如「N 行 / 积分」),发布方也可以为自己发布的数据集条目设置费率。当前是影子模式:只展示预估用量,不实际扣费或限流。

大模型与智能插件(Agent Skills)

让 AI 成为你的 24 小时数据助理。通过自然语言对话,直接拉取报表、执行盯盘与提 Bug。
四条接入方式,怎么选
  • ClawHub 官方 skill 包——装进 Claude / OpenClaw 等支持 ClawHub 的客户端即可用自然语言调用,见下方「官方插件支持」。
  • MCP Server(stdio)——面向 Claude Code / Cursor / Windsurf / Cline / Codex CLI 等原生 MCP 客户端,见下方「MCP Server」。
  • Bearer Token + HTTP API——自己写脚本直接调 REST 接口,最灵活,见下方「Bearer Token + HTTP API」。
  • 匿名只读——不注册也能跑只读查询,受限流保护,见下方「匿名只读」。

/agent-guide 是面向未登录访客的完整版接入指南(含安装命令与新手常见坑),本节是登录后的操作细节。

1. 三步快速接入

  1. /profile/tokens 创建 Bearer token,选择需要的 scope
  2. 设置环境变量 LG_AGENT_TOKEN=<your-token>LG_AGENT_BASE_URL=https://privora.cn
  3. GET /agent/skills 拿可用 skill 列表,再 POST /agent/skills/execute 执行
Scope 怎么选: 默认预设「读取行情 / 资产数据」已包含 dataasset.metadata.get(查元数据);如果还需要订阅市场条目(拿 clonedAssetId),要在创建 Token 时额外勾选「读取数据 + 管理市场订阅」预设(含 marketplace.item.subscribe)——默认预设不含这条。paper.*(模拟交易执行)保留给平台内部,绑定策略时自动签发,创建页不会显示这些勾选项,不用找。

2. Bearer Token + HTTP API

常用端点GET /agent/skills(列出可用 skill)   POST /agent/skills/execute(执行 skill)   GET /api/public/agent/token-introspect(连通性 smoke test)

完整 skill catalog 见 skill manifest(含每个 skill 的 risk tier、必填字段、gotchas)。

注意:在 token 模式下,所有 risk 标记为 🔴 或 confirmRequired=true 的操作返回 409;详见 skill manifest 该操作的元数据。例如 schedule.job.delete(🔴)和 schedule.instance.kill(🔴)在 token 模式下均返回 409。Approval flow 仅 session 支持。

3. 官方插件支持:

  • 在 OpenClaw Hub / ClawHub 中执行 clawhub install privora-cn-quant 即可安装覆盖数据 / 流程 / 回测 / 模拟交易的全量官方插件;只需要实时告警场景可以改装更精简的 clawhub install privora-alert。也可以在 Coze/GPT Store 搜索 Privora 挂载使用。

4. MCP Server(stdio)

GET /agent/skills / POST /agent/skills/execute 包装成原生 MCP tool,适配 Claude Code、Cursor、Windsurf、Cline、Codex CLI 等支持 stdio MCP 的客户端。

安装(无需仓库权限,从官网下载)
npm install -g https://privora.cn/downloads/privora-mcp-server-0.1.1.tgz
curl -fsSLO https://privora.cn/downloads/privora-mcp-server-0.1.1.tgz
curl -fsSLO https://privora.cn/downloads/privora-mcp-server-0.1.1.tgz.sha256
sha256sum -c privora-mcp-server-0.1.1.tgz.sha256
{
  "mcpServers": {
    "lg-agent": {
      "command": "lg-agent-mcp-server",
      "env": {
        "LG_AGENT_BASE_URL": "https://privora.cn",
        "LG_AGENT_TOKEN": "lgatk_your_token_here"
      }
    }
  }
}
各客户端把这段配置放在哪
  • Claude Code —— 项目级写 .mcp.json(随仓库共享),用户级/本项目级由 ~/.claude.json 保存;也可直接用下面的 claude mcp add。(官方说明
  • Cursor —— 全局 ~/.cursor/mcp.json,项目级 .cursor/mcp.json。(官方说明
  • Windsurf —— ~/.codeium/windsurf/mcp_config.json。(官方说明
  • Cline —— CLI 版 ~/.cline/mcp.json;IDE 插件版从界面进:顶部工具栏 MCP ServersConfigureConfigure MCP Servers。(官方说明
  • Codex CLI —— ~/.codex/config.toml(项目级 .codex/config.toml)。格式是 TOML,不是上面那段 JSON,见下方。(官方说明
  • 前四个都用同一个 mcpServers JSON 结构,上面那段可以原样粘贴,只改 lg-agent 这个名字即可。
命令行一键添加(Claude Code / Codex CLI)
claude mcp add --env LG_AGENT_BASE_URL=https://privora.cn --env LG_AGENT_TOKEN=lgatk_your_token_here --transport stdio lg-agent -- lg-agent-mcp-server
codex mcp add lg-agent --env LG_AGENT_BASE_URL=https://privora.cn --env LG_AGENT_TOKEN=lgatk_your_token_here -- lg-agent-mcp-server
Codex CLI 用的是 TOML,不是 JSON。把上面那段 mcpServers JSON 粘进 ~/.codex/config.toml 会解析失败。手写请用下面这段。另外 Claude Code 的 --env 后面不能紧跟服务器名,否则它会被当成又一个 KEY=VALUE 而报错 —— 上面的命令特意在中间放了 --transport stdio
[mcp_servers.lg-agent]
command = "lg-agent-mcp-server"

[mcp_servers.lg-agent.env]
LG_AGENT_BASE_URL = "https://privora.cn"
LG_AGENT_TOKEN = "lgatk_your_token_here"
LG_AGENT_BASE_URL 默认是 http://localhost:3000,网站安装的版本必须显式设成 https://privora.cn,否则每次调用都连不上。LG_AGENT_TOKEN 可选——不设则以匿名模式运行。

固定 11 个 tool:4 个协议层 meta-tool(list_skills / describe_skill / execute_skill / whoami)+ 7 个一等公民 tool(dataasset_listdataasset_getdataasset_schema_getdataasset_metadata_getdataasset_data_getdataasset_data_get_realtimemarketplace_item_list),无论有没有 token 都会出现,能不能真正调用取决于 token 的 scope。

5. 匿名只读

  • 不设 LG_AGENT_TOKEN、不登录也能用:固定放行 10 个只读 skill(资产列表、schema、市场条目等),按 IP 做三档限流。适合先跑通再决定要不要注册。

6. 自然语言交互: / 零摩擦用户反馈:

  • 自然语言交互: 配置好 Token 后,你可以直接在聊天框输入指令:「帮我查一下资产 ID 21 的最新数据。」或「帮我监控中国核电,跌破 9.5 元就马上通知我。」
  • 零摩擦用户反馈: 遇到产品 Bug?无需寻找客服入口,直接对 Agent 说「这个功能报错了,帮我提交一个反馈」,AI 将自动截取上下文并直接推送至我们的后台管理系统。
新手常踩的坑
  • 订阅市场条目后,你自己团队拿到的是新的克隆资产 id,不是市场页面上显示的发布方 id——每次用 id 之前用 marketplace.item.subscribe(或 dataasset.list)的返回结果重新确认,不要从截图或聊天记录里搬。
  • dataasset.data.getfilter_value 若省略 filter_op,默认按子串匹配LIKE '%v%'),不是精确匹配;要精确请显式传 filter_op=eq
  • URL 路径里的 {id} 必须是数字资产 ID,传资产名称会 500 且报错信息不说明原因。
  • 不要手动加 X-Agent-Mode header——这是 Node 代理层根据 Bearer token 自动注入的,手工加反而可能导致请求被拒绝。
  • 发现可用 skill 用 GET /agent/skills,不要用 /api/public/agent/capabilities——后者是精简版,会漏掉整个模拟交易能力面。
  • Windows Git Bash 下 curl -d '中文内容' 会静默改坏非 ASCII 字符,改用 --data-binary @file

管理控制台(仅管理员可见)

面向管理员的后台能力:控制谁能用什么、AI 能碰哪些数据、以及全站的使用情况和用户反馈。
授权管理: 为指定用户开通特定的行业解决方案(如理财工作室 / Wealth Studio)。
Agent 策略: 严格控制全站各级 AI Agent 可以调用的底层数据范围与放行策略,确保大模型调用的数据安全边界。
统计与反馈: 查看全站页面的 PV/DAU 热区;集中处理用户通过侧边栏提交的 Bug 和建议。管理员的状态更新将实时同步回前端,并通过 Webhook 实现闭环客服通知。

1. 组件权限管理

Admin Studio → 组件权限
  • 控制每个团队在流程编辑器中可以使用哪些组件类型。管理员输入团队名称后,可勾选该团队允许使用的组件。
  • 未配置的团队默认拥有全部组件权限,不受限制。
  • 勾选部分组件并保存后,该团队的流程编辑器左侧面板将只显示被授权的组件。
  • 全选后保存 = 移除限制,恢复全部权限。
修改组件权限后,团队用户需刷新流程编辑器页面才能看到变化。已保存的流程中使用了被移除组件的节点不会被删除,但无法新增。

客户用例 — 真实工作流端到端操作

按客户用例的端到端操作步骤 — 每一步给出 UI 路径,照着点就能跑通。

1. 主观→量化复盘工作流(MACD 区间胜率分析)

把你真实的交易记录转成可量化的优势区间分析。上传交割单 CSV → 算每笔交易买入时刻的 MACD 斜率 → 按斜率分桶统计胜率 → 找出你自己策略最强的区间。4 步走完。

  1. 上传交割单 CSV
    Wealth Studio → Trading Records → 点页面右上角 「Import CSV」按钮(紧贴 「Add Trade」)

    支持的 CSV 列(必须含表头行):

    trade_date,symbol,side,quantity,price
    2024-03-15,600519,BUY,100,1700.50
    2024-04-02,600519,SELL,100,1820.00
    

    外部 AI agent 替代路径:在 /profile/tokens 创建 Bearer token,调 POST /api/wealth/trading-records/import-csv 走 multipart,Authorization header 带 token。

  2. 跑 MACD 斜率回测 pipeline
    /diagram → 新建 Process → 添加 Python Script 步骤 → 粘贴下方 quickstart 代码
    from lg_utils.backtest_examples.discretionary_macd_winrate import run
    
    run(persist_result=True)
    

    默认参数:MACD(12, 26, 9),斜率回看 5 bar,分桶宽度 0.1,每笔交易回看 60 个 close。要改参数:把 discretionary_macd_winrate.py 完整脚本 copy 到 Process 里改 module-level const;或者用 lg_utils.indicators(sma / ema / macd / rsi / slope)自己组合。

  3. 加 Bucket Win-rate widget 到 dashboard
    /dashboards → 选或新建 dashboard → 点 Add Widget → Template dropdown → 选 「Bucket Win-rate (Discretionary → Quant)」

    模板自动生成 Custom-SQL skeleton(基于 process_backtest_result 表)。你只需要改 3 个占位符:<run_name>(你 result.persist(name=...) 时传的 label,默认 discretionary_macd_winrate) / <indicator_col>(你 on_trade 回调里加到 trade dict 的指标 key,默认 macd_slope) / <bucket_width>(桶宽,例如 0.1)。Save → 表格出现每桶胜率。

    样例输出:

    bucket_low  | n_trades | n_wins | win_rate_pct | avg_pnl
    -0.3        |    5     |    2   |    40.00     | -120.50
    -0.2        |    8     |    4   |    50.00     |   30.20
    -0.1        |   12     |    8   |    66.67     |  215.40
     0.0        |   15     |   11   |    73.33     |  380.10  <-- best
     0.1        |   10     |    6   |    60.00     |  180.50
     0.2        |    6     |    3   |    50.00     |   50.30
     0.3        |    3     |    1   |    33.33     | -250.10
    
  4. (可选)外部 AI agent 自然语言查询

    Tool 层(Privora)提供数据 + 计算;language 层(Coze / 千问 / Claude / OpenClaw)翻译。在 agent 平台配 Bearer token,然后直接问:「我 MACD 斜率哪个桶胜率最高?」—— agent 会调 query_asset_data 读 process_backtest_result,把表翻成自然语言回答。