今天优化了order_target_weights函数:
解决一个bug,topK,当K大于2时会出现“现金不足”的情况:
# 这里负责调仓顺序,先卖后买 def order_target_weights(self, weights: dict): #卖出的先调仓 to_sell = [] to_close = [] for holding, _ in self.portfolio.curr_holding.items(): # 当前持仓没有在 目标仓位里,那就清仓。 if holding not in weights.keys(): to_close.append(holding) if len(to_close): self.close_symbols(to_close) # 前面清仓之后,curr_holding里就不出现了,也就是说, 原先有,新的没有——卖出。 # 还有 原先有,现在也有,变多或少了; # 原先没有,现在有,买入; total_mv = self.portfolio.get_total_mv() curr_weights = {s: (mv / total_mv) for s, mv in self.portfolio.curr_holding.items()} to_buy = [] for s, new_w in weights.items(): # 新的有,当前也有,当前>新的,卖出 if s in curr_weights.keys(): if new_w < curr_weights[s]: to_sell.append(s) else: to_buy.append(s) else: # 原先没有,现在有,买入 to_buy.append(s) for s in to_sell: self.order_target_weight(s, weights[s]) for s in to_buy: self.order_target_weight(s, weights[s])
这是29个行业的TopK的回测结果:
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/104009
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!