BWB3实盘代码修改
January 31st, 2024

1,

现象:空头偶尔会出现19个,默认选择20个空头

打印log发现是由于经过

transfer_swap函数后,币种名称出现了空的现象。

这个函数的作用是用合约的symbol来确定现货的symbol,用的转换关系是

df_swap['symbol_spot'] = df_swap['symbol'].map(lambda x: x.split('1000')[1] if '1000' in x else special_symbol_dict.get(x.replace('USDT', ''), x.replace('USDT', ''))+'USDT')

special_symbol_dict.get(x.replace('USDT', ''), x.replace('USDT', '')) 的作用是从 special_symbol_dict 中获取键为 x.replace('USDT', '') 对应的值,如果该键不存在,则返回 x.replace('USDT', '')。这个操作实际上是在尝试查找 x.replace('USDT', '') 在字典中的映射关系,如果有映射关系就返回映射值,否则返回原始的 x.replace('USDT', '')

如果合约symbol包含1000的字符串,则取[1]第一个字符作为输出

如果symbol不包含1000的字符串,则判断symbol.replace('USDT', '')是否在special_symbol_dict中,如果在,则返回对应的value值,如果不在special_symbol_dict中,则返回symbol.replace('USDT', '')。

两个如果最后都加上USDT。

一个新的币种 现货和合约symbol都是1000sats,如果还用上面的逻辑,则会出现问题,导致从合约倒推spot名称出来是satsusdt,导致在现货中找不到这个现货,因为现货也是1000satsusdt。

修改如下

    df_swap['symbol_spot'] = df_swap['symbol'].map(lambda x: '1000SATSUSDT' if x == '1000SATSUSDT' else (x.split('1000')[1] if '1000' in x else special_symbol_dict.get(x.replace('USDT', ''), x.replace('USDT', ''))+'USDT'))

对1000SATSUSDT做了特殊处理,其实应该是把1000SATSUSDT加入到special_symbol_dict,然后先判断是否在special_symbol_dict里,再判断是否包含1000,先不搞了。关系不大。

可以在网站上看看历史的BUG修正

2,

实盘与回测有些选币对不上的问题。

应该是由于提前获取K线计算的因子排序不一样,所以会有差异。但是这个差异还是比较大,大概看了下,20个币种里有7个不一样。再对了另外一个时间点,3个不一样的。正常么?不好确认。那么我将选币个数调整到30个,看看回测效果会不会有很大不同?如果回测结果差异不大,那么就不管它了。如果差异大,则需要继续定位研究。

回测结果和选20个币还是有差异的。不过选30个本来就会导致收益降低,不一定是由于这个选币不一直引起的。发现一个好的思路,如果我取数据的时候,把最新的一根K线去掉,也就是去掉最近的K线,然后计算因子值,回测的时候也这么做,那么选币应该是一样了吧?

修改成以下方式:

df[factor_name] = df[factor_name].shift(2)

回测效果如下,和df[factor_name] = df[factor_name].shift(1)差的有点多。

Subscribe to KeepLearning
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.
More from KeepLearning

Skeleton

Skeleton

Skeleton