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)差的有点多。