2025-07-03 23:39:31 +08:00
|
|
|
|
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')
|
|
|
|
|
# 获取当前持仓列表
|
2025-07-04 14:35:51 +08:00
|
|
|
|
self.hold_list = self.strategy.state.get_hold_list()
|
2025-07-03 23:39:31 +08:00
|
|
|
|
self.index_stocks = self.get_config('index_stocks')
|
|
|
|
|
self.target_list = DataHelper.get_stock_list(context, self.index_stocks, self.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')
|
2025-07-04 14:35:51 +08:00
|
|
|
|
self.temp_sells_list = {}
|
|
|
|
|
self.temp_buys_list = {}
|
2025-07-03 23:39:31 +08:00
|
|
|
|
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}")
|
|
|
|
|
|
2025-07-04 14:35:51 +08:00
|
|
|
|
# 遍历当前持仓,若股票不在目标列表,则执行卖出操作
|
2025-07-03 23:39:31 +08:00
|
|
|
|
for stock in self.hold_list:
|
2025-07-04 14:35:51 +08:00
|
|
|
|
if stock not in self.temp_target_list:
|
2025-07-03 23:39:31 +08:00
|
|
|
|
pos = context.portfolio.positions.get(stock)
|
|
|
|
|
self.log.info(f"调仓决策:卖出股票 {stock}")
|
|
|
|
|
# 通过持仓监控器注册卖出请求,而不是直接卖出
|
2025-07-04 14:35:51 +08:00
|
|
|
|
self
|
|
|
|
|
#self.strategy.state.set_sell_request(stock, pos, 'rebalance')
|
|
|
|
|
self.sell_request(stock, pos, 'rebalance')
|
2025-07-03 23:39:31 +08:00
|
|
|
|
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)
|
2025-07-04 14:35:51 +08:00
|
|
|
|
#self.strategy.state.set_buy_request(stock, pos, 'buy')
|
|
|
|
|
self.buys_request(stock,pos,'buy')
|
2025-07-03 23:39:31 +08:00
|
|
|
|
self.log.info(f"调仓决策:将 {len(buy_targets)} 只股票加入待买入队列: {buy_targets}")
|
|
|
|
|
|
|
|
|
|
def handle(self, context: Any):
|
|
|
|
|
self.strategy.set_target_list(self.temp_target_list)
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def end(self, context: Any):
|
|
|
|
|
pass
|
|
|
|
|
# 这里可以添加任何必要的清理或总结操作
|
2025-07-04 14:35:51 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|