PnL 索引器

历史盈亏(PnL)索引器

Solana Account Indexer 是一款专用工具,可在指定的历史或当前时间范围内,精准追踪并计算任意 Solana 账户的盈亏(PnL)。索引器采用先进先出(FIFO)会计方法,生成累计与按日维度的 PnL 指标,帮助用户同时把握长期收益/亏损与日常表现变化。

功能特性

  • 累计 PnL(Cumulative PnL):在指定时间范围内,汇总该账户所有交易的总盈亏,全景展示整体账户表现。

  • 每日 PnL(Daily PnL):提供逐日盈亏明细,便于评估日度表现并识别短期趋势。

方法论

FIFO(先进先出)计算: 将每笔资产流出(如卖出、兑换)与最早获取的持仓一一匹配,确保成本计算一致与准确。通过将交易按时间顺序系统化匹配,FIFO 能精确反映已实现盈亏,在波动行情下亦能保持清晰可解释。

PnL 计算口径

  • 已实现盈亏(Realized PnL):基于 FIFO,将每笔卖出/转出与最早购入的持仓匹配,准确记录处置时点的盈亏。

  • 未实现盈亏(Unrealized PnL):将当前持有资产的市值与其历史成本对比,反映潜在收益或亏损。

  • 日度跟踪(Daily Tracking):按日监控已实现与未实现盈亏,为当日累计财务表现提供细粒度可视化。

技术要点(Technical Insights)

  • 交易解析(Transaction Parsing):系统化解析账户交易,准确识别充值、提现、资产兑换等活动,构建完整的交易历史。

  • 价格更新(Price Updates):为确保日度 PnL 精度,按设定时间点(如收盘/日终)获取代币价格,用于未实现盈亏估值。

  • 日切(Daily Rollover):每日滚动更新,记录新的 PnL 数据并拉取最新价格,形成连续、可靠的历史序列,便于趋势分析。

典型场景(Use Cases)

  • 个人账户分析:全面洞察个人交易活动与绩效。

  • 资产组合管理:帮助投资经理精准监控、分析并出具每日盈亏报表。

  • 税务申报:提供详细的历史已实现盈亏数据,简化合规申报与报告。

在线试用(Swagger 文档)

该索引器提供一组 API,用于初始化索引、回填历史交易数据,并获取任意账户的累计与每日 PnL 指标。

索引创建流程(Index creation flow)

  1. 创建新索引(Create New Index) POST {admin-base-url}/index/pnl 用途:初始化一个新的 PnL 跟踪索引。

  2. 启动回填任务(Start Backfill Job) POST {admin-base-url}/index/{index_id}/backfill 用途:根据指定 index_id 启动历史数据回填,补齐对应的 PnL 数据。

  3. 查询回填状态(Check Backfill Status) GET {admin-base-url}/index/{index_id}/backfill 用途:查看该 index 的回填进度与当前状态。

  4. 获取累计 PnL(Fetch Cumulative PnL Data) GET {index-dataset-url}/api/v1/dataset/cumulative-pnl/{index_id} 用途:按指定时间范围,返回该 index 的累计盈亏数据。

  5. 获取每日 PnL(Fetch Daily PnL Data) GET {index-dataset-url}/api/v1/dataset/daily-pnl/{index_id} 用途:按指定时间范围,返回该 index 的逐日盈亏数据。

索引创建示例(Index creation example)

admin-base-url: https://indexer.astralane.io/arrow-up-right

index-dataset-url: https://graphql.astralane.io/arrow-up-right

1. 创建新索引(Create a New Index)

POST {admin-base}/index/pnl

Headers:x-api-key: <your_api_key>

查询示例:

说明:为指定账户与日期范围初始化一个新的 PnL 索引。

示例响应:

请求载荷说明(Payload Details)

name

  • 描述:索引的人性化名称,便于后续检索与引用。

  • 示例:"My Main Wallet Portfolio"

  • 目的:按账户/组合/用途清晰标注并组织索引。

filters

  • 描述:过滤条件数组,定义哪些交易将被纳入索引。

  • 目的:通过指定谓词,实现精确的数据筛选。

  • 组成:每个过滤器包含 column 字段与 predicates 数组。

过滤器 1:账户过滤(Account ID Filter)

  • column: "account_id"

    • 描述:按 account_id 列过滤,仅纳入该账户的交易。

  • predicates

    • 类型"eq"(等于)— 精确匹配指定的 account_id

    • :包含用户 Solana 账户地址的数组

    • 用户要素:账户地址唯一标识用户的钱包

    • 示例值"4BjxyW2GTD1qBwUk96mAR7dV1A3Pq51hPx78WLqrXegX"

    • 目的:仅纳入目标账户相关的数据。

过滤器 2:时间过滤(Time Filter)

  • column: "time"

    • 描述:按时间列过滤,限定交易的起止时间范围。

    • predicates:包含两个条件

    • 1 - 大于(gt):

      • 类型"gt"

      • 描述:区间起点,Unix 时间戳(秒)

      • 用户自定义时间戳:用户定义的起始日期时间。

      • 示例"1718148102"

    • 2 - 小于(It):

      • 类型"lt"

      • 描述:区间终点,Unix 时间戳(秒)

      • 用户自定义元素:结束时间戳由用户指定,代表所需时间范围的上限。

      • 示例:"1718339227"

  • 目的:仅纳入落在用户自定义时间范围内的交易。该时间窗口完全可配置,便于围绕特定时期开展定制化分析。

2. 启动回填任务

POST {admin-base-url}/index/{index_id}/backfill

Headers:x-api-key: <your_api_key>

URL Parameters:

index_id: 上一步创建索引返回的 ID

查询示例:

说明:为指定 index_id 启动回填,抓取与处理历史数据以生成对应的 PnL 记录。

Sample Response:

3. 查询回填状态

GET {admin-base-url}/index/{index_id}/backfill

Headers:x-api-key: <your_api_key>

URL Parameters:

index_id: 要查询回填状态的索引 ID

说明:返回回填任务的当前状态与进度,便于跟踪直至完成。

示例响应:

4. 获取累计 PnL

GET {index-dataset-url}/api/v1/dataset/cumulative-pnl/{index_id}

Headers:x-api-key: <your_api_key>

URL 参数:

index_id: 要查询的索引唯一标识

说明:返回指定索引在给定日期范围内的累计盈亏概览。

示例响应:

5. 获取日度 PnL

GET {index-dataset-url}/api/v1/dataset/daily-pnl/{index_id}

Headers:x-api-key: <your_api_key>

URL参数:

index_id: 要拉取日度 PnL 的索引 ID(唯一标识)

URL Parameters:

  • index_id: 要拉取日度 PnL 的索引 ID(唯一标识)

  • Description: 返回指定索引在定义日期范围内的日度 PnL 数据,提供逐日细化的绩效洞察。

示例响应:

最后更新于