今天读了一下带教给的处理期货数据的代码,完全被雷到了。

先说代码风格,其中一个文件 TradeDay.py 还是不错的,像模像样,但是另一个文件 data_update_handler2.py 就堪称乱七八糟,和前者肯定不是一个人写的。长得快要溢出 24 寸屏幕的语句、几十上百行的函数、30 个字符以上的变量名、冗余没啥用的逻辑充斥着整个文件,令人不忍直视。

利用一步一步 debug 的方式,总算是读完了所有代码。其实核心逻辑相当直白,就是把当前持仓量最大的合约当作主力合约。而在主力切换的时点,用新旧合约的 close 或者 vwap 价格来复权价格数据。但是其中的细节有两个重要的错误:

  1. 一般而言,主力合约切换的原则是将连续几日持仓量都最大的合约作为新的主力合约,且主力合约切换都是向前切换,不可能再回退。而这段代码却简单将每日持仓量最大的合约作为主力合约,这不但可能导致主力合约提前切换,还可能导致主力合约发生回退(从实践上来看,确实会发生回退)。

  2. 这段代码会计算换月时产生的价差,并且将价格直接加上价差来成为复权后的价格。但是这样可能会导致收益计算不准确,比如,假设存在两个合约的价格序列:

1
2
旧主力合约 A:[4, 6, 8, 10]
新主力合约 B:[1, 2, 3, 4]

假设在第二日结束后换月,按照代码逻辑,直接将新合约价格加上价差,复权后价格序列应当是:

1
复权后价格 C:[4, 6, 7, 8]

但实际上,如果我在换月前持有 1 手合约 A,那么换月后我就持有 3 手合约 B,那么我的净值实际上应该是:

1
实际净值 D:[4, 6, 9, 12]

这会导致复权后的价格完全错误!

于是带教让我别看这份代码了,之前做啥继续做啥。也挺好的,阅读这样的代码确实是一种折磨。