简介:这份中金公司2019年6月发布的传媒行业研究报告,聚焦手游流量运营(买量)模式,适合游戏行业研究者、投资分析人员及手游发行从业者阅读,用于理解效果广告分发逻辑与行业趋势。资源为1个PDF文件,压缩包约1.9MB,内容完整呈现25页研报正文,涵盖渠道合作与流量运营两大发行模式对比、发展历程与市场格局、三七互娱实践案例及投资建议等模块。报告系统拆解了流量运营的实质——通过媒体广告投放实现点击、下载、注册到付费的转化,并分析LTV与CAC平衡、收入成本错配带来的短期利润压力,以及买量成本温和增长下研运一体、精细化运营的竞争要求。目前已有126人学习,读者可借此掌握手游分发模式的核心框架、行业数据与估值判断,为投资决策或业务分析提供参考。
1. 传媒行业里的手游流量运营:一份 25 页研报能拆出什么可复用的东西
手游买量这件事,外行看是“砸钱投广告”,内行看是一套围绕 LTV、CPA、ROI 反复调参的流量运营系统。一份 25 页的行业研报,标题落在“传媒行业”和“流量运营模式”上,真正有价值的部分不是结论,而是它拆解这套系统的方式:钱从哪来、花到哪去、哪个环节的转化率决定了整条链路的生死。我做过几年投放侧的数据链路,也帮团队复现过研报里的测算模型,最深的体会是——研报给的是框架,落地要自己补参数。这篇笔记就按“研报讲了什么 → 怎么把它变成可跑的测算 → 参数怎么设 → 哪里容易翻车”的顺序,把这份材料拆成能上手的东西。适合做投放优化、数据分析、游戏发行的从业者,也适合想理解买量逻辑的产品同学。
2. 拆解流量运营模式:从研报框架到可计算的漏斗模型
研报类材料最大的问题是“看起来什么都说了,但落不了地”。25 页里通常有行业规模、渠道格局、买量成本趋势、典型案例拆解几块。真正能拿来复现的,是它隐含的那条漏斗:曝光 → 点击 → 下载 → 激活 → 付费。每一层都有转化率和成本,乘起来就是 ROI。这一章先把这条链路讲清楚,再给出可计算的模型。
2.1 流量运营的三个核心指标:CPA、LTV、ROI 的关系
买量圈子里有句话:不算 LTV 的 CPA 都是耍流氓。研报里反复出现的三个词,本质是一条公式链:
- CPA(单次激活成本)= 总投放花费 / 激活用户数
- LTV(用户生命周期价值)= 单个用户在整个生命周期内贡献的收入
- ROI= LTV / CPA
看起来简单,但坑在“生命周期”三个字。研报里给的 LTV 通常是 30 日、90 日或 180 日口径,不同口径算出来的 ROI 能差一倍。我一般会先确认研报用的是哪个口径,再决定自己的模型对齐哪个窗口。如果研报没写清楚,就按行业常见做法取 30 日和 90 日两套,分别算。
还有一个容易被忽略的点:CPA 要分渠道、分素材、分人群看。研报里给的是大盘均值,落到自己产品上,不同渠道的 CPA 可能差 3 到 5 倍。所以复现的第一步不是抄数字,而是搭一个能按维度拆分的表结构。
2.2 用 Python 搭一个最小可跑的 LTV/CPA 测算脚本
下面这段脚本是我常用的最小模型,输入是分渠道的投放数据和留存/付费数据,输出是分渠道的 ROI。研报里的框架可以直接映射到这几个字段上。
import pandas as pd import numpy as np # 模拟投放数据:渠道、花费、激活数 spend_data = pd.DataFrame({ 'channel': ['A', 'B', 'C'], 'spend': [50000, 80000, 30000], # 投放花费,单位元 'activations': [2500, 3200, 1800] # 激活用户数 }) # 模拟留存与付费数据:渠道、次日留存、30日留存、ARPU(30日) retention_data = pd.DataFrame({ 'channel': ['A', 'B', 'C'], 'd1_retention': [0.45, 0.38, 0.52], # 次日留存率 'd30_retention': [0.12, 0.09, 0.15], # 30日留存率 'arpu_30d': [8.5, 6.2, 11.0] # 30日每用户平均收入 }) # 合并 df = pd.merge(spend_data, retention_data, on='channel') # 计算 CPA df['cpa'] = df['spend'] / df['activations'] # 计算 LTV:这里用简化口径,ARPU * 留存衰减系数 # 实际项目中会用留存曲线积分,这里用30日留存做近似 df['ltv_30d'] = df['arpu_30d'] * (df['d30_retention'] / df['d1_retention']) * 3 # 计算 ROI df['roi_30d'] = df['ltv_30d'] / df['cpa'] print(df[['channel', 'cpa', 'ltv_30d', 'roi_30d']])逻辑说明:这段脚本的核心是把研报里的“漏斗”变成可计算的列。cpa是花费除以激活,ltv_30d这里用了一个简化公式——ARPU 乘以留存衰减比例再乘一个经验系数 3,这个系数来自我过往项目里 30 日 LTV 和 ARPU 的大致关系,不同品类要重新标定。roi_30d大于 1 说明 30 日能回本,小于 1 就要看 90 日或 180 日能不能拉回来。
参数说明:d1_retention和d30_retention是留存曲线的两个锚点,如果研报里给了留存数据,直接替换;如果没有,用自己产品的历史数据。arpu_30d是 30 日每用户平均收入,这个值受付费率和 ARPPU 影响,建议分渠道算,不要用大盘均值。
2.3 把研报里的渠道格局映射成可对比的维度表
研报里通常会有一张渠道格局图,比如信息流、应用商店、社交裂变各占多少。这张图的价值在于帮你确定“钱该往哪投”。我一般会把它转成一张维度表,每个渠道一行,列出研报给的份额、自己产品的历史 CPA、可测试的预算上限。
| 渠道类型 | 研报份额参考 | 常见 CPA 区间 | 适合的素材形式 | 测试预算建议 |
|---|---|---|---|---|
| 信息流 | 40%-50% | 15-40 元 | 短视频、试玩 | 总预算 30% |
| 应用商店 | 20%-30% | 8-20 元 | 图标、截图 | 总预算 20% |
| 社交裂变 | 10%-15% | 5-15 元 | 邀请海报 | 总预算 15% |
| 其他 | 10%-20% | 波动大 | 混合 | 总预算 35% |
这张表的作用是:当你拿到研报里的份额数据后,不要直接按份额分配预算,而是结合自己产品的历史 CPA 做加权。份额高但 CPA 也高的渠道,未必值得加投。我一般会先按这张表跑一轮小预算测试,再决定加码方向。
3. 从研报数据到投放决策:参数标定与预算分配
上一章把模型搭起来了,但模型能不能用,取决于参数标定。研报给的是行业均值,你的产品有自己的留存曲线和付费分布。这一章讲怎么把研报数据“翻译”成自己产品的参数,以及预算怎么分。
3.1 留存曲线拟合:用研报的留存数据反推衰减系数
研报里如果给了次日、7 日、30 日留存,可以直接拟合一条衰减曲线。常见做法是用幂函数:留存(t) = a * t^(-b)。有了 a 和 b,就能推算任意天数的留存,进而算 LTV。
from scipy.optimize import curve_fit import numpy as np # 研报或自己产品的留存锚点 t = np.array([1, 7, 30]) retention = np.array([0.45, 0.20, 0.12]) # 幂函数模型 def power_law(t, a, b): return a * np.power(t, -b) # 拟合 popt, _ = curve_fit(power_law, t, retention, p0=[0.5, 0.3]) a, b = popt print(f"拟合参数: a={a:.4f}, b={b:.4f}") # 预测 90 日留存 d90 = power_law(90, a, b) print(f"预测 90 日留存: {d90:.4f}")逻辑说明:curve_fit用最小二乘拟合幂函数参数。a反映首日留存水平,b反映衰减速度。b越大,留存掉得越快,LTV 越低。研报里的留存数据可以直接代入,如果只有一两个锚点,拟合会不稳定,建议至少三个点。
参数说明:p0是初始猜测值,一般取[首日留存, 0.3]。如果拟合报错,检查留存数据是否单调递减。预测 90 日留存后,可以用它替换上一章脚本里的d30_retention,得到更长的 LTV 窗口。
3.2 预算分配的边际效应:为什么不能把所有钱投给 ROI 最高的渠道
新手最容易犯的错是:算出 A 渠道 ROI 最高,就把预算全压 A。实际投放里,每个渠道都有边际效应——花得越多,CPA 越高,ROI 越低。研报里通常不会写这个,但这是落地时最关键的约束。
我一般会用一个简单的饱和模型来估算:CPA(x) = CPA0 * (1 + k * x / X_max),其中 x 是当前花费,X_max 是渠道预估的最大可消化预算,k 是衰减系数。这个模型不精确,但能防止“一把梭”。
| 渠道 | 当前花费 | 预估最大预算 | 当前 CPA | 边际 CPA 估算 |
|---|---|---|---|---|
| A | 5 万 | 20 万 | 20 元 | 24 元 |
| B | 8 万 | 15 万 | 25 元 | 33 元 |
| C | 3 万 | 10 万 | 17 元 | 19 元 |
这张表告诉你:C 渠道当前 CPA 最低,边际 CPA 也最低,应该优先加预算;A 渠道虽然当前 CPA 不高,但已经花了最大预算的 25%,边际成本在上升;B 渠道最贵,边际也最贵,应该控制。
3.3 用回归分析找出影响 CPA 的关键因子
研报里可能会提到“素材质量”“投放时段”“人群包”对 CPA 的影响,但不会给量化关系。我一般会用自己的投放日志跑一个回归,找出哪些因子显著。
import statsmodels.api as sm import pandas as pd # 模拟投放日志:素材类型、时段、人群包大小、CPA log = pd.DataFrame({ 'material_type': [0, 1, 0, 1, 0, 1, 0, 1], # 0=视频, 1=试玩 'hour': [10, 14, 20, 22, 10, 14, 20, 22], 'audience_size': [100, 200, 150, 300, 120, 180, 160, 280], 'cpa': [22, 18, 25, 30, 20, 17, 24, 28] }) X = log[['material_type', 'hour', 'audience_size']] X = sm.add_constant(X) y = log['cpa'] model = sm.OLS(y, X).fit() print(model.summary())逻辑说明:sm.OLS做普通最小二乘回归,输出每个因子的系数和显著性。material_type系数为负说明试玩素材 CPA 更低;hour系数为正说明晚高峰 CPA 更高;audience_size系数反映人群包大小对成本的影响。
参数说明:add_constant加截距项,否则回归会过原点。样本量至少 30 条以上才有统计意义,研报里的案例数据可以当先验,但最终要用自己的日志。如果某个因子 p 值大于 0.05,说明在当前数据下不显著,不要硬解释。
4. 避坑与排查:流量运营测算里最容易翻车的五个地方
这一章是我自己踩过的坑,也是帮别人复现研报时最常被问到的。每条按“现象 → 原因 → 解决”写,不绕弯子。
4.1 现象:ROI 算出来大于 1,实际投放却亏钱
原因:LTV 口径和 CPA 口径不匹配。常见情况是 LTV 用了 90 日预测值,CPA 用了首日实际值,时间窗口不对齐。另一个原因是 LTV 里包含了自然量用户,而 CPA 只算了买量用户。
解决:统一窗口。要么都用 30 日,要么都用 90 日。自然量和买量分开算,买量 ROI 只看买量用户的 LTV。我一般会在脚本里加一列user_type,强制区分。
4.2 现象:留存曲线拟合出来是负数或爆炸
原因:锚点太少或数据不单调。比如只给了次日和 30 日留存,中间没有 7 日,拟合自由度太高。或者留存数据里混入了异常值,比如某天做了活动导致留存突增。
解决:至少三个锚点,且确认单调递减。如果有异常值,先剔除再拟合。幂函数拟合失败时,可以退化成对数函数或分段线性,不丢人。
4.3 现象:预算全压一个渠道后,CPA 一周内翻倍
原因:忽略了边际效应和渠道库存。每个渠道能触达的用户量有限,花得越快,越容易触达低意向用户,CPA 自然上升。
解决:设置单渠道预算上限,按周逐步加量,每次加量不超过 20%。同时监控边际 CPA,一旦超过目标 CPA 的 1.2 倍就暂停加量。
4.4 现象:回归分析显示所有因子都不显著
原因:样本量太小,或者因子之间高度相关。比如素材类型和时段可能有关联,导致多重共线性。
解决:先做相关性矩阵,剔除高度相关的因子。样本量不够就拉长观察周期,或者降低因子维度。我一般会先跑单因子分析,再跑多因子,避免一上来就全塞进去。
4.5 现象:研报里的行业均值套到自己产品上,完全对不上
原因:品类差异。研报可能覆盖的是大盘或某个特定品类,你的产品可能是另一个品类,留存和付费结构完全不同。
解决:把研报数据当先验,用自己的数据做贝叶斯更新。简单做法是:先按研报参数跑一版,再用自己产品的实际数据校准,取两者的加权平均。权重根据自己数据的样本量决定,样本少就多信研报,样本多就多信自己。
5. 进阶:把 25 页研报变成可持续迭代的投放看板
最后一章讲一个具体技巧:怎么把研报里的静态数据变成每天更新的投放看板。我自己的习惯是,任何一份行业材料,如果不能在两周内变成看板上的一个指标,就说明它没被真正消化。
5.1 看板的最小字段集
一个能用的投放看板,至少要有这些字段:日期、渠道、花费、激活数、CPA、次日留存、30 日留存、ARPU、LTV、ROI。研报里的行业均值可以作为参考线,画在看板上,方便对比。
| 字段 | 来源 | 更新频率 | 用途 |
|---|---|---|---|
| 花费 | 投放后台 | 每日 | 算 CPA |
| 激活数 | 归因系统 | 每日 | 算 CPA |
| 次日留存 | 埋点 | 每日 | 拟合留存曲线 |
| 30 日留存 | 埋点 | 每日(滞后) | 算 LTV |
| ARPU | 支付系统 | 每日 | 算 LTV |
| 行业均值 | 研报 | 一次性 | 参考线 |
5.2 用定时任务每天刷新测算
# 每天凌晨 2 点跑一次测算脚本 0 2 * * * /usr/bin/python3 /path/to/roi_calculator.py >> /var/log/roi.log 2>&1逻辑说明:crontab定时任务,每天凌晨 2 点执行脚本,输出追加到日志。脚本里读前一天的数据,算完写入看板数据库。
参数说明:时间选凌晨是因为投放数据通常凌晨才结算完。日志要保留,方便排查脚本报错。如果数据量大,可以改成增量计算,只算最近 7 天。
5.3 一个我坚持了三年的习惯
每次拿到新的行业研报,我会先问自己三个问题:这份材料里的哪个指标能直接进我的看板?哪个参数需要用自己的数据重新标定?哪个结论如果错了,我的投放策略会崩?这三个问题答不上来,材料就先放着,不急着复现。三年下来,这个习惯帮我省了很多无效折腾。希望帮到你。
本文还有配套的精品资源,点击获取