1
0

feat: 增加金字塔选股任务

This commit is contained in:
2025-09-25 17:46:52 +08:00
parent 02508a5426
commit 3991effa88
4 changed files with 50 additions and 3 deletions

View File

@@ -12,6 +12,7 @@ import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics; import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/** /**
* 金字塔选股 * 金字塔选股
@@ -28,6 +29,7 @@ public class PyramidStockSelector implements StockSelector<PyramidStockSelector.
this.stockRepository = stockRepository; this.stockRepository = stockRepository;
} }
@Transactional(readOnly = true)
@Override @Override
public Set<Candidate> select(Request request) { public Set<Candidate> select(Request request) {
// 选择至少有最近5年财报的股票 // 选择至少有最近5年财报的股票

View File

@@ -25,13 +25,11 @@ import org.springframework.stereotype.Service;
@Slf4j @Slf4j
@Service @Service
public class StockService extends SimpleServiceSupport<Stock> { public class StockService extends SimpleServiceSupport<Stock> {
private final StockRepository stockRepository;
private final FinanceIndicatorRepository financeIndicatorRepository; private final FinanceIndicatorRepository financeIndicatorRepository;
private final DailyRepository dailyRepository; private final DailyRepository dailyRepository;
public StockService(StockRepository repository, FinanceIndicatorRepository financeIndicatorRepository, DailyRepository dailyRepository) { public StockService(StockRepository repository, FinanceIndicatorRepository financeIndicatorRepository, DailyRepository dailyRepository) {
super(repository); super(repository);
this.stockRepository = repository;
this.financeIndicatorRepository = financeIndicatorRepository; this.financeIndicatorRepository = financeIndicatorRepository;
this.dailyRepository = dailyRepository; this.dailyRepository = dailyRepository;
} }

View File

@@ -4,6 +4,7 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.lanyuanxiaoyao.leopard.core.entity.Task; import com.lanyuanxiaoyao.leopard.core.entity.Task;
import com.lanyuanxiaoyao.leopard.core.repository.TaskRepository; import com.lanyuanxiaoyao.leopard.core.repository.TaskRepository;
import com.lanyuanxiaoyao.leopard.server.service.task.PyramidSelect;
import com.lanyuanxiaoyao.leopard.server.service.task.TaskRunner; import com.lanyuanxiaoyao.leopard.server.service.task.TaskRunner;
import com.lanyuanxiaoyao.leopard.server.service.task.UpdateDailyTask; import com.lanyuanxiaoyao.leopard.server.service.task.UpdateDailyTask;
import com.lanyuanxiaoyao.leopard.server.service.task.UpdateFinanceIndicatorTask; import com.lanyuanxiaoyao.leopard.server.service.task.UpdateFinanceIndicatorTask;
@@ -40,7 +41,8 @@ public class TaskService extends SimpleServiceSupport<Task> {
new TaskTemplate("更新股票信息", "更新股票信息", UpdateStockTask.class), new TaskTemplate("更新股票信息", "更新股票信息", UpdateStockTask.class),
new TaskTemplate("更新年线指标", "更新年线指标", UpdateYearlyTask.class), new TaskTemplate("更新年线指标", "更新年线指标", UpdateYearlyTask.class),
new TaskTemplate("更新日线数据", "更新日线数据", UpdateDailyTask.class), new TaskTemplate("更新日线数据", "更新日线数据", UpdateDailyTask.class),
new TaskTemplate("更新财务指标", "更新财务指标", UpdateFinanceIndicatorTask.class) new TaskTemplate("更新财务指标", "更新财务指标", UpdateFinanceIndicatorTask.class),
new TaskTemplate("金字塔选股", "金字塔选股", PyramidSelect.class)
).collect(Collectors.toSet()); ).collect(Collectors.toSet());
private final Map<String, TaskTemplate> templateMap = templates.stream() private final Map<String, TaskTemplate> templateMap = templates.stream()
.collect(Collectors.toMap(TaskTemplate::id, template -> template)); .collect(Collectors.toMap(TaskTemplate::id, template -> template));

View File

@@ -0,0 +1,45 @@
package com.lanyuanxiaoyao.leopard.server.service.task;
import com.lanyuanxiaoyao.leopard.core.entity.StockCollection;
import com.lanyuanxiaoyao.leopard.core.repository.StockCollectionRepository;
import com.lanyuanxiaoyao.leopard.core.service.selector.PyramidStockSelector;
import com.lanyuanxiaoyao.leopard.core.service.selector.StockSelector;
import java.time.LocalDate;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
/**
* 金字塔选股
*
* @author lanyuanxiaoyao
* @version 20250925
*/
@Slf4j
@Component
public class PyramidSelect extends TaskRunner {
private final StockCollectionRepository stockCollectionRepository;
private final PyramidStockSelector pyramidStockSelector;
protected PyramidSelect(ApplicationContext context, StockCollectionRepository stockCollectionRepository, PyramidStockSelector pyramidStockSelector) {
super(context);
this.stockCollectionRepository = stockCollectionRepository;
this.pyramidStockSelector = pyramidStockSelector;
}
@Transactional(rollbackFor = Throwable.class)
@Override
public String process(Map<String, Object> params, StepUpdater updater) throws Exception {
var candidates = pyramidStockSelector.select(new PyramidStockSelector.Request(LocalDate.now().getYear(), 50));
var collection = new StockCollection();
collection.setName("金字塔选股");
collection.setDescription("金字塔选股");
collection.setStocks(candidates.stream().map(StockSelector.Candidate::stock).collect(Collectors.toSet()));
stockCollectionRepository.save(collection);
return null;
}
}