1
0

feat: 一些细小的调整

This commit is contained in:
2025-09-13 00:55:44 +08:00
parent acab6978d4
commit 7fa524b8d5
7 changed files with 102 additions and 83 deletions

View File

@@ -22,7 +22,6 @@ spring:
startup-delay: 30s
job-store-type: jdbc
jdbc:
# platform: mysql
platform: postgres
# initialize-schema: always
properties:

View File

@@ -30,12 +30,8 @@
<logger name="com.zaxxer.hikari" level="ERROR"/>
<!--<logger name="org.hibernate.SQL" level="DEBUG"/>-->
<springProfile name="build">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFile"/>
</springProfile>
<root level="INFO">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFile"/>
</root>
</configuration>

View File

@@ -144,18 +144,15 @@ POST {{api_url}}
Content-Type: application/json
{
"api_name": "income",
"api_name": "income_vip",
"token": "{{api_key}}",
"params": {
"ts_code": "000001.SZ",
"period": "20241231"
"ts_code": "000799.SZ",
"period": "20191231"
},
"fields": [
"ts_code",
"ann_date",
"total_revenue",
"total_cogs",
"n_income"
"revenue",
"total_revenue"
]
}
@@ -196,41 +193,14 @@ Content-Type: application/json
"api_name": "balancesheet_vip",
"token": "{{api_key}}",
"params": {
"ts_code": "000001.SZ",
"period": "20241231"
"ts_code": "000799.SZ",
"period": "20191231"
},
"fields": [
"ts_code",
"total_share",
"cap_rese",
"undistr_porfit",
"money_cap",
"accounts_receiv",
"inventories",
"total_cur_assets",
"lt_eqt_invest",
"lt_rec",
"fix_assets",
"r_and_d",
"goodwill",
"total_nca",
"total_assets",
"lt_borr",
"st_borr",
"acct_payable",
"adv_receipts",
"total_cur_liab",
"total_ncl",
"total_liab",
"total_hldr_eqy_exc_min_int",
"total_hldr_eqy_inc_min_int",
"total_liab_hldr_eqy",
"acc_receivable",
"payables",
"accounts_receiv_bill",
"accounts_pay",
"oth_rcv_total",
"fix_assets_total"
"acc_receivable"
]
}

View File

@@ -1,26 +1,26 @@
package com.lanyuanxiaoyao.leopard.strategy;
import com.lanyuanxiaoyao.leopard.core.entity.Daily;
import com.lanyuanxiaoyao.leopard.core.entity.Daily_;
import com.lanyuanxiaoyao.leopard.core.entity.QDaily;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.lanyuanxiaoyao.leopard.core.entity.BalanceSheet;
import com.lanyuanxiaoyao.leopard.core.entity.CashFlow;
import com.lanyuanxiaoyao.leopard.core.entity.Income;
import com.lanyuanxiaoyao.leopard.core.entity.QBalanceSheet;
import com.lanyuanxiaoyao.leopard.core.entity.QCashFlow;
import com.lanyuanxiaoyao.leopard.core.entity.QIncome;
import com.lanyuanxiaoyao.leopard.core.repository.BalanceSheetRepository;
import com.lanyuanxiaoyao.leopard.core.repository.CashFlowRepository;
import com.lanyuanxiaoyao.leopard.core.repository.DailyRepository;
import com.lanyuanxiaoyao.leopard.core.repository.IncomeRepository;
import com.lanyuanxiaoyao.leopard.core.repository.StockRepository;
import jakarta.annotation.Resource;
import jakarta.transaction.Transactional;
import java.time.Duration;
import java.time.ZoneId;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.ta4j.core.BaseBar;
import org.ta4j.core.BaseBarSeriesBuilder;
import org.ta4j.core.indicators.EMAIndicator;
import org.ta4j.core.indicators.helpers.ClosePriceIndicator;
import org.ta4j.core.num.DoubleNum;
@Slf4j
@SpringBootApplication(scanBasePackages = "com.lanyuanxiaoyao.leopard")
@@ -30,6 +30,12 @@ public class StrategyApplication {
private StockRepository stockRepository;
@Resource
private DailyRepository dailyRepository;
@Resource
private BalanceSheetRepository balanceSheetRepository;
@Resource
private IncomeRepository incomeRepository;
@Resource
private CashFlowRepository cashFlowRepository;
public static void main(String[] args) {
SpringApplication.run(StrategyApplication.class, args);
@@ -38,32 +44,76 @@ public class StrategyApplication {
@Transactional(rollbackOn = Throwable.class)
@EventListener(ApplicationReadyEvent.class)
public void test() {
var dailies = dailyRepository.findAll(QDaily.daily.stock.code.eq("000001.SZ"), Sort.by(Daily_.TRADE_DATE));
var series = new BaseBarSeriesBuilder()
.withNumTypeOf(DoubleNum.class)
.build();
log.info("{}", dailies.size());
for (Daily daily : dailies) {
series.addBar(new BaseBar(
Duration.ofDays(1),
daily.getTradeDate().plusDays(1).atStartOfDay(ZoneId.systemDefault()),
DoubleNum.valueOf(daily.getOpen() * daily.getFactor()),
DoubleNum.valueOf(daily.getHigh() * daily.getFactor()),
DoubleNum.valueOf(daily.getLow() * daily.getFactor()),
DoubleNum.valueOf(daily.getClose() * daily.getFactor()),
DoubleNum.valueOf(daily.getVolume()),
DoubleNum.valueOf(daily.getPriceChangeAmount()),
daily.getTurnover().longValue()
));
var code = "000799.SZ";
for (int year = 2019; year <= 2019; year++) {
var balance = balanceSheetRepository.findOne(
QBalanceSheet.balanceSheet.stock.code.eq(code)
.and(QBalanceSheet.balanceSheet.year.eq(year))
).orElseThrow();
var income = incomeRepository.findOne(
QIncome.income.stock.code.eq(code)
.and(QIncome.income.year.eq(year))
).orElseThrow();
var cashflow = cashFlowRepository.findOne(
QCashFlow.cashFlow.stock.code.eq(code)
.and(QCashFlow.cashFlow.year.eq(year))
).orElseThrow();
log.info("{} {}", year, calculateFinanceIndicator(balance, income, cashflow));
}
var ema = new EMAIndicator(new ClosePriceIndicator(series), 5);
var emaValues = ema.stream().toList();
log.info("{}", emaValues.size());
}
for (int index = 0; index < dailies.size(); index++) {
var daily = dailies.get(index);
var emaValue = emaValues.get(index);
log.info("{} {} {} {} {}", daily.getTradeDate().toString(), daily.getClose(), daily.getFactor(), daily.getClose() * daily.getFactor(), emaValue.doubleValue());
private FinanceIndicator calculateFinanceIndicator(BalanceSheet balance, Income income, CashFlow cashflow) {
return new FinanceIndicator(
safeDiv(balance.getTotalLiabilities(), balance.getTotalAssets()),
safeDiv(balance.getTotalAssets(), balance.getTotalNonCurrentAssets()),
safeDiv(balance.getTotalCurrentAssets(), balance.getTotalCurrentLiabilities()),
safeDiv(safeMinus(balance.getTotalCurrentAssets(), balance.getInventories()), balance.getTotalCurrentLiabilities()),
safeDiv(income.getOperatingRevenue(), balance.getNotesAndAccountsReceivable()),
safeDiv(360.0, safeDiv(income.getOperatingRevenue(), balance.getNotesAndAccountsReceivable())),
safeDiv(income.getTotalOperatingCost(), balance.getInventories())
);
}
private Double safePlus(Double a, Double b) {
if (ObjectUtil.isNull(a) || ObjectUtil.isNull(b)) {
return null;
}
return a + b;
}
private Double safeMinus(Double a, Double b) {
if (ObjectUtil.isNull(a) || ObjectUtil.isNull(b)) {
return null;
}
return a - b;
}
private Double safeDiv(Double a, Double b) {
if (ObjectUtil.isNull(a) || ObjectUtil.isNull(b) || b == 0) {
return null;
}
return NumberUtil.div(a, b, 4);
}
public record FinanceIndicator(
Double debtToAssetRatio,
Double longTermFundsToRealEstateRatio,
Double currentRatio,
Double quickRatio,
Double accountsReceivableTurnoverRate,
Double averageCashCollectionDays,
Double inventoryTurnoverRate
) {
@Override
public String toString() {
return "负债占资产比率=" + debtToAssetRatio +
", 长期资金占固定资产比率=" + longTermFundsToRealEstateRatio +
", 流动比率=" + currentRatio +
", 速动比率=" + quickRatio +
", 应收账款周转率=" + accountsReceivableTurnoverRate +
", 平均现金回收天数=" + averageCashCollectionDays +
", 库存周转率=" + inventoryTurnoverRate +
';';
}
}
}

View File

@@ -2,9 +2,13 @@ spring:
application:
name: leopard-strategy
datasource:
url: jdbc:postgresql://192.168.31.127:6785/leopard
url: jdbc:postgresql://81.71.3.24:6785/leopard_dev
username: leopard
password: '9NEzFzovnddf@PyEP?e*AYAWnCyd7UhYwQK$pJf>7?ccFiN^x4$eKEZ5~E<7<+~X'
driver-class-name: org.postgresql.Driver
jpa:
generate-ddl: false
main:
banner-mode: off
fenix:
print-banner: false

View File

@@ -14,10 +14,10 @@
</encoder>
</appender>
<logger name="com.zaxxer.hikari" level="ERROR"/>
<logger name="com.lanyuanxiaoyao.leopard" level="INFO"/>
<logger name="org.hibernate.SQL" level="DEBUG"/>
<root level="INFO">
<root level="ERROR">
<appender-ref ref="Console"/>
</root>
</configuration>

View File

@@ -49,7 +49,7 @@ const financePropertyLabel = (id: string | undefined, label: string, type: strin
actionType: 'dialog',
dialog: {
title: `${label}五年趋势`,
size: 'md',
size: 'lg',
bodyClassName: 'p-0',
...readOnlyDialogOptions(),
body: {