Microsoft Excel 中的财务建模/测试
最重要的是要记住,你是最后一道防线。你不仅仅是在寻找错别字,你遗漏的任何东西都可能造成巨额资金损失或尴尬,所以要小心谨慎,不要匆忙。
在接下来的注释中,我们假设我们正在检查一个重要的模型,需要花费一两天的时间进行检查,并且我们绝对希望没有错误。我们还将考虑可以采取哪些措施使模型更容易检查。
我们将在下面大量使用“检查”、“测试”和“审查”这些词。它们的目标都是一样的——确保模型是正确的,或者足够接近正确。
在开始检查本身之前,我们将先提出一些基本问题。
1. 你是检查模型的合适人选吗?
- 你是否了解模型背后的业务问题?这一点很重要,因为你需要确保没有遗漏任何内容,例如税务考虑因素。如果你对业务了解不多,那么你可能不应该检查模型。
- 你是否足够了解模型的技术细节以对其进行检查?如果它是用 VBA 编写的,而你无法阅读它,那么这将非常困难。
- 你是否自己构建过模型?你是否有经验了解可能出现的问题?
2. 你是否拥有模型的所有文档?
这应该包括所有相关的信件或文件,以及任何有助于你了解正在建模的业务的内容。
3. 你是否有足够的时间和预算来正确完成这项工作?
复制电子表格,将其重命名,并添加一个名为“审查”的表格,其中将包含你所有的评论。不要在原始电子表格上进行操作。
“审查”表格应包含如下一些列
在实践中,大多数企业中的检查人员都使用原始电子表格工作,进行更正或更改,然后将其返还给构建者进行检查。
对于大多数小型电子表格来说,这都可以,但它确实混淆了构建者和检查者的角色,对于重要或复杂的模型,你应该避免这样做。如果你使用“审查”表格,则不应对原始表格进行任何更改——构建者应在查看你的评论后进行此操作,然后将模型返还给你重新检查。你的工作是检查,而不是构建。
当然,首先要检查的是模型是否按预期执行。你需要找出谁需要它以及他们想要什么,以及模型是否足够。
在我们年金模型的示例中,规范非常清楚地说明了需要什么,因此应该很容易看出它是否似乎提供了所有所需的内容。
这是一个至关重要的步骤,因为研究表明,逻辑错误和遗漏很难发现。这意味着你需要格外小心。
然后,你需要检查模型中的业务逻辑,然后再深入到表格和单元格的细节。希望模型构建者已经清楚地记录了逻辑,以便于检查。这意味着不仅要阐明逻辑本身,还要提供指向原始文档的链接或摘录,以显示其来源。如果不是这种情况,你应该请求这样做。
下面的摘录来自一个实际的电子表格,该电子表格使用之前的报告计算盈利能力公式,该报告的摘录包含在右侧。这使得检查者可以轻松地审查逻辑。
你可以看到,这比模型构建者简单地开始使用一个神秘的公式(例如 =1-1/(G6+(1-G6)/0.85),且无任何解释)要好得多。
尽可能地,你应该在查看模型之前写下你自己的逻辑,因为很容易受到你所看到内容的影响,并认为“这看起来没问题”,而如果你自己先做一遍,你可能会发现一些遗漏的地方。
现在你已经了解了模型应该做什么,并且已经确定了业务逻辑,你应该考虑什么地方可能出错,以及这可能有多严重。
例如,
- 某些输入可能很危险,因为用户可能会因错误或无知而输入不正确的值
- 输入的组合可能需要不同的处理方式
- 某些假设(例如税率)可能会对结果产生重大影响
- 哪些输入或计算对结果的影响最大?
- 公式可能没有正确地复制到行或列中
在此阶段,你还应该考虑如何检查模型的合理性。
你的输入通常将包含以下内容的一部分或全部
数据:例如员工记录或交易记录。你需要检查数据的来源,以及它是否正确,以及它是否被修改过。理想情况下,它应该与模型的其余部分完全分开(例如,在单独的工作表或数据文件中),以避免污染。
与其他所有内容一样,数据需要清晰。例如,如果标题令人困惑或神秘,则应添加注释对其进行解释。
假设:这些是模型的基础假设,由构建者设置,而不是由用户设置。例如,模型可能包含一组当前的所得税税率,这些税率显然不需要用户输入,因为它们对每个人都相同。
应在一个地方清楚地列出假设,并进行清晰的标记和解释,如果它们对日期敏感(例如每年更改的税收限额),则应显示生效日期。包含值的单元格应使用颜色编码以将其挑选出来。
需要记录和证明假设,因为它们会对结果产生如此大的影响。如果你不认为自己能够向另一位精算师解释假设的原因,那么你做得还不够。
如果尚未完成,请确定假设的限制,例如,工资增长可能显示为 4%,但你可能会认为它在一年内可能在 0% 到 8% 之间变化。这对于检查模型是否能够处理极端输入以及检查任何敏感性测试都很重要。
用户输入:这通常仅适用于存在除模型构建者以外的其他用户的情况。用户输入可能非常危险,因为用户在输入内容方面可能非常有创意。例如,如果要求输入利率,他们可能会输入 0.7、7% 或 7。模型必须处理这种情况。
因此,应通过将用户输入限制在有效输入范围内来对其进行“控制”。Excel 的数据验证是执行此操作的最有效方法,因为它可以防止用户输入不属于你指定范围的输入,或键入不在你指定列表中的文本等。
另一种方法是使用 Excel 提供的“控件”,例如下拉列表和复选框。
作为检查者,你应该查看输入的建模方式,并考虑用户可能采取哪些措施来破坏模型。当然,你需要严格的程度因模型而异。
你还应该检查用户输入是否已得到充分解释,以便普通用户能够理解。
计算是输入与业务逻辑相遇的地方。在这里,最重要的是要清晰详细地列出计算过程,以便于检查。
最明显的方法是遵循计算的布局,并检查数据、假设、输入和逻辑如何组合产生最终结果。
最常见的情况是,数据位于行中,公式位于列中。
公式应从左到右、从上到下排列,因为这是我们的阅读方式,而且Excel也是按照此顺序进行计算的。输入应位于左上角,或位于单独的工作表中。
需要查找的内容
- 公式在表格中间意外地发生变化 - 如果将字体更改为等宽字体(例如Courier),然后单击工具栏中的“显示公式”按钮,即可轻松发现此问题,从而显示工作表上的所有公式
- 公式中硬编码的数字(例如税率) - 即使这些数字不太可能发生变化,也应将其取出并与假设一起包含
- 循环引用 - 应尽可能避免
下一步是对输入进行一些测试。一个简单的技巧是将所有输入设置为0或1(或其他任何值),以便结果非常简单,并且任何异常都会立即显现出来。例如,如果将投资率和指数化设置为零,财务预测应该只会生成一系列未调整的现金流,从而更容易查看它们是否正确。另一种技巧是使用“角点”输入,即输入输入的最高值和最低值,并查看模型是否正常工作。
您应该考虑一下,如果您进行了所有测试并发现了错误,然后在错误修复后又必须重新进行所有测试会发生什么。这可能会变得有点乏味!根据所涉及的工作量,您可以设置一组自动化的测试。
如果模型用于内部使用,您应该尝试将测试包含在模型本身中,以便任何使用模型的人都可以准确地看到测试的内容,甚至可以重新测试它。
如果您能够编写代码,最好设置一组输入并使用VBA自动运行它们。这可以大大加快测试速度。
如果业务逻辑是用VBA编写的(即VBA完成了大部分繁重工作),则可能难以测试。您可以将部分结果转储到工作表中进行测试。
您应该寻找方法来测试模型的合理性。例如,可能有一年前完成的数字应该与模型的结果相似,或者可能存在其他模型可用于至少部分当前模型生成测试结果。
您还可以要求构建者包含交叉检查(例如,列和行的总计应匹配),这有助于测试模型。
灵敏度测试,即更改其中一个输入并查看会发生什么,是另一种测试合理性的方法,尤其是在您对预期结果有所了解的情况下。
灵敏度测试的扩展是找出模型需要达到多准确,然后估计设置假设和输入时可能出现的错误(例如,7%的投资假设可能会有2%的误差),并测试对结果的影响。这可以大致了解结果可能偏离多远(因为用户不可能完全正确地获得所有假设),以及总体误差是否可接受。
如果可能,请分块测试模型,以便您可以一次批准一部分。这使得检查更易于管理,并且应该使查找错误更容易。
有几个电子表格测试工具可以帮助检查复杂的电子表格。它们查找诸如不一致的公式和孤立(未使用)的计算单元格之类的内容。
设身处地为用户着想,或者更好的是,找其他人尝试使用它。它是否清晰,或者是否令人困惑?
用户是否可以意外更改公式或输入荒谬的数字?
请记住,用户通常不会阅读说明,并且会在没有思考的情况下使用模型。用户越不熟练,就需要投入更多精力来保护模型 - 特别是输入 - 免受不正确的使用。