paper2skills Playbook

ROAS Optimization and Ad Budget Allocation

Skill-ROAS-Budget-Optimization · 13-广告分析

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

1. 解决的问题

广告预算有限,如何在不同渠道(Facebook/Google/TikTok)、不同 campaign、不同受众之间分配,使总ROAS(广告支出回报率)最大化?

2. 核心算法逻辑

核心问题:广告预算有限,如何在不同渠道(Facebook/Google/TikTok)、不同 campaign、不同受众之间分配,使总ROAS(广告支出回报率)最大化?

3. 业务应用场景

业务问题:Momcozy 月预算50万,当前分配:Facebook 30万(ROAS 2.8)、Google 15万(ROAS 3.5)、TikTok 5万(ROAS 1.8)。团队想把TikTok预算砍了加到Google。

| 渠道 | 当前花费 | 当前ROAS | 边际ROAS | 建议动作 | |------|---------|---------|---------|---------| | Facebook | 30万 | 2.8 | 1.5 | 维持 | | Google | 15万 | 3.5 | 2.0 | 增加预算 | | TikTok | 5万 | 1.8 | 2.5 | 增加预算 |

决策反转:TikTok当前ROAS最低,但边际ROAS最高——说明它还在上升期,加大投入效率最高。Google虽然平均ROAS高,但边际ROAS已经下降。

4. 输入数据要求

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

5. 输出结果

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

6. 业务价值 / ROI

  • ROI:预算重新分配后整体ROAS提升20-30%,年增收50万+
  • 难度:⭐⭐⭐☆☆(3/5)— 曲线拟合简单,但边际ROAS概念需要理解
  • 优先级:⭐⭐⭐⭐⭐(5/5)— 直接决定广告预算的ROI

7. 代码模板

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

"""
ROAS Optimization and Budget Allocation — ROAS优化与预算分配
支持:花费-收入曲线拟合、边际ROAS计算、最优分配
"""

import numpy as np
import pandas as pd
from scipy.optimize import minimize


class ROASOptimizer:
    """ROAS优化器"""

    def __init__(self):
        self.curve_params = {}

    def fit_spend_revenue_curve(self, channel, spends, revenues):
        """
        拟合花费-收入曲线: Revenue = a * Spend^b

        Args:
            channel: 渠道名
            spends: 历史花费数组
            revenues: 历史收入数组
        """
        spends = np.array(spends)
        revenues = np.array(revenues)

        # 对数线性回归: log(Revenue) = log(a) + b * log(Spend)
        log_spend = np.log(spends + 1)
        log_revenue = np.log(revenues + 1)

        # 简单线性回归
        n = len(spends)
        b = np.sum((log_spend - log_spend.mean()) * (log_revenue - log_revenue.mean())) / \
            np.sum((log_spend - log_spend.mean()) ** 2)
        log_a = log_revenue.mean() - b * log_spend.mean()
        a = np.exp(log_a)

        self.curve_params[channel] = {'a': a, 'b': b}
        return a, b

    def predict_revenue(self, channel, spend):
        """预测给定花费下的收入"""
        if channel not in self.curve_params:
            return 0
        params = self.curve_params[channel]
        return params['a'] * (spend ** params['b'])

    def marginal_roas(self, channel, spend):
        """计算边际ROAS"""
        if channel not in self.curve_params:
            return 0
        params = self.curve_params[channel]
        a, b = params['a'], params['b']
        # d(Revenue)/d(Spend) = a * b * Spend^(b-1)
        return a * b * (spend ** (b - 1))

    def optimize_budget(self, channels, total_budget, min_budget_per_channel=5000):
        """

8. 论文来源

未自动抽取;请查看原始 Skill 卡片。