5 不可胜在己的编码与交易风险管理

孙子曰:善战者,先为不可胜,以待敌之可胜。不可胜在己,可胜在敌。同样,1903年瑞士精算学家Flip Lundberg提出了“毁灭问题”。在考虑如何盈利前,我们应该先考虑破产的风险。破产问题是指,假设你有一笔初始本金,客户的索赔率以服从泊松过程的强度到达, 你收一个常熟项的保费(preimum rate),如何计算你开的公司破产的概率?

带着这个思维框架,去重新思考编码与交易,我们获得一种新的角度: 给定一笔本金,假设市场上每个到期的合约以服从某个过程的强度到达,我们如何计算交易破产的概率? 给定一个交付日期,假设不停变化的要求以服从某个过程的强度到达,我们如何计算项目无法交付的概率?

在这种角度下,我们不在关注市场与客户需求的变化怎样影响我们的盈利,而是关注我们对持续变化的反应是怎样影响我们的盈利。如果没有风险管理协议的设计与执行,从长期来看(甚至不用多长几天和几周就能看出来),自己爆炸和破产都是注定的事。

5.1 交易风险管理

交易风险管理可以从交易前,交易中和交易后三个角度考虑。每笔交易,都是迈入一场残酷的战争, 在迈入战争前,我们需要问自己以下四个问题:

  • 我的风险/收益比、几何期望收益与目标盈利是多少?
  • 我能承受的最大损失是多少?
  • 我即将开始的交易是为了赚钱还是为了管理风险,还是牺牲其中一个来换取另一个?

在交易中,我们需要问自己以下三个问题:

  • 交易是否达到了我们之前制定的最大损失?
  • 交易是否达到了我们之前制定的目标盈利?
  • 我们是否值得冒险,让交易继续下去?

在交易后,我们需要复盘,问自己以下两个问题:

  • 我自己是否遵守了风险管理协议?
  • 如果没有,我为什么没有遵守?

兵法:一曰度,二曰量,三曰数,四曰称,五曰胜。在资源管理上,头寸管理与强行止损也是需要养成的肌肉记忆。在每笔交易中,不要冒超过2%的风险,如果在某两周或者一个月内,你的账户亏损超过6%,那么就停止交易,直到下一个月。这会防止你的两种死法:

  1. 犯系统性的错误而不自知,不停地流血,一错再错,进入死亡循环。
  2. 某一单出现巨额亏损,直接爆炸。

5.2 编码风险管理

如果把每一次的编程都当成是我们碳基大脑与硅基大脑的交易,那我们也可以将风险管理的原则与编程手艺的最佳实践结合起来。

下表展示了风险管理策略与测试驱动开发原则的对应关系:

风险管理策略 实例 测试驱动开发原则
分摊 两次下注$5000,而不是一次下注$10000 从测试——编码——重构三个正交的维度去解决一个问题而不是从一个维度去解决一个问题
多样化 两个人各下注$5000,而不是一个人下注$10000 单元测试需要正交且互相独立,最大程度上减少依赖
止损 不要冒超过2%的风险,如果在某两周或者一个月内,你的账户亏损超过6%,那么就停止交 一旦测试出错,就删去对应的生产代码,大脑退回到上一个状态中重新思考

如果没有测试驱动开发,你就很难重构以及持续集成和持续交付。在交易中,你每晚都会平仓,因为你不想冒你无法管理的风险。 在编码中,你希望所有的编码改变都能客户具体的反馈。

5.3 推荐书目与核心概念

  1. 破产问题、风险管理、测试驱动开发
  2. Mandelbrot, Benoit, and Richard L. Hudson. The Misbehavior of Markets: A fractal view of financial turbulence. Basic books, 2007.
  3. Beck, K. (2003). Test-driven development: by example. Addison-Wesley Professional.
  4. Martin, R. C. (2011). The clean coder: a code of conduct for professional programmers. Pearson Education.
  5. 孙武, & 郭化若. (1900). 孙子兵法–. BEIJING BOOK CO. INC..