easyquant/task/buy_stocks_func_task.py

74 lines
3.2 KiB
Python
Raw Normal View History

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')
# 获取当前持仓列表
self.hold_list = [position.security for position in list(context.portfolio.positions.values())]
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')
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 and stock not in self.yesterday_HL_list:
pos = context.portfolio.positions.get(stock)
self.log.info(f"调仓决策:卖出股票 {stock}")
# 通过持仓监控器注册卖出请求,而不是直接卖出
self.strategy.state.set_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.strategy.state.set_buy_request(stock, pos, 'buy')
self.log.info(f"调仓决策:将 {len(buy_targets)} 只股票加入待买入队列: {buy_targets}")
# 更新当天已买入记录,防止重复买入
# for position in list(context.portfolio.positions.values()):
# if position.security not in self.position_manager.get_not_buy_again():
# self.position_manager.get_not_buy_again().append(position.security)
def handle(self, context: Any):
self.strategy.set_target_list(self.temp_target_list)
pass
def end(self, context: Any):
pass
# 这里可以添加任何必要的清理或总结操作