easyquant/task/buy_stocks_func_task.py
2025-07-06 17:42:06 +08:00

80 lines
3.3 KiB
Python

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)
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.strategy.state.set_buy_request(stock, pos, 'buy')
self.buys_request(stock, pos, 'buy')
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
# 这里可以添加任何必要的清理或总结操作
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