from typing import Any, List from kit.kit import DataHelper from strategy import trade_strategy from task.base_task import base_task class buy_stocks_func_task(base_task): """ 每周调仓策略: 如果非空仓日,先选股得到目标股票列表,再卖出当前持仓中不在目标列表且昨日未涨停的股票, 最后买入目标股票,同时记录当天买入情况避免重复下单。 参数: context: 聚宽平台传入的交易上下文对象 """ def __init__(self, strategy: trade_strategy): super().__init__(strategy) def config(self, context: Any): # 每次调仓的目标股票数量 self.stock_num = self.get_config('stock_num') # 获取当前持仓列表 self.hold_list = self.strategy.state.get_hold_list() self.index_stocks = self.get_config('index_stocks') # 调仓的目标股票列表排序 self.target_list = DataHelper.get_stock_list(context, self.index_stocks, self.stock_num) # 限制目标股票列表长度为 stock_num self.temp_target_list = self.target_list[:self.stock_num] # 昨日涨停股票列表 self.yesterday_HL_list: List[str] = self.strategy.state.get_yesterday_high_list() self.today_trade_switch = self.get_config('today_trade_switch') self.temp_sells_list = {} self.temp_buys_list = {} def run(self, context: Any): if not self.today_trade_switch: self.log.info("今日非交易日,跳过调仓操作。") return # 重置当天已买入记录 # self.position_manager.reset_not_buy_again() # 取目标持仓数以内的股票作为调仓目标 # self.log.info(f"每周调仓目标股票: {self.temp_target_list}") # 遍历当前持仓,若股票不在目标列表,则执行卖出操作 for stock in self.hold_list: if stock not in self.temp_target_list: pos = context.portfolio.positions.get(stock) self.log.info(f"调仓决策:卖出股票 {stock}") # 通过持仓监控器注册卖出请求,而不是直接卖出 self.sell_request(stock, pos, 'rebalance') # self.strategy.state.set_sell_request(stock, pos, 'rebalance') # self.sell_request(stock, pos, 'rebalance') else: self.log.info(f"调仓决策:继续持有股票 {stock}") # 对目标股票执行买入操作前,先将其注册到待买入队列 buy_targets = [stock for stock in self.temp_target_list if stock not in self.hold_list] if buy_targets: for stock in buy_targets: pos = context.portfolio.positions.get(stock) self.buys_request(stock, pos, 'buy') self.log.info(f"调仓决策:将 {stock} 加入待买入队列") def handle(self, context: Any): pass def end(self, context: Any): pass # 这里可以添加任何必要的清理或总结操作 def sell_request(self, stock, data, reason): self.temp_sells_list[f"{stock}_{reason}"] = data def buys_request(self, stock, data, reason): self.temp_buys_list[f"{stock}_{reason}"] = data