1
0

refactor: 移除年线数据

需要用的时候现算就是了,避免维护更多的原始数据
This commit is contained in:
2025-10-14 18:08:27 +08:00
parent e387fc839f
commit 963c2a9878
7 changed files with 30 additions and 212 deletions

View File

@@ -1,18 +1,17 @@
package com.lanyuanxiaoyao.leopard.strategy;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lanyuanxiaoyao.leopard.core.entity.QDaily;
import com.lanyuanxiaoyao.leopard.core.repository.DailyRepository;
import com.lanyuanxiaoyao.leopard.core.service.AssessmentService;
import com.lanyuanxiaoyao.leopard.core.service.TuShareService;
import com.lanyuanxiaoyao.leopard.core.service.selector.PyramidStockSelector;
import com.lanyuanxiaoyao.leopard.core.service.selector.StockSelector;
import jakarta.annotation.Resource;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -30,6 +29,10 @@ public class StrategyApplication {
private PyramidStockSelector pyramidStockSelector;
@Resource
private AssessmentService assessmentService;
@Resource
private TuShareService tuShareService;
@Resource
private DailyRepository dailyRepository;
public static void main(String[] args) {
SpringApplication.run(StrategyApplication.class, args);
@@ -269,62 +272,11 @@ public class StrategyApplication {
@Transactional(readOnly = true)
@EventListener(ApplicationReadyEvent.class)
public void test() {
/*var dailies = dailyRepository.findAll(
QDaily.daily.tradeDate.year().eq(2025),
Sort.by(Daily_.TRADE_DATE)
);
var data = dailies.stream()
.collect(Collectors.groupingBy(Daily::getStock))
.entrySet()
.parallelStream()
.map(entry -> {
var stock = entry.getKey();
var dailyList = entry.getValue()
.stream()
.sorted(Comparator.comparing(Daily::getTradeDate))
.toList();
var statistics = new DescriptiveStatistics();
dailyList.stream().map(Daily::getHfqClose).forEach(statistics::addValue);
var barSeries = new BaseBarSeriesBuilder().build();
dailyList.forEach(daily -> barSeries.addBar(new BaseBar(
Duration.ofDays(1),
daily.getTradeDate().atStartOfDay().atZone(ZoneId.systemDefault()),
daily.getHfqOpen(),
daily.getHfqHigh(),
daily.getHfqLow(),
daily.getHfqClose(),
daily.getVolume()
)));
return Map.<String, String>of(
"code", stock.getCode(),
"name", stock.getName(),
"std", NumberUtil.roundStr(statistics.getStandardDeviation(), 2),
"increase", NumberUtil.roundStr((dailyList.getLast().getHfqClose() - dailyList.getFirst().getHfqClose()) * 100.0 / dailyList.getFirst().getHfqClose(), 2)
);
})
.sorted((t1, t2) -> Double.compare(Double.parseDouble(t2.get("increase")), Double.parseDouble(t1.get("increase"))))
.toList();
render(Map.of("items", data));*/
var lines = new ArrayList<String>();
for (int year = 2024; year < 2025; year++) {
var candidates = pyramidStockSelector.select(new PyramidStockSelector.Request(year));
for (StockSelector.Candidate candidate : candidates) {
log.info("{} {}", candidate.stock().getName(), candidate.score());
}
var stocks = candidates.stream()
.map(StockSelector.Candidate::stock)
.collect(Collectors.toSet());
var results = assessmentService.assess(stocks, year);
int up = results.stream()
.filter(result -> result.change() > 0)
.mapToInt(result -> 1)
.sum();
lines.add(NumberUtil.roundStr(up * 100.0 / results.size(), 2));
results.forEach(result -> log.info("{} {} {} {} {}", result.stock().getCode(), result.stock().getName(), result.change(), result.std(), result.industryTop()));
}
for (int index = 0, year = 2010; index < lines.size(); index++, year++) {
log.info("胜率: {} {}", year, lines.get(index));
var dailies = dailyRepository.findAll(QDaily.daily.factor.isNull(), QDaily.daily.tradeDate.asc());
for (var daily : dailies) {
log.info("{} {} {}", daily.getStock().getCode(), daily.getStock().getName(), daily.getTradeDate());
// var response = tuShareService.factorList(daily.getTradeDate(), daily.getStock().getCode());
// var factor = response.data().items().getFirst().get(2);
}
}
}