feat: 增加金字塔选股任务
This commit is contained in:
@@ -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年财报的股票
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user