-
2022-02-21 17:34:40
近年来,购物方式发生了巨大变化。如今,知情的客户在投资任何项目之前都会进行研究,并且只有在通过多种渠道和网站为自己获得最优惠的价格后才能进行在线购买。但是,这使得营销人员很难在做出有意识的选择之前正确确定客户接触了多少营销渠道。
如果我们确定客户在购买他们最喜欢的产品之前经过的渠道路径,我们可以使用渠道归因模型分析哪个渠道帮助他们进行了购买。这样的多渠道报告将为我们提供两个重要的转化价值:最终点击转化和辅助转化。
在这篇文章中,我将向您展示如何使用Python构建多渠道归因模型,然后可以将其用于检索我上面提到的有价值的信息。这将极大地帮助任何企业甚至个人卖家的营销策略。
传统电子商务归因模型
在我向您展示如何基于Python构建归因模型之前,首先快速浏览一些传统的电子商务归因模型会很有帮助。
由于客户变得更加注重研究,并且更愿意在沉迷于产品之前探索所有渠道,因此市场机构使用营销归因模型来追踪影响客户购买的渠道:
- 第一次接触归因模型——第一个渠道获得 100% 的信用,因为它被认为是负责客户购买决策的第一个营销渠道。
- 最后一次接触归因模型——最后一个渠道或最后一个接触点在此模型中被赋予 100% 的功劳,因为认为最后接触的营销渠道对客户的购买选择负责。
- 线性接触归因模型——在此归因模型中,客户旅程中存在的所有营销渠道都被赋予同等的功劳。每个渠道都被视为平等地影响客户的购买选择。
- U 形或浴缸归因模型——该模型将 40% 分配给第一个和最后一个通道,20% 平均分配给其余通道。这种渠道在电子商务公司中最为常见。
显然,每种模型都可以对客户行为提供不同的见解。具体细节在一定程度上取决于所涉及的业务,但这正是多渠道归因模型的价值所在,因为它使我们能够了解在给定上下文中最适合什么。
现在我们已经简要了解了各种模型,是时候看看我们如何构建自己的多渠道归因模型了。
构建多渠道归因模型的 Python 代码
让我们采用以下数据集。在列中,我们有参与活动,并且我们有连续参与的渠道。该数据集保持时间顺序。我们为每个营销渠道分配了一个固定的数值,并以这样一种方式显示它们:在 x 列中,x 的参与度是从具有相应营销渠道的用户那里获取的。
我们已经转换了通道 21 中的数据。因此,数据集包含用户转换的旅程。
让我们通过导入必要的库来迈出第一步。在这里,您必须导入 Pandas 库进行数据操作,Seaborn进行数据分析,Matplotlib进行数据可视化,以及创建新流程的子流程。
下一步是加载数据集,您可以使用 pd.read_csv() 函数来完成。现在,您需要使用 df.columns 获取列列表。完成后,您可以遍历列以将所有整数更改为字符串。之后,必须清理数据点。
这里,需要用到马尔科夫链框架;因此,您需要将用户旅程放在一个变量中。您需要将其视为第一通道>第二通道>第三通道等形式。下一段代码将执行此活动。
在数据集中,通道号 21 是转换事件。因此,我们需要将此通道与原始路径分离。之后,您必须创建另一个转换变量来保存成功转换的数量。以下代码块将完成此操作。
恭喜,您已完成数据操作过程!
现在,您必须获取下一步需要转发的列子集,因为您的数据集仍然具有原始数据集。您还需要在此处对用户数据进行分组,因为许多用户可以进行相同的旅程。
您的转化变量将分别包含每个客户旅程的转化次数。此外,我们需要创建另一个 CSV 文件来存储路径数据。您可以使用此 CSV 文件来运行归因方法。
现在,您有两个选择。第一个是使用 pip 安装频道归因模块。要安装此模块,只需转到您的终端,然后编写以下内容:
pip install --upgrade setuptools
pip install Cython
pip install ChannelAttribution第二种选择是您自己在Python中创建马尔可夫网络/链。尽管如此,将 Python 代码与 R 编程语言中的“ChannelAttribution”库集成会更快。该库包含频道归因的所有可执行组件。您可以使用 Python 库子流程来完成此操作。
如果您想计算第一次触摸归因,以下代码块将帮助您。
与第一次触摸类似,您也可以计算最后一次触摸的归因。以下代码块将完成此操作。
另外,如果需要计算线性归因,可以运行下面这段代码。
现在,您可以按照分步过程使用 Python 编程语言构建多渠道归因模型。试一试,看看结果。
实施数据驱动归因模型的挑战
领先的营销人员依赖数据驱动的归因模型,因为它可以有效地确定接触点对客户旅程的影响。品牌现在可以获取他们需要的数据并进行分析,因为这有助于他们根据客户洞察改进营销策略。
但是,在实施数据驱动的归因模型时,您可能会面临各种挑战。这些包括:
- 采取行动或获得洞察力之间的两难选择可能是您将面临的根本挑战。您将始终希望添加一个新的数据点,这将为您提供更多见解。它可能会导致缓慢的改进和升级。
- 有各种可用的归因模型。因此,您需要从各种选项中进行选择。大多数情况下,特定的归因模型会带来优化的结果。因此,找到完美的模型具有挑战性,需要更多的研究。
- 你会发现各种工具来实现。但是你需要选择完美的组合。您的团队必须知识渊博,才能克服这一挑战。
- 您需要整合离线和在线接触点,以获得正确的客户洞察力。因此,您可能会面临许多挑战,例如准确记录客户洞察、识别每个接触点的唯一键、影响问题等。
每种情况都需要一个独特的解决方案。需要耐心分析问题以提出最佳解决方案。每个公司可能有不同的要求,团队成员之间需要出色的协调和同步来满足特定需求。
在任何时候不放弃都会引导你达到你的最终目标。提出较小的改进总有一天会让你取得巨大的成功,所以要保持热情,以积极的心态和乐观的观点面对每一个挑战。
知识就是力量
在这篇文章中,我向您展示了如何使用 Python 制作多渠道归因模型。如您所见,目前使用的电子商务归因模型有很多种,每种模型都有自己的特点。
此外,使用数据驱动的归因模型涉及某些挑战,从采取行动或获得洞察力之间的两难选择,到您必须做出的各种选择。
尽管如此,知识就是力量:了解客户旅程为您提供了采取适当行动的资源。希望这篇文章能为您的知识提供最好的结果,并很好地服务于您的目的。
如果对Python有兴趣,想了解更多的Python以及AIoT知识,解决测试问题,以及入门指导,帮你解决学习Python中遇到的困惑,我们这里有技术高手。如果你正在找工作或者刚刚学校出来,又或者已经工作但是经常觉得难点很多,觉得自己Python方面学的不够精想要继续学习的,想转行怕学不会的, 都可以加入我们,可领取最新Python大厂面试资料和Python爬虫、人工智能、学习资料!微信公众号【Python大本营】等你来玩奥~
更多相关内容 -
金工:_Brinson绩效归因模型原理与实践.rar
2021-09-09 18:59:19金工:_Brinson绩效归因模型原理与实践 -
20210221-华泰证券-金工:_Brinson绩效归因模型原理与实践.pdf
2021-06-20 00:48:4620210221-华泰证券-金工:_Brinson绩效归因模型原理与实践.pdf -
迈向数字归因模型:衡量展示广告对在线消费者行为的影响-研究论文
2021-05-20 07:07:25个人水平数据的可用性不断提高,已经提高了数字广告中可度量性和责任制的标准。 利用大量的个人数据集,我们的论文捕获了展示广告在各种消费者... 我们用于评估展示广告效果的框架是通向因果解决数字归因问题的垫脚石。 -
【基金量化研究系列】基金绩效归因模型——Brinson多期归因模型之python实现
2020-05-10 00:11:46Brinson多期归因模型的Python实现2.1 基准数据读取模块2.2 持仓数据读取模块2.3 持仓收益与基准计算模块2.4 Brinson多期归因模型核心算法Brinson_Multiple2.5 主函数模块3. 归因结果写在最后 1. 引言 在上文中,...文章目录
【更新日志】
8/6/2020 对代码中计算择时与择股收益公式的错误进行了修正,并将数据结构框架补充在了附录中
1. 引言
在上文中,我们已经介绍了Brinson归因模型的基本思想和基本方法。在这篇文章中,就让我们动起手来实现这一方法吧!
在Brinson多期归因模型实现的过程中,本文使用模块化方法,将整个实现过程划分为如下五个功能板块:
Module 1: 基准数据读取模块(功能函数:benchmark_load)
Module 2: 持仓数据读取模块(功能函数:positions_load)
Module 3: 持仓收益与基准计算模块(功能函数:w_r_calculation)
Module 4: Brinson多期归因模型核心算法(功能函数:Brinson_Multiple)
Module 5: 主函数模块注1:由于每个人数据都不一样,因此读者可以仅参考自己认为有用的模块(比如Brinson模型的核心算法)。
注2:由于本人自己的持仓数据比较敏感,在此仅展示代码实现框架。读者可以将自己的数据稍作处理后套用与本模板。
2. Brinson多期归因模型的Python实现
2.1 基准数据读取模块
# 0. 导入pandas库 import pandas as pd # 1. 基准数据读取函数 ''' · 函数功能:读取基准数据 · 输入变量:基准数据存储的地址路径,格式为str · 输出变量:基准的权重矩阵和收益矩阵,格式为DataFrame的list · 数据样式介绍: 1) 基准的权重存储于某xlsx或xls文件中,共有两个sheets,分别命名为"Weights"和"Return"; 2) 数据的第一列为交易日日期,列名为“日期”,其列格式为“datatime64”; 3) 数据表头为各行业名称。 ''' def benchmark_load(benchmark_path): benchmark_weights = pd.read_excel(benchmark_path, sheet_name='Weights', index_col='日期') benchmark_returns = pd.read_excel(benchmark_path, sheet_name='Return', index_col='日期') return [benchmark_weights, benchmark_returns]
注:除本地导入基准数据外,可以通过API接口直接获取基准数据,如wind数据库、tushare数据库等
2.2 持仓数据读取模块
# 2. 读取持仓数据 ''' · 函数功能:读取持仓数据 · 输入变量:持仓数据存储的地址路径,格式为str · 输出变量:标准持仓数据,格式为DataFrame,columns为数据名称,index为对应股票的持仓日期 · 数据样式介绍: 1) 全部的持仓数据,包括:持仓股票代码,股票所属行业,持仓日期、市值、当日卖出金额、当日买入金额等; 2) 数据表头为各数据名称; 3) 原始数据可以不按照交易日先后顺序排列。 ''' def positions_load(positions_path): pf_data= pd.read_excel(positions_path) pf_data.drop_duplicates() # 数据去重 pf_data = pf_data[['持仓日期', '市值', '行业', '当日卖出金额', '当日买入金额']] # 选定需要使用的列 pf_data['持仓日期'] = pf_data['持仓日期'].astype('datetime64') # 转化日期格式 return pf_data
2.3 持仓收益与基准计算模块
# 3. calculate the weights and the returns of the portfolio ''' · 函数功能:计算所持仓位的权重和收益矩阵 · 输入变量: 1) trading_dates:从基准值提取的交易日信息,格式为list 2) sectors: 从基准中提取行业名称(本码为申万一级),格式为list 3) pf_data:使用读取函数读取到的数据 · 输出变量:持仓的权重矩阵和收益矩阵,格式为DataFrame的list ''' def w_r_calculation(trading_dates, sectors, pf_data): # sectors: 从基准中提取行业名称(申万一级) # trading_dates 从基准值提取交易日信息 # Part 1: 初始化一些存储用的中间变量 pf_weights = pd.DataFrame(0, columns=sectors, index=td_dates).astype('float') # 存储持仓权重 pf_values = pd.DataFrame(0, columns=sectors, index=td_dates).astype('float') # 存储所持头寸在各行业在各交易日末的市值 pf_cin = pd.DataFrame(0, columns=sectors, index=td_dates).astype('float') # 存储所持头寸在个交易日各行业的现金流入情况(卖股) pf_cout = pd.DataFrame(0, columns=sectors, index=td_dates).astype('float') # 存储所持头寸在个交易日各行业的现金流出情况(买股) pf_r = pd.DataFrame(0, columns=sectors, index=td_dates).astype('float') # 存储持仓收益率 # Part 2: 计算过程 for d in td_dates: data_sub2 = pf_data[(pf_data['持仓日期'] == d)] for s in sectors: data_sub1 = pf_data[(pf_data['行业'] == s) & (pf_data['持仓日期'] == d)] pf_cin[s][d] = data_sub1['当日卖出金额'].sum() pf_cout[s][d] = data_sub1['当日买入金额'].sum() pf_values[s][d] = data_sub1['市值'].sum() if data_sub2['市值'].sum() + data_sub2['当日买入金额'].sum() == 0: pf_weights[s][d] = 0 else: pf_weights[s][d] = (pf_values[s][d] + pf_cout[s][d]) / ( data_sub2['市值'].sum() + data_sub2['当日买入金额'].sum()) if td_dates.index(d) > 0 and (pf_values[s][td_dates[td_dates.index(d) - 1]] + pf_cout[s][d]) > 0: pf_r[s][d] = (pf_values[s][d] + pf_cin[s][d]) / ( pf_values[s][td_dates[td_dates.index(d) - 1]] + pf_cout[s][d]) - 1 return [pf_weights, pf_r]
2.4 Brinson多期归因模型核心算法Brinson_Multiple
# 4. build up the Brison Model ''' · 函数功能:Brinson多期模型核心算法,计算组合相对基准的择时收益、择股收益和交互作用 · 输入变量: 1)p_w:组合权重 2) p_r: 组合收益 3) b_w: 基准权重 4)b_r: 基准收益 · 输出变量:总超额收益、择时收益、择股收益和交互作用收益率,格式为DataFrame ''' def Brinson_Multiple(p_w, p_r, b_w, b_r): sectors = list(b_w.columns) # 从基准中提取行业名称(申万一级) td_dates = list(b_w.index) # 从基准值提取交易日信息 ticker = ['R_pp', 'R_pb', 'R_bp', 'R_bb'] cum_R = pd.DataFrame(0, columns=ticker, index=td_dates).astype('float') single_R = pd.DataFrame(0, columns=ticker, index=td_dates).astype('float') for d in td_dates[1:]: for s in sectors: single_R['R_bb'][d] += b_w[s][d] * b_r[s][d] single_R['R_bp'][d] += b_w[s][d] * p_r[s][d] single_R['R_pb'][d] += p_w[s][d] * b_r[s][d] single_R['R_pp'][d] += p_w[s][d] * p_r[s][d] for t in ticker: for dd in td_dates[0:td_dates.index(d)]: cum_R[t][d] += (cum_R[t][dd] + 1) * single_R[t][td_dates[td_dates.index(dd) + 1]] Total_Excess_Return = cum_R['R_pp'] - cum_R['R_bb'] Time_Selection = cum_R['R_pb'] - cum_R['R_bb'] Stock_Selection = cum_R['R_bp'] - cum_R['R_bb'] Interactive_Effect = Total_Excess_Return - Time_Selection - Stock_Selection Outcome = pd.DataFrame(list(zip(Total_Excess_Return, Time_Selection, Stock_Selection, Interactive_Effect)), columns=['Total_Excess_Return', 'Time_Selection', 'Stock_Selection', 'Interactive_Effect'], index=td_dates) return Outcome
2.5 主函数模块
各模块编写好之后,使用如下主函数直接调用即可
# main part: benchmark_path = '你的基准数据存放地址' # 请修改 positions_path = '你的持仓数据存放地址' # 请修改 # 读取数据 benchmark = benchmark_load(benchmark_path) pf_data = data_load(positions_path) # 获取基准权重和收益 b_w = benchmark[0] b_r = benchmark[1] # 提取交易日和行业名称,并作为裂变 sectors = list(b_w.columns) # 从基准中提取行业名称(申万一级) td_dates = list(b_w.index) # 从基准值提取交易日信息 # 计算持仓权重和收益 p_w_r = w_r_calculation(td_dates, sectors, pf_data) p_w = p_w_r[0] p_r = p_w_r[1] # 使用Brinson多期模型 outcome = Brinson_Multiple(p_w=p_w, p_r=p_r, b_w=b_w, b_r=b_r) # 打印结果,并将结果导出为excel形式 print(outcome.head()) path_outcome = '你的文件输出地址' # 请修改 outcome.to_excel(path_outcome, index=True, header=True)
3. 实证分析
现以本人的某一权益类持仓账户为例,以日频为收益分解子周期,用上述代码产生的结果进行归因分析。在基准数据的选择中,本人以中证800为基准,并以申万一级行业的超低配作为择时的收益来源,对近两年来的某120个交易日的持仓数据进行归因,归因结果如图1所示:
*基准数据来源:Wind数据库图1 我的某持仓账户在某半年间各交易日上的 Brinson多期归因分解(为显示简洁日期已做序号化处理。序号0为起始交易日,序号n表示在0-n交易日之间的累计收益情况。其中:蓝色柱子为总累计超额收益,红色柱子为择时收益,绿色柱子为择股收益,紫色柱子为交互作用收益)
只看最后一根柱子,可以看出在这120多个交易日中,这一账户实现了正的超额收益(如蓝柱部分所示)。其中,大部分收益来自于择股收益(如绿柱部分所示),小部分收益来自于择时收益(如红柱部分所示)。交互作用则贡献了少量的负向收益(如紫柱部分所示)。
综合整体归因数据来看,这一账户的累计超额收益在前22个交易日中逐渐增厚,后进入下滑和波动阶段,并在第78个交易日开始逐渐回升。择股收益在这120个交易日中一直有着较好的收益贡献(绿柱一直上升),说明账户管理人在行业内股票选择上有相对优势,可以进一步保持;而在择时层面上来看在超额收益下滑这一段时间内产生了较大的负向收益,是拖累总超额收益的主要来源,这说明资产组合在行业配置上存在一定的短板。因此,账户管理人还需要在行业配置能力上做进一步提升。
附录:数据格式补充说明
这段时间,有很多小伙伴私信问我数据格式的问题。原始数据比较敏感因此不能在此公开展示(十分抱歉!!!),不过为方便各位小伙伴可以更清楚地了解数据的导入过程,我可以补充展示一下我使用的数据的基本结构和框架,仅供小伙伴们参考~:
(1)基准数据框架
本文使用的基准数据框架如附图1所示:
附图1 基准数据框架在这个.xlsx文件中,共有两个sheets,分别命名为Weights和Return,分别存储基准的权重和基准的收益率矩阵。本文使用的基准是中证800指数(指数代码000906),所以每一个矩阵中的行和列分别表示每一个申万一级行业在每一个归因子周期(本文为日频)在全行业中的权重占比和行业收益率。
注:也有小伙伴问我行业权重和收益率如何获取。本人在此使用的是收费的WIND数据库,如果有小伙伴有免费开源的数据库可以私信我或者在评论区留言!谢谢!
(2)持仓数据框架
本文使用的持仓数据框架如附图2所示:
附图2 持仓数据框架在这个.xlsx文件中,只有一个sheet,逐笔记录了每一个归因子周期(本文为日频)的持仓日期、所持证券的名称和代码、所属行业(需与基准行业名称一致)、当期的买入金额和卖出金额。这里多做一点解释:投资者在每一个子周期中可能会进行“做T操作”(比如当日低吸高抛),这一部分的收益需要进行计算,可以参考【基金量化研究系列】基金绩效归因模型——Brinson多期归因模型中子周期收益率的计算公式。
注:在持仓数据框架中既可以按照股票顺序排序,也可以按照持仓交易日排序。因为在组合收益率计算模块中,已经暗含了按基准的交易日进行顺序搜索的操作了。
如果小伙伴有更为优化的数据格式,欢迎在评论区中交流!
写在最后
若想查阅本系列全部文章,请参见目录页:系列文章目录索引。
欢迎感兴趣的小伙伴来跟作者一起挑刺儿~ 包括但不限于语言上的、排版上的和内容上的不足和疏漏~ 一起进步呀!
有任何问题,欢迎在本文下方留言,或者将问题发送至勘误邮箱: mikeysun_bugfix@163.com谢谢大家!
-
【基金量化研究系列】基金绩效归因模型——Brinson多期归因模型
2020-05-15 00:29:25Brinson单期归因模型2.1 模型框架2.2 公式推导3. Brinson多期归因模型3.1 模型框架3.2 公式推导4. Brinson模型的应用场景4.1 基金组合归因4.2 基金经理能力刻画4.3 大类资产配置应用5. 模型的实现与实证案例研究写...文章目录
注:本文暂未完成,预计完成时间5/17,敬请期待
1. 引言
2. Brinson单期归因模型
2.1 模型框架
wp wb rp 组合收益:wp rp 择股收益:wb rp rb 择时收益:wp rb 基准收益:wb rb 2.2 公式推导
R E = ∑ i = 1 n w i p r i p − ∑ i = 1 n w i b r i b = ∑ i = 1 n ( w i p r i p − w i b r i b ) = ∑ i = 1 n ( w i p r i b − w i b r i b + w i b r i p − w i b r i b + w i p r i p − w i p r i b − w i b r i p + w i b r i b ) = ∑ i = 1 n ( w i p − w i b ) r i b + ∑ i = 1 n w i b ( r i p − r i b ) + ∑ i = 1 n ( w i p − w i b ) ( r i p − r i b ) = R A + R S + R I R_{E}= \sum_{i=1}^{n}w_i^pr_i^p - \sum_{i=1}^{n}w_i^br_i^b \\ = \sum_{i=1}^{n} (w_i^pr_i^p - w_i^br_i^b) \\ = \sum_{i=1}^{n} (w_i^pr_i^b - w_i^br_i^b+ w_i^br_i^p-w_i^br_i^b+ w_i^pr_i^p- w_i^pr_i^b - w_i^br_i^p + w_i^br_i^b) \\ = \sum_{i=1}^{n} (w_i^p - w_i^b)r_i^b + \sum_{i=1}^{n} w_i^b(r_i^p-r_i^b) + \sum_{i=1}^{n}( w_i^p- w_i^b)(r_i^p- r_i^b )\\ =R_A + R_S + R_I RE=i=1∑nwiprip−i=1∑nwibrib=i=1∑n(wiprip−wibrib)=i=1∑n(wiprib−wibrib+wibrip−wibrib+wiprip−wiprib−wibrip+wibrib)=i=1∑n(wip−wib)rib+i=1∑nwib(rip−rib)+i=1∑n(wip−wib)(rip−rib)=RA+RS+RI
其中:
· RE 为总超额收益;
· RTS 为择时收益:
R T S = ∑ i = 1 n ( w i p − w i b ) r i b R_{TS} = \sum_{i=1}^{n} (w_i^p - w_i^b)r_i^b RTS=i=1∑n(wip−wib)rib· RSS 为择股收益:
R S S = ∑ i = 1 n w i b ( r i p − r i b ) R_{SS} = \sum_{i=1}^{n} w_i^b(r_i^p-r_i^b) RSS=i=1∑nwib(rip−rib)· RIE 为交互作用:
R I E = ∑ i = 1 n ( w i p − w i b ) ( r i p − r i b ) R_{IE} = \sum_{i=1}^{n}( w_i^p- w_i^b)(r_i^p- r_i^b ) RIE=i=1∑n(wip−wib)(rip−rib)
3. Brinson多期归因模型
3.1 模型框架
然而,各期之间存在复利效应,因此需要进行多期归因。多期可以理解为每一个单独周期的组合。
3.2 公式推导
在多期模型中,有两种推导方法,二者理解的角度不同,但是公式在本质上是等价的。
方法一:递推方法
1 + R t = ( 1 + r 1 ) ( 1 + r 2 ) ⋅ ⋅ ⋅ ( 1 + r t ) = ( 1 + R t − 1 ) ( 1 + r t ) = 1 + R t − 1 + R t − 1 ( 1 + r t ) 1 + R_t = (1+ r_1)( 1 + r_2) ···(1 + r_t) \\ = ( 1 + R_{t-1})( 1+ r_t) = 1 + R_{t-1} + R_{t-1}( 1+ r_t) 1+Rt=(1+r1)(1+r2)⋅⋅⋅(1+rt)=(1+Rt−1)(1+rt)=1+Rt−1+Rt−1(1+rt)
规定 R0 = 0,则上式变型后可以得到递推式::
R t = R t − 1 + ( 1 + R t − 1 ) r t = R t − 2 + ( 1 + R t − 2 ) r t − 1 + ( 1 + R t − 1 ) r t = ⋅ ⋅ ⋅ = ∑ τ = 1 t ( 1 + R τ − 1 ) r τ = ∑ τ = 1 t ( 1 + R τ − 1 ) ∑ i = 1 n w i τ r i τ R_t = R_{t-1} +( 1+ R_{t-1})r_t \\ = R_{t-2} + ( 1+ R_{t-2})r_{t-1} + (1 + R_{t-1})r_{t} \\ = \cdot\cdot\cdot \\ =\sum_{\tau = 1}^{t}(1+R_{\tau - 1})r_{\tau} \\ = \sum_{\tau = 1}^{t}(1+R_{\tau - 1}) \sum_{i = 1}^{n}{w_{i\tau}r_{i\tau}} Rt=Rt−1+(1+Rt−1)rt=Rt−2+(1+Rt−2)rt−1+(1+Rt−1)rt=⋅⋅⋅=τ=1∑t(1+Rτ−1)rτ=τ=1∑t(1+Rτ−1)i=1∑nwiτriτ累计超额收益为:
R E ( t ) = R t p p − R t b b R_E(t) = R^{pp}_t - R^{bb}_t RE(t)=Rtpp−Rtbb择时收益为:
R A ( t ) = R t p b − R t b b R_A(t) = R^{pb}_t - R^{bb}_t RA(t)=Rtpb−Rtbb择股收益为:
R S ( t ) = R t b p − R t b b R_S(t) = R^{bp}_t - R^{bb}_t RS(t)=Rtbp−Rtbb交互作用为:
R I ( t ) = R E ( t ) − R A ( t ) − R S ( t ) R_I(t) = R_E(t) - R_A(t) - R_S(t) RI(t)=RE(t)−RA(t)−RS(t)方法二:乘数因子方法
分别考虑 t 期的基准累计收益率 Rp 和组合累计收益率 Rb:
1 + R t p = ∏ τ = 1 t ( 1 + r τ p ) 1 + R t b = ∏ τ = 1 t ( 1 + r τ b ) 1 + R_t^p = \prod _{\tau=1} ^ t (1+ r_{\tau}^p) \\ 1 + R_t^b = \prod _{\tau=1} ^ t (1+ r_{\tau}^b) 1+Rtp=τ=1∏t(1+rτp)1+Rtb=τ=1∏t(1+rτb)
对两边取对数运算:
ln ( 1 + R t p ) = ∑ τ = 1 t ln ( 1 + r τ p ) ln ( 1 + R t b ) = ∑ τ = 1 t ln ( 1 + r τ b ) \text{ln}( 1 + R_t^p ) = \sum _{\tau=1} ^ t \text{ln}(1+ r_{\tau}^p) \\ \text{ln}( 1 + R_t^b ) = \sum _{\tau=1} ^ t \text{ln}(1+ r_{\tau}^b) ln(1+Rtp)=τ=1∑tln(1+rτp)ln(1+Rtb)=τ=1∑tln(1+rτb)
两者相减:
ln ( 1 + R t p ) − ln ( 1 + R t b ) = ∑ τ = 1 t [ ln ( 1 + r τ p ) − ln ( 1 + r τ b ) ] \text{ln}( 1 + R_t^p ) - \text{ln}( 1 + R_t^b ) = \sum _{\tau=1} ^ t [\text{ln}(1+ r_{\tau}^p) -\text{ln}(1+ r_{\tau}^b) ] ln(1+Rtp)−ln(1+Rtb)=τ=1∑t[ln(1+rτp)−ln(1+rτb)] ln ( 1 + R t p ) − ln ( 1 + R t b ) R t p − R t b ⋅ ( R t p − R t b ) = ∑ τ = 1 t [ ln ( 1 + r τ p ) − ln ( 1 + r τ b ) ] r τ p − r τ b ⋅ ( r t p − r t b ) \frac{\text{ln}( 1 + R_t^p ) - \text{ln}( 1 + R_t^b ) } { R_t^p - R_t^b} \cdot (R_t^p - R_t^b) = \sum _{\tau=1} ^ t \frac{[\text{ln}(1+ r_{\tau}^p) -\text{ln}(1+ r_{\tau}^b) ] }{r_{\tau}^p - r_{\tau}^b } \cdot (r_t^p - r_t^b) Rtp−Rtbln(1+Rtp)−ln(1+Rtb)⋅(Rtp−Rtb)=τ=1∑trτp−rτb[ln(1+rτp)−ln(1+rτb)]⋅(rtp−rtb)
定义乘数因子:
F t = ln ( 1 + R t p ) − ln ( 1 + R t b ) R t p − R t b F_t = \frac{\text{ln}( 1 + R_t^p ) - \text{ln}( 1 + R_t^b ) } { R_t^p - R_t^b} Ft=Rtp−Rtbln(1+Rtp)−ln(1+Rtb) f t = ln ( 1 + r t p ) − ln ( 1 + r t b ) r t p − r t b f_t = \frac{\text{ln}( 1 + r_t^p ) - \text{ln}( 1 + r_t^b ) } { r_t^p - r_t^b} ft=rtp−rtbln(1+rtp)−ln(1+rtb)
则有:
R t p − R t b = ∑ τ = 1 t f τ F t ( r t p − r t b ) R_t^p - R_t^b = \sum _{\tau=1} ^ t \frac{f_\tau}{ F_t} (r_t^p - r_t^b) Rtp−Rtb=τ=1∑tFtfτ(rtp−rtb)
至此,累计超额收益可以看成一系列因子调整后的单期超额收益的和。由第二章中关于单期Brinson模型超额收益分解的公式,可以将上述公式改写为:
R E ( t ) = R t p − R t b = ∑ τ = 1 t f τ F t ( R A , τ + R S , τ + R I , τ ) = ∑ τ = 1 t f τ F t R A , τ + ∑ τ = 1 t f τ F t R S , τ + ∑ τ = 1 t f τ F t R I , τ R_E(t) = R_t^p - R_t^b = \sum _{\tau=1} ^ t \frac{f_\tau}{ F_t} (R_{A, \tau} + R_{S, \tau} + R_{I, \tau}) \\ = \sum _{\tau=1} ^ t \frac{f_\tau}{ F_t} R_{A, \tau} + \sum _{\tau=1} ^ t \frac{f_\tau}{ F_t} R_{S, \tau} + \sum _{\tau=1} ^ t \frac{f_\tau}{ F_t} R_{I, \tau} RE(t)=Rtp−Rtb=τ=1∑tFtfτ(RA,τ+RS,τ+RI,τ)=τ=1∑tFtfτRA,τ+τ=1∑tFtfτRS,τ+τ=1∑tFtfτRI,τ = R A ( t ) + R S ( t ) + R I ( t ) = R_A (t) + R_S(t) + R_I(t) =RA(t)+RS(t)+RI(t)
其中:
· RE(t) 为 t 个子时间段内组合相对于基准的累计超额收益,表达式为:
R E ( t ) = R t p − R t b R_E(t) = R_t^p - R_t^b RE(t)=Rtp−Rtb· RA(t) 为 t 个子时间段内组合的择时收益,表达式为:
R A ( t ) = ∑ τ = 1 t f τ F t R A , τ R_A (t) = \sum _{\tau=1} ^ t \frac{f_\tau}{ F_t} R_{A, \tau} RA(t)=τ=1∑tFtfτRA,τ· RS(t) 为 t 个子时间段内组合的择股收益,表达式为:
R S ( t ) = ∑ τ = 1 t f τ F t R S , τ R_S (t) = \sum _{\tau=1} ^ t \frac{f_\tau}{ F_t} R_{S, \tau} RS(t)=τ=1∑tFtfτRS,τ· RI(t) 为 t 个子时间段内组合的交互作用,表达式为:
R I ( t ) = ∑ τ = 1 t f τ F t R I , τ R_I (t) = \sum _{\tau=1} ^ t \frac{f_\tau}{ F_t} R_{I, \tau} RI(t)=τ=1∑tFtfτRI,τ
4. Brinson模型的应用场景
4.1 基金组合绩效归因
我们可以通过择时收益和择股收益,判断组合超额收益的来源,从而可以进一步发挥投资长处,并弥补短板。
4.2 基金经理能力刻画
Brinson模型的归因结果也可以对管理基金的基金经理能力进行刻画。例如,我们可以计算某基金经理在某段时期内的择股与择时收益序列,分别并计算这两个收益序列的均值和方差,从而量化基金经理的择时与择股的正向性与稳定性。
4.3 大类资产配置应用
除了对权益类资产进行行业等风格归因以外,我们还可以将Brinson模型应用到大类资产配置这一更大的层面上来。从资产配置的视角来看,基准配置可以是多个可投类别资产的加权组合。例如:某一基金可投资产包括五类资产:权益类(A股市场)、固收类(国债、金融债、地方债、企业债)、商品类(黄金)、货币类(国债逆回购、货币基金、中短期定期存款等)和另类资产(房地产、REITS),那么可以规定基准组合为:20%中证800ETF,20%国债ETF,20%黄金ETF,20%国债逆回购和20%REITs基金。这里我只是给出一个方便说明的例子,具体的基准权重和组合标的设置需要结合基金设立的投资目标、风格和相关法律法规限制来设定。需要特别注意的是,基准组合的选择一定要具有可投性(Inestimable)。
大类资产基准组合设置好后,与权益型基金的归因方式类似,可以利用Brinson模型将组合的超额收益分解为配置收益(Allocation)、择券收益(Selection)和交互作用(Interaction)。其中,大类资产的配置收益实际上就是权益性基金的择时收益,是战术性超低配置各类资产所产生的超额收益;而择券收益则是每一类资产组中由于精选优质标的所获得的超额收益。
5. 模型的实现与实证案例研究
关于模型的编程实现与实证研究部分,请详见后续文章:
[1] 【基金量化研究系列】基金绩效归因模型——Brinson多期归因模型之python实现
写在最后
若想查阅本系列全部文章,请参见目录页:系列文章目录索引。
欢迎感兴趣的小伙伴来跟作者一起挑刺儿~ 包括但不限于语言上的、排版上的和内容上的不足和疏漏~ 一起进步呀!
有任何问题,欢迎在本文下方留言,或者将问题发送至勘误邮箱: mikeysun_bugfix@163.com谢谢大家!
-
常见归因模型
2021-02-06 20:09:05常见的归因模型 一个广告可能投放在头条、广点通、快手等多个媒体,若一个用户都在几个媒体点击这个广告且最后下载安装了这个游戏。那大家想想这个用户应该算谁的? 带着这个问题接着看。 如用户A: click1 > click2...归因是什么
广告归因(Ad Attribution),其实是指广告主投放的广告如应用类广告的转化(如点击、激活、注册、订阅、付费等等)到底是由哪个广告或者渠道带来的一套逻辑和规则。这里的转化其实和结算方式有关,如 CPC、CPM、CPA、CPI(CPA的一种)、CPS等等,后面有激活会单独讲讲这些结算方式。
归因这两个词很有禅意,在佛教中说到 有因必有果,有果必有因。由因生果,因果历然。仔细想想是不是很有意思上面那个生硬的解释就突然如少女肌肤般柔软起来了。
常见的归因模型
一个广告可能投放在头条、广点通、快手等多个媒体,若一个用户都在几个媒体点击这个广告且最后下载安装了这个游戏。那大家想想这个用户应该算谁的? 带着这个问题接着看。
如用户A:
click1 > click2 > click3 > 快手 > 广点通 > 头条 > 安装游戏 首次归因
多个点击时,认为是第一个点击的功劳。理由是第一个触点给用户建立了认知,与用户形成了连接。
末次归因
多个点击时,认为最后一个的功劳。下面会主要讲这个,目前大多数应用类广告都采用这种归因模型。
线性归因
多个点击时,认为每个“待归因事件”平均分配此次功劳。
位置归因
多个点击时,认为第一个和最后一个各占 40% 功劳,其余平分剩余的 20% 功劳。
常见的归因模型就是上面几个了,其他的有兴趣查查即可。其实我们常用的是 末次归因(last click) ,即认为用户是来之最后一个点击。当然了我这处理这块逻辑时候不仅仅简单的归因到最后一个点击,这里的最后一个点击还是有条件的。
归因依据
这篇文章主要还是说国内买量归因,故需要分平台、代理商能力等等展开细说。
我们先假定只有广告主和媒体两个角色。其他无非就是中间有什么代理商、网盟了,就不再讨论了。
点击归因步骤大致分为下面四步:- 广告主在建广告计划时候会提供一个URL 点击监测链接,上面通常有一些约定好的宏,如idfa、mac、ip、ua 、imei、oaid等等。作用是当用户点击了投放在媒体的广告时候,媒体会把URL上的宏替换为用户真实的值。然后请求这条URL,广告主收到媒体发送的用户点击数据并保存下来。
- 若用户下载游戏并激活应用,这时候广告主在应用中的 SDK 会上报idfa、mac、ip、ua、imei、oaid等等数据到自己服务。
- 广告主用收集到媒体点击中的设备信息和自家 SDK 上报的匹配,就能知道改用户来自谁了。
- URL中也会带上媒体的回调地址,当归因成功后。安装约定回调给媒体。这样一个流程就走完了。
当然了上面的流程是一个理想化的。点击归因最根本的依据是设备信息,所有如何减少因设备问题导致不能正确归因是一个比较大的挑战。
通常能用于点击归因的设备需要满足几点要求:
- 唯一性:即用户ID全局唯一,标识符永远不会与其他应用冲突,即使在其他设备/应用上也是如此。这个ID信息可以唯一的定义某个用户。
- 持久性:表示无论手机的操作系统版本或者是不同的APP,其获取到的用户ID信息应该也是一致的,不会应该升级了系统变更或者换了一个APP就导致不同。
- 易取性:能否获取、获取是否方便。
安卓
得益于国内安卓隐私宽松,国内安卓买量归因异常的轻松。在安卓买量中有一种分包(也可以叫渠道包),这些包在打包时候就把一个唯一标示打到里面,用户所有行为发生SDK上报到广告主侧时候。就知道这个分包是投放于那个媒体的具体广告上了。
当然了也不是所有量都是直接投媒体,会进过一些代理商代投。技术能力好的还好说,技术不好的还是需要使用类似iOS归因的逻辑。具体看下面的iOS部分。
安卓设备也受约束,可选的如下:
可选设备 含义 唯一性 持久性 易取性 IMEI 国际移动设备识别码 符合 符合 Android 10及以上禁止获取;v6 以下可直接获取;v6~9需要用户授权 Android ID 设备初次激活时,系统分配。重置手机后会重置 符合 不符合,不同应用间不一致 可直接调用系统API获取 MAC 网卡地址 符合 符合 Android 10及以上禁止获取;v6 以下可直接获取;v6~9需要使用漏洞获取 UUID 通用唯一识别码 符合 不符合 不同应用间不一样且重装应用后也会重置 CAID Google定义的 符合 符合, 但用户可以关闭或重置,类似iOS idfa 国内不能用 IP、UA ip、ua 不符合 不符合 可直接调用系统API获取 OAID 匿名设备标识符。中信院联合OV华等硬核厂商制定的 符合 符合 符合,接入即可。 上面是广告主这边归因逻辑,广告投放平台还是会有自己的归因逻辑。sdk也会上报数据到他们系统也还是需要配合点击进行归因。这块等我有机会能去媒体滑滑水再来细聊。
IOS
苹果有着严格的隐私控制,在不同的iOS版本还有这不同的特性。
所以满足上面三点的可选设备如下:
可选设备 含义 唯一性 持久性 易取性 IDFA iOS广告标示符 符合 符合 但是当用户系统重重或用户还原广告标示符后不符合 iOS14下默认可取,14及以上会需要用户同意。 IDFV 应用开发商标示符 不符合 相同开发商的app中是符合的 同一开发商符合 直接调用系统API获取 UDID、OpenUDID、MAC 唯一设备标示符、 OpenUDID 为 UDID 一种替代方案、网卡设备物理地址 符合 符合 UDID 在iOS5后被禁止、OpenUDID和mac 在iOS7后被禁止 CAID 中广协联合腾讯搞得第三方用户标识 符合 符合 通过多种设备信息确定一个唯一的ID,易取。 总结
安卓
- 渠道包归因(首选)。
- 点击归因。设备优先级 IMEI > OAID> AndoridID > IP&UA
IOS
- 点击归因。设备优先级 IDFA > CAID > IP&UA
-
什么是归因模型
2019-12-04 14:02:48归因模型: 从度娘上找来的结果是,在完成转化的路径中,客户可能会进行多次搜索,与同一广告客户的多个广告互动。通过指定归因模型,可以选择为每次点击分配多少转化功劳。也就是说,它可以把转化功劳归于用户的... -
Brinson归因模型
2022-01-20 23:36:14Brinson归因模型 紧接上一篇文章,我们继续聊股票模型的业绩归因。今天要介绍的第一个模块是Brinson归因模型,它将组合超额收益分解为 选择收益、 择时收益和 交叉收益,使用场景非常广。Brinson等人最早提出单... -
【干货】电商归因模型技术方案
2021-09-06 16:41:1901电商归因目的 对于电商平台来说,当流量进入时,我们需要引导其完成购买任务,以实现流量价值最大化,在互联网红利消耗殆尽之时,流量会越来越贵,我们需要精细化运营每一份流量。 我们在做各种banner活动、... -
通过渠道进行媒体曝光:多阶段归因模型-研究论文
2021-05-20 05:56:30在本文中,我们通过基于转化漏斗的概念开发了个人消费者行为的隐马尔可夫模型(HMM),从而解决了广告归因问题。 我们将模型应用于在线广告系列中的独特数据集,以进行汽车发布。 我们发现,不同的广告格式(例如... -
【基金量化研究系列】基金绩效归因模型(三)——基于CAPM、T-M、H-M、C-L模型的基金绩效归因研究
2020-06-03 15:10:29文章目录1. 引言2. 模型介绍2.1 CAPM模型2.2 T-...详情请见:【基金量化研究系列】基金绩效归因模型(一)——Brinson多期归因模型简介。然而,Brinson多期归因模型在使用时需要使用每一个子周期的具体持仓信息(在各行 -
况客:Campisi债券业绩归因模型
2021-03-12 09:57:41Campisi债券业绩归因模型 https://qutke.cn/articles/59f15d65e4b0a540c7479b29 -
20210410-华泰证券-债券基金业绩归因之Campisi模型.pdf
2021-04-13 00:50:3220210410-华泰证券-债券基金业绩归因之Campisi模型.pdf -
网站分析销售归因模型的四种类型.doc
2021-09-11 19:12:46网站分析销售归因模型的四种类型.doc -
百亿条数据复杂业务场景下通用归因模型设计实现
2019-04-25 17:10:19如何建设公司级统一口径转化导流分析数据,满足多个业务对转化数据的需求,为公司各业务部门提供转化分析数据(各入口或者页面带来的商家、活动页、预定、订单),基于此我们设计了转化归因来满足业务需求。... -
网络游戏-一种基于多触点归因模型的网络广告效果衡量方法和系统.zip
2021-09-20 04:59:37网络游戏-一种基于多触点归因模型的网络广告效果衡量方法和系统.zip -
Brinson多期归因计算示例
2021-01-13 16:42:33针对基金业绩归因常用的brinson模型,多期归因的公式随处可见,但具体计算步骤网上不多见 -
品牌内容营销如何影响购买者 归因模型入门级介绍
2020-10-26 17:08:11在市场营销中,归因是指在一个Customer Journey 中,对达到最终预期转化(或完成目标)的不同营销渠道(不同用户接触点)的价值识别。这么做的好处是能够发现不同渠道...营销归因模型使内容营销人员能够更准确地理解 -
多渠道归因模型
2014-02-17 13:29:00带着这个问题,看到了Avinash的一篇关于多渠道归因模型的文章,才知道原来多渠道归因有三种模型,以前只知道其中一种,就是跨渠道,例如跨广告,自然搜索,电子邮件,推荐流量等的这种模型,对文章进行了简单的翻译... -
【DA】广告归因问题——常见模型 & 选择原则
2021-09-02 17:13:25文章目录1 广告归因の定义2 广告归因の方式3 广告归因の常见归因模型3.1 最终互动模型3.2 最终非直接点击模型3.3 首次互动模型3.4 位置归因模型(U形归因/排名归因)3.5 线性归因模型3.6 时间衰减归因模型3.7 ... -
Android出海攻略(二):Firebase 归因模型
2021-03-20 23:43:31旨在帮助移动开发者更轻松的构建应用程序,主要提供的服务包括 归因转化分析、云DB、消息推送、动态链接等等,做过出海应用的朋友应该多多少少都接触过,本文主要讲述在APP安装转化过程中,Firebase的归因模型是如何... -
直播带货运营变量归因模型
2021-12-09 14:58:13为了保证模型符合基本的拟合度,因此舍弃了因果结构方程模型,转而使用路径分析,找出我们的核心中间指标uv、平均在线人数,然后通过路径判断运营变量和最终的GMV之间的相关性。 得到基本数据结论后,配合运营同学,... -
归因分析模型
2020-12-21 15:54:24而归因分析(Attribution Analysis)要解决的问题就是广告效果的产生,其功劳应该如何合理的分配给哪些渠道。 一、什么是归因分析? 在复杂的数据时代,我们每天都会面临产生产生的大量的数据以及用户复杂的... -
多渠道归因分析(Attribution):传统归因(一)
2021-05-26 14:12:15文章目录1 归因分析2 传统归因分析方法2.1 传统归因分析2.2.1 最终互动归因模型2.2.2 最终非直接点击归因模型2.2.3 最终AD点击归因2.2.4首次互动归因2.2.5 线性归因模型2.2.6 时间衰减归因模型2.2.7 位置归因模型... -
基金归因Brinson模型
2021-12-15 13:24:36我们选择基金的前五十大持仓进行分析,最后生成如下数据文件 2、Brinson 归因分析 然后合并两部分数据,用brinson模型分析,下面都是Brinson模型的内容。具体的数学公式为 二、程序源码 from WindPy import * import... -
数据归因模型,该如何搭建?
2020-08-04 15:01:34要深度分析问题原因,不能只统计数字,流于表面!每次写原因分析类报告,都有领导这么咆哮道。...归因问题首先难在:领导期望太细、太具体,而数据分析给不到。 数据分析产出的:30%的来电用户未绑定小程序