257 lines
14 KiB
Go
257 lines
14 KiB
Go
package a
|
|
|
|
import (
|
|
"log"
|
|
"strings"
|
|
"time"
|
|
|
|
"git.apinb.com/bsm-sdk/core/utils"
|
|
"git.apinb.com/dataset/stock/internal/impl"
|
|
"git.apinb.com/dataset/stock/internal/models"
|
|
)
|
|
|
|
func GetFinaIndicator() {
|
|
end := time.Now().Format("20060102")
|
|
for _, code := range GetStockCodes() {
|
|
var start string = "20230101"
|
|
var last models.StockFinaIndicator
|
|
err := impl.DBService.Where("ts_code=?", code).Order("ann_date DESC").First(&last).Error
|
|
if err == nil {
|
|
start = utils.Int2String(last.AnnDate)
|
|
}
|
|
params := map[string]string{
|
|
"ts_code": code,
|
|
"start_date": start,
|
|
"end_date": end,
|
|
}
|
|
|
|
if start == end {
|
|
continue
|
|
}
|
|
|
|
fields := strings.Split("ts_code,ann_date,end_date,eps,dt_eps,total_revenue_ps,revenue_ps,capital_rese_ps,surplus_rese_ps,undist_profit_ps,extra_item,profit_dedt,gross_margin,current_ratio,quick_ratio,cash_ratio,invturn_days,arturn_days,inv_turn,ar_turn,ca_turn,fa_turn,assets_turn,op_income,valuechange_income,interst_income,daa,ebit,ebitda,fcff,fcfe,current_exint,noncurrent_exint,interestdebt,netdebt,tangible_asset,working_capital,networking_capital,invest_capital,retained_earnings,diluted2_eps,bps,ocfps,retainedps,cfps,ebit_ps,fcff_ps,fcfe_ps,netprofit_margin,grossprofit_margin,cogs_of_sales,expense_of_sales,profit_to_gr,saleexp_to_gr,adminexp_of_gr,finaexp_of_gr,impai_ttm,gc_of_gr,op_of_gr,ebit_of_gr,roe,roe_waa,roe_dt,roa,npta,roic,roe_yearly,roa2_yearly,roe_avg,opincome_of_ebt,investincome_of_ebt,n_op_profit_of_ebt,tax_to_ebt,dtprofit_to_profit,salescash_to_or,ocf_to_or,ocf_to_opincome,capitalized_to_da,debt_to_assets,assets_to_eqt,dp_assets_to_eqt,ca_to_assets,nca_to_assets,tbassets_to_totalassets,int_to_talcap,eqt_to_talcapital,currentdebt_to_debt,longdeb_to_debt,ocf_to_shortdebt,debt_to_eqt,eqt_to_debt,eqt_to_interestdebt,tangibleasset_to_debt,tangasset_to_intdebt,tangibleasset_to_netdebt,ocf_to_debt,ocf_to_interestdebt,ocf_to_netdebt,ebit_to_interest,longdebt_to_workingcapital,ebitda_to_debt,turn_days,roa_yearly,roa_dp,fixed_assets,profit_prefin_exp,non_op_profit,op_to_ebt,nop_to_ebt,ocf_to_profit,cash_to_liqdebt,cash_to_liqdebt_withinterest,op_to_liqdebt,op_to_debt,roic_yearly,total_fa_trun,profit_to_op,q_opincome,q_investincome,q_dtprofit,q_eps,q_netprofit_margin,q_gsprofit_margin,q_exp_to_sales,q_profit_to_gr,q_saleexp_to_gr,q_adminexp_to_gr,q_finaexp_to_gr,q_impair_to_gr_ttm,q_gc_to_gr,q_op_to_gr,q_roe,q_dt_roe,q_npta,q_opincome_to_ebt,q_investincome_to_ebt,q_dtprofit_to_profit,q_salescash_to_or,q_ocf_to_sales,q_ocf_to_or,basic_eps_yoy,dt_eps_yoy,cfps_yoy,op_yoy,ebt_yoy,netprofit_yoy,dt_netprofit_yoy,ocf_yoy,roe_yoy,bps_yoy,assets_yoy,eqt_yoy,tr_yoy,or_yoy,q_gr_yoy,q_gr_qoq,q_sales_yoy,q_sales_qoq,q_op_yoy,q_op_qoq,q_profit_yoy,q_profit_qoq,q_netprofit_yoy,q_netprofit_qoq,equity_yoy,rd_exp,update_flag", ",")
|
|
reply, err := TushareClient.FinaIndicator(params, fields)
|
|
if err != nil {
|
|
log.Println("ERROR", "GetFinaIndicator", err)
|
|
return
|
|
}
|
|
|
|
records := make([]*models.StockFinaIndicator, 0)
|
|
itemData := make(map[string]any)
|
|
for _, item := range reply.Data.Items {
|
|
for i := 0; i < len(item); i++ {
|
|
itemData[reply.Data.Fields[i]] = item[i]
|
|
}
|
|
t := utils.String2Int(itemData["ann_date"].(string))
|
|
if t == 0 {
|
|
continue
|
|
}
|
|
|
|
var cnt int64
|
|
impl.DBService.Model(&models.StockFinaIndicator{}).Where("ts_code=? and ann_date=?", itemData["ts_code"].(string), t).Count(&cnt)
|
|
if cnt == 0 {
|
|
records = append(records, &models.StockFinaIndicator{
|
|
TsCode: itemData["ts_code"].(string),
|
|
AnnDate: t,
|
|
EndDate: itemData["end_date"].(string),
|
|
|
|
// 每股指标
|
|
Eps: Any2Float(itemData["eps"]),
|
|
DtEps: Any2Float(itemData["dt_eps"]),
|
|
TotalRevenuePs: Any2Float(itemData["total_revenue_ps"]),
|
|
RevenuePs: Any2Float(itemData["revenue_ps"]),
|
|
CapitalResePs: Any2Float(itemData["capital_rese_ps"]),
|
|
SurplusResePs: Any2Float(itemData["surplus_rese_ps"]),
|
|
UndistProfitPs: Any2Float(itemData["undist_profit_ps"]),
|
|
Diluted2Eps: Any2Float(itemData["diluted2_eps"]),
|
|
Bps: Any2Float(itemData["bps"]),
|
|
Ocfps: Any2Float(itemData["ocfps"]),
|
|
Retainedps: Any2Float(itemData["retainedps"]),
|
|
Cfps: Any2Float(itemData["cfps"]),
|
|
EbitPs: Any2Float(itemData["ebit_ps"]),
|
|
FcffPs: Any2Float(itemData["fcff_ps"]),
|
|
FcfePs: Any2Float(itemData["fcfe_ps"]),
|
|
|
|
// 利润表相关
|
|
ExtraItem: Any2Float(itemData["extra_item"]),
|
|
ProfitDedt: Any2Float(itemData["profit_dedt"]),
|
|
GrossMargin: Any2Float(itemData["gross_margin"]),
|
|
OpIncome: Any2Float(itemData["op_income"]),
|
|
ValuechangeIncome: Any2Float(itemData["valuechange_income"]),
|
|
InterstIncome: Any2Float(itemData["interst_income"]),
|
|
Daa: Any2Float(itemData["daa"]),
|
|
Ebit: Any2Float(itemData["ebit"]),
|
|
Ebitda: Any2Float(itemData["ebitda"]),
|
|
Fcff: Any2Float(itemData["fcff"]),
|
|
Fcfe: Any2Float(itemData["fcfe"]),
|
|
RdExp: Any2Float(itemData["rd_exp"]),
|
|
FixedAssets: Any2Float(itemData["fixed_assets"]),
|
|
ProfitPrefinExp: Any2Float(itemData["profit_prefin_exp"]),
|
|
NonOpProfit: Any2Float(itemData["non_op_profit"]),
|
|
|
|
// 资产负债表相关
|
|
CurrentExint: Any2Float(itemData["current_exint"]),
|
|
NoncurrentExint: Any2Float(itemData["noncurrent_exint"]),
|
|
Interestdebt: Any2Float(itemData["interestdebt"]),
|
|
Netdebt: Any2Float(itemData["netdebt"]),
|
|
TangibleAsset: Any2Float(itemData["tangible_asset"]),
|
|
WorkingCapital: Any2Float(itemData["working_capital"]),
|
|
NetworkingCapital: Any2Float(itemData["networking_capital"]),
|
|
InvestCapital: Any2Float(itemData["invest_capital"]),
|
|
RetainedEarnings: Any2Float(itemData["retained_earnings"]),
|
|
|
|
// 偿债能力指标
|
|
CurrentRatio: Any2Float(itemData["current_ratio"]),
|
|
QuickRatio: Any2Float(itemData["quick_ratio"]),
|
|
CashRatio: Any2Float(itemData["cash_ratio"]),
|
|
DebtToAssets: Any2Float(itemData["debt_to_assets"]),
|
|
AssetsToEqt: Any2Float(itemData["assets_to_eqt"]),
|
|
DpAssetsToEqt: Any2Float(itemData["dp_assets_to_eqt"]),
|
|
DebtToEqt: Any2Float(itemData["debt_to_eqt"]),
|
|
EqtToDebt: Any2Float(itemData["eqt_to_debt"]),
|
|
OcfToShortdebt: Any2Float(itemData["ocf_to_shortdebt"]),
|
|
EbitToInterest: Any2Float(itemData["ebit_to_interest"]),
|
|
|
|
// 运营能力指标
|
|
InvturnDays: Any2Float(itemData["invturn_days"]),
|
|
ArturnDays: Any2Float(itemData["arturn_days"]),
|
|
InvTurn: Any2Float(itemData["inv_turn"]),
|
|
ArTurn: Any2Float(itemData["ar_turn"]),
|
|
CaTurn: Any2Float(itemData["ca_turn"]),
|
|
FaTurn: Any2Float(itemData["fa_turn"]),
|
|
AssetsTurn: Any2Float(itemData["assets_turn"]),
|
|
TurnDays: Any2Float(itemData["turn_days"]),
|
|
TotalFaTrun: Any2Float(itemData["total_fa_trun"]),
|
|
|
|
// 盈利能力指标
|
|
NetprofitMargin: Any2Float(itemData["netprofit_margin"]),
|
|
GrossprofitMargin: Any2Float(itemData["grossprofit_margin"]),
|
|
CogsOfSales: Any2Float(itemData["cogs_of_sales"]),
|
|
ExpenseOfSales: Any2Float(itemData["expense_of_sales"]),
|
|
Roe: Any2Float(itemData["roe"]),
|
|
RoeWaa: Any2Float(itemData["roe_waa"]),
|
|
RoeDt: Any2Float(itemData["roe_dt"]),
|
|
Roa: Any2Float(itemData["roa"]),
|
|
Npta: Any2Float(itemData["npta"]),
|
|
Roic: Any2Float(itemData["roic"]),
|
|
RoaDp: Any2Float(itemData["roa_dp"]),
|
|
|
|
// 结构指标
|
|
CaToAssets: Any2Float(itemData["ca_to_assets"]),
|
|
NcaToAssets: Any2Float(itemData["nca_to_assets"]),
|
|
TbassetsToTotalassets: Any2Float(itemData["tbassets_to_totalassets"]),
|
|
IntToTalcap: Any2Float(itemData["int_to_talcap"]),
|
|
EqtToTalcapital: Any2Float(itemData["eqt_to_talcapital"]),
|
|
CurrentdebtToDebt: Any2Float(itemData["currentdebt_to_debt"]),
|
|
LongdebToDebt: Any2Float(itemData["longdeb_to_debt"]),
|
|
TangibleassetToDebt: Any2Float(itemData["tangibleasset_to_debt"]),
|
|
|
|
// 单季度指标
|
|
QOpincome: Any2Float(itemData["q_opincome"]),
|
|
QInvestincome: Any2Float(itemData["q_investincome"]),
|
|
QDtprofit: Any2Float(itemData["q_dtprofit"]),
|
|
QEps: Any2Float(itemData["q_eps"]),
|
|
QNetprofitMargin: Any2Float(itemData["q_netprofit_margin"]),
|
|
QGscaleprofitMargin: Any2Float(itemData["q_gsprofit_margin"]),
|
|
QExpToSales: Any2Float(itemData["q_exp_to_sales"]),
|
|
QRoe: Any2Float(itemData["q_roe"]),
|
|
QDtRoe: Any2Float(itemData["q_dt_roe"]),
|
|
QNpta: Any2Float(itemData["q_npta"]),
|
|
|
|
// 同比增长率
|
|
BasicEpsYoy: Any2Float(itemData["basic_eps_yoy"]),
|
|
DtEpsYoy: Any2Float(itemData["dt_eps_yoy"]),
|
|
CfpsYoy: Any2Float(itemData["cfps_yoy"]),
|
|
OpYoy: Any2Float(itemData["op_yoy"]),
|
|
EbtYoy: Any2Float(itemData["ebt_yoy"]),
|
|
NetprofitYoy: Any2Float(itemData["netprofit_yoy"]),
|
|
DtNetprofitYoy: Any2Float(itemData["dt_netprofit_yoy"]),
|
|
OcfYoy: Any2Float(itemData["ocf_yoy"]),
|
|
RoeYoy: Any2Float(itemData["roe_yoy"]),
|
|
BpsYoy: Any2Float(itemData["bps_yoy"]),
|
|
AssetsYoy: Any2Float(itemData["assets_yoy"]),
|
|
EqtYoy: Any2Float(itemData["eqt_yoy"]),
|
|
TrYoy: Any2Float(itemData["tr_yoy"]),
|
|
OrYoy: Any2Float(itemData["or_yoy"]),
|
|
EquityYoy: Any2Float(itemData["equity_yoy"]),
|
|
|
|
// 其他比率指标
|
|
ProfitToGr: Any2Float(itemData["profit_to_gr"]),
|
|
SaleexpToGr: Any2Float(itemData["saleexp_to_gr"]),
|
|
AdminexpOfGr: Any2Float(itemData["adminexp_of_gr"]),
|
|
FinaexpOfGr: Any2Float(itemData["finaexp_of_gr"]),
|
|
ImpaiTtm: Any2Float(itemData["impai_ttm"]),
|
|
GcOfGr: Any2Float(itemData["gc_of_gr"]),
|
|
OpOfGr: Any2Float(itemData["op_of_gr"]),
|
|
EbitOfGr: Any2Float(itemData["ebit_of_gr"]),
|
|
OpincomeOfEbt: Any2Float(itemData["opincome_of_ebt"]),
|
|
InvestincomeOfEbt: Any2Float(itemData["investincome_of_ebt"]),
|
|
NOpProfitOfEbt: Any2Float(itemData["n_op_profit_of_ebt"]),
|
|
TaxToEbt: Any2Float(itemData["tax_to_ebt"]),
|
|
DtprofitToProfit: Any2Float(itemData["dtprofit_to_profit"]),
|
|
SalescashToOr: Any2Float(itemData["salescash_to_or"]),
|
|
OcfToOr: Any2Float(itemData["ocf_to_or"]),
|
|
OcfToOpincome: Any2Float(itemData["ocf_to_opincome"]),
|
|
CapitalizedToDa: Any2Float(itemData["capitalized_to_da"]),
|
|
OcfToDebt: Any2Float(itemData["ocf_to_debt"]),
|
|
OcfToInterestdebt: Any2Float(itemData["ocf_to_interestdebt"]),
|
|
OcfToNetdebt: Any2Float(itemData["ocf_to_netdebt"]),
|
|
LongdebtToWorkingcapital: Any2Float(itemData["longdebt_to_workingcapital"]),
|
|
EbitdaToDebt: Any2Float(itemData["ebitda_to_debt"]),
|
|
OpToEbt: Any2Float(itemData["op_to_ebt"]),
|
|
NopToEbt: Any2Float(itemData["nop_to_ebt"]),
|
|
OcfToProfit: Any2Float(itemData["ocf_to_profit"]),
|
|
CashToLiqdebt: Any2Float(itemData["cash_to_liqdebt"]),
|
|
CashToLiqdebtWithinterest: Any2Float(itemData["cash_to_liqdebt_withinterest"]),
|
|
OpToLiqdebt: Any2Float(itemData["op_to_liqdebt"]),
|
|
OpToDebt: Any2Float(itemData["op_to_debt"]),
|
|
ProfitToOp: Any2Float(itemData["profit_to_op"]),
|
|
|
|
// 年度化指标
|
|
RoeYearly: Any2Float(itemData["roe_yearly"]),
|
|
Roa2Yearly: Any2Float(itemData["roa2_yearly"]),
|
|
RoaYearly: Any2Float(itemData["roa_yearly"]),
|
|
RoicYearly: Any2Float(itemData["roic_yearly"]),
|
|
RoeAvg: Any2Float(itemData["roe_avg"]),
|
|
|
|
// 单季度增长比率
|
|
QGrYoy: Any2Float(itemData["q_gr_yoy"]),
|
|
QGrQoq: Any2Float(itemData["q_gr_qoq"]),
|
|
QSalesYoy: Any2Float(itemData["q_sales_yoy"]),
|
|
QSalesQoq: Any2Float(itemData["q_sales_qoq"]),
|
|
QOpYoy: Any2Float(itemData["q_op_yoy"]),
|
|
QOpQoq: Any2Float(itemData["q_op_qoq"]),
|
|
QProfitYoy: Any2Float(itemData["q_profit_yoy"]),
|
|
QProfitQoq: Any2Float(itemData["q_profit_qoq"]),
|
|
QNetprofitYoy: Any2Float(itemData["q_netprofit_yoy"]),
|
|
QNetprofitQoq: Any2Float(itemData["q_netprofit_qoq"]),
|
|
|
|
// 单季度比率指标
|
|
QProfitToGr: Any2Float(itemData["q_profit_to_gr"]),
|
|
QSaleexpToGr: Any2Float(itemData["q_saleexp_to_gr"]),
|
|
QAdminexpToGr: Any2Float(itemData["q_adminexp_to_gr"]),
|
|
QFinaexpToGr: Any2Float(itemData["q_finaexp_to_gr"]),
|
|
QImpairToGrTtm: Any2Float(itemData["q_impair_to_gr_ttm"]),
|
|
QGcToGr: Any2Float(itemData["q_gc_to_gr"]),
|
|
QOpToGr: Any2Float(itemData["q_op_to_gr"]),
|
|
QOpincomeToEbt: Any2Float(itemData["q_opincome_to_ebt"]),
|
|
QInvestincomeToEbt: Any2Float(itemData["q_investincome_to_ebt"]),
|
|
QDtprofitToProfit: Any2Float(itemData["q_dtprofit_to_profit"]),
|
|
QSalescashToOr: Any2Float(itemData["q_salescash_to_or"]),
|
|
QOcfToSales: Any2Float(itemData["q_ocf_to_sales"]),
|
|
QOcfToOr: Any2Float(itemData["q_ocf_to_or"]),
|
|
|
|
// 其他
|
|
UpdateFlag: itemData["update_flag"].(string),
|
|
})
|
|
}
|
|
}
|
|
|
|
if len(records) > 0 {
|
|
impl.DBService.CreateInBatches(records, 100)
|
|
}
|
|
|
|
time.Sleep(200 * time.Microsecond)
|
|
}
|
|
}
|