paper2skills Playbook

PVM 跨平台广告归因窗口统一化 - 母婴跨境多渠道 ROAS 去偏

Skill-PVM-Attribution-Window-Harmonization · 13-广告分析

causalexperimentoptimizationmulti_agent广告与投放MAS与智能体工程WF-B 广告优化WF-D 选品扫描WF-G Listing内容优化
年化 ROI480 万/年
实现难度⭐⭐⭐☆☆
业务优先级⭐⭐⭐☆☆
业务视角
适用角色广告优化师 / 投放负责人 · CMO · 运营负责人
适用平台Amazon PPC(SP/SB/SD)· TikTok Ads · Meta 广告 · 多平台归因
什么情况下用广告账户几十个系列,不知道哪个在真正赚钱;ROAS 看起来好看但实际利润没有提升;预算有限想集中打高价值用户
成功是什么样的每分广告预算有明确 ROI 追踪,砍掉低效渠道后同等预算 ROAS 提升 30-50%
业务痛点
ROAS 好看但利润没有涨不知道哪个素材真的有效归因窗口期不同数据打架TikTok/Meta/Amazon 广告数据整合不了

1. 解决的问题

WF-B 跨渠道归因痛点:Amazon 14d-click、Meta 7d-click、TikTok 7d-click 归因窗口不一致,Last-Click Mechanism (LCM) 让平台策略性延迟上报点击时间抢归因信用,LCM 不满足 DSIC (Dominant Strategy Incentive Compatible),准确率最低可趋近于 0. PVM (Peer-Validated Mechanism) 让每个平台的归因信用仅依赖其他平台的报告而非自身,消除策略操控动机,理论最

2. 核心算法逻辑

WFB 跨渠道归因痛点:Amazon 14dclick、Meta 7dclick、TikTok 7dclick 归因窗口不一致,LastClick Mechanism (LCM) 让平台策略性延迟上报点击时间抢归因信用,LCM 不满足 DSIC (Dominant Strategy Incentive Compatible),准确率最低可趋近于 0. PVM (PeerValidated Mechanism) 让每个平台的归因信用仅依赖

3. 业务应用场景

- 业务问题:Momcozy 同投 Amazon SP + Meta DPA + TikTok Shop. 用户 6 天前在 TikTok 看吸奶器短视频, 2 天前看 Meta DPA 再营销, 5 分钟前在 Amazon 搜索点击购买. Amazon 14d-click 抢走 100% 归因信用, TikTok/Meta ROAS 系统性低估,导致削减二者预算 → 全渠道流量恶性循环 - 数据要求:三平台 click_time + 转化时间戳 + spend - PVM 配置: - 各平台触点统一映射到 $(-W, 0]$ 转化对齐时间轴 - PVM 按"同行报告时序概率"分配信用(Sof

- 业务问题:大促后 Amazon 声称带来 GMV 500 万,Meta 声称 200 万,TikTok 声称 150 万,三者之和远超实际 GMV 600 万(双重计数). 无法判断真实渠道贡献 → 下一轮大促预算分配错误率 40%+ - 数据要求:大促期间(6.1-6.18)所有订单 + 三平台触点记录 - PVM 配置: - 窗口截断审计:每笔订单提取三平台窗口内最后点击 - 重复转化识别:同 order_id 多平台归因 → 强制 $\sum_i x_i \leq 1$ - 输出"渠道矫正 ROAS"+ 重复计数率报告 - 业务价值: - 跨渠道 ROAS 可比性 → 下一轮大促渠道

4. 输入数据要求

请查看原始代码模板获取输入规格。

5. 输出结果

请查看原始代码模板获取输出规格。

6. 业务价值 / ROI

  • 易处:PyMAL GitHub 开源(MAC 基准 + 多归因学习基线)
  • 易处:PVM 数学框架明确,可纯 Python 实现核心
  • 难处:PVM 主论文是理论论文,无官方代码
  • 难处:三平台 click_time 精确对齐需要 ETL 工程(timezone / 时间戳格式)

7. 代码模板

代码块数量:1 · 路径:未检测到

"""
PVM 跨平台归因窗口统一化最小骨架
主论文 arXiv:2511.22918 (NeurIPS 2025)
辅: PyMAL https://github.com/alimama-tech/PyMAL
依赖: pip install numpy
"""
from __future__ import annotations
from dataclasses import dataclass, field
from datetime import datetime, timedelta
from typing import Dict, List, Optional

import numpy as np


ATTRIBUTION_WINDOWS = {
    "amazon": timedelta(days=14),
    "meta": timedelta(days=7),
    "tiktok": timedelta(days=7),
}


@dataclass
class TouchPoint:
    platform: str
    click_time: datetime
    spend: float = 0.0


@dataclass
class Conversion:
    order_id: str
    convert_time: datetime
    revenue: float
    touchpoints: List[TouchPoint] = field(default_factory=list)


def normalize_to_conversion_timeline(tp: TouchPoint, t0: datetime, window: timedelta) -> Optional[float]:
    """Step 1: 转化对齐时间归一化 t_i = t_i^abs - t_0"""
    relative_seconds = (tp.click_time - t0).total_seconds()
    if relative_seconds > 0:
        return None
    if tp.click_time < t0 - window:
        return None
    return relative_seconds


def pvm_attribution(conversion: Conversion, windows: Dict[str, timedelta] = None) -> Dict[str, float]:
    """Peer-Validated Mechanism: 信用按时序加权,sum <= 1"""
    windows = windows or ATTRIBUTION_WINDOWS
    eligible: Dict[str, float] = {}

    for tp in conversion.touchpoints:
        window = windows.get(tp.platform, timedelta(days=7))
        rel_t = normalize_to_conversion_timeline(tp, conversion.convert_time, window)
        if rel_t is not None:
            if tp.platform not in eligible or rel_t > eligible[tp.platform]:
                eligible[tp.platform] = rel_t

    if not eligible:
        return {}

8. 论文来源

  • 2511.22918
  • 2603.02184