package strategy import ( "fmt" "git.apinb.com/bsm-sdk/core/utils" "git.apinb.com/quant/gostock/internal/impl" "git.apinb.com/quant/gostock/internal/models" ) var Cache = make(map[string]*StockData) type StockData struct { Basic models.StockBasic Daily []models.StockDaily Indicator []models.StockIndicator FinaIndicator []models.StockFinaIndicator } func InitCacheByAll() { for _, code := range GetStocks() { Cache[code] = GetFullData(code) } } func InitCacheByCode(code string) { Cache[code] = GetFullData(code) } func GetFullData(code string) *StockData { var data StockData impl.DBService.Where("ts_code = ?", code).First(&data.Basic) impl.DBService.Where("ts_code = ?", code).Order("trade_date desc").Find(&data.Daily) impl.DBService.Where("ts_code = ?", code).Order("trade_date desc").Find(&data.Indicator) impl.DBService.Where("ts_code = ?", code).Order("period desc").Find(&data.FinaIndicator) return &data } func GenMarkData(code string) { md := NewMarkdownBuilder() var basic models.StockBasic impl.DBService.Where("ts_code = ?", code).First(&basic) md.Title(basic.TsCode + " " + basic.Name + " 股票详情") md.Catalog("公司基础情况") md.KvText("股票代码", basic.TsCode) md.KvText("股票名称", basic.Name) md.KvText("股票行业", basic.Industry) md.KvText("股票地域", basic.Area) md.KvText("上市日期", basic.ListDate) md.KvText("股票市场", basic.Market) md.KvText("股票类型", basic.Market) md.KvText("股票是否沪深港通", basic.IsHS) md.KvText("股票中文全称", basic.FullName) md.KvText("股票实控人", basic.ActName) md.KvText("股票实控人企业性质", basic.ActEntType) md.BR() var daily []models.StockDaily impl.DBService.Where("ts_code = ?", code).Order("trade_date desc").Limit(200).Find(&daily) var data [][]string for _, row := range daily { data = append(data, []string{ utils.Int2String(row.TradeDate), fmt.Sprintf("%.2f", row.Open), fmt.Sprintf("%.2f", row.Close), fmt.Sprintf("%.2f", row.High), fmt.Sprintf("%.2f", row.Low), fmt.Sprintf("%.2f", row.Vol), fmt.Sprintf("%.2f", row.Amount), }) } md.Table("最近200天股票行情", []string{"日期", "开盘价", "收盘价", "最高价", "最低价", "成交量", "成交额"}, data) md.BR() var indicator []models.StockIndicator impl.DBService.Where("ts_code = ?", code).Order("trade_date desc").Limit(200).Find(&indicator) var indiData [][]string for _, row := range indicator { indiData = append(indiData, []string{ utils.Int2String(row.TradeDate), fmt.Sprintf("%.2f", row.Close), fmt.Sprintf("%.2f%%", row.TurnoverRate), fmt.Sprintf("%.2f", row.VolumeRatio), fmt.Sprintf("%.2f", row.Pe), fmt.Sprintf("%.2f", row.PeTtm), fmt.Sprintf("%.2f", row.Pb), fmt.Sprintf("%.2f", row.Ps), fmt.Sprintf("%.2f", row.PsTtm), fmt.Sprintf("%.2f", row.DvRatio), fmt.Sprintf("%.2f", row.DvTtm), fmt.Sprintf("%.2f", row.TotalShare), fmt.Sprintf("%.2f", row.FloatShare), fmt.Sprintf("%.2f", row.FreeShare), fmt.Sprintf("%.2f", row.TotalMv), fmt.Sprintf("%.2f", row.CircMv), }) } md.Table("最近200天股票指标", []string{"日期", "当日收盘价", "换手率", "量比", "市盈率", "市盈率 TTM", "市净率", "市销率", "市销率 TTM", "股息率", "股息率 TTM", "总股本", "流通股本", "自由流通股本", "总市值", "流通市值"}, indiData) md.BR() var finaIndicator []models.StockFinaIndicator impl.DBService.Where("ts_code = ?", code).Order("period desc").Find(&finaIndicator) var fiHeaders []string = []string{ "报告期数", "公告日期", "报告期", // 每股指标 "基本每股收益", "稀释每股收益", "每股营业总收入", "每股营业收入", "每股资本公积", "每股盈余公积", "每股未分配利润", "期末摊薄每股收益", "每股净资产", "每股经营活动产生的现金流量净额", "每股留存收益", "每股现金流量净额", "每股息税前利润", "每股企业自由现金流量", "每股股东自由现金流量", // 利润表相关 "非经常性损益", "扣除非经常性损益后的净利润", "毛利", "经营活动净收益", "价值变动净收益", "利息费用", "折旧与摊销", "息税前利润", "息税折旧摊销前利润", "企业自由现金流量", "股权自由现金流量", "研发费用", "固定资产合计", "扣除财务费用前营业利润", "非营业利润", // 资产负债表相关 "无息流动负债", "无息非流动负债", "带息债务", "净债务", "有形资产", "营运资金", "营运流动资本", "全部投入资本", "留存收益", // 偿债能力指标 "流动比率", "速动比率", "保守速动比率", "资产负债率", "权益乘数", "权益乘数(杜邦分析)", "产权比率", "归属于母公司的股东权益/负债合计", "经营活动产生的现金流量净额/流动负债", "已获利息倍数", // 运营能力指标 "存货周转天数", "应收账款周转天数", "存货周转率", "应收账款周转率", "流动资产周转率", "固定资产周转率", "总资产周转率", "营业周期", // 盈利能力指标 "销售净利率", "销售毛利率", "销售成本率", "销售期间费用率", "净资产收益率", "加权平均净资产收益率", "净资产收益率(扣除非经常损益)", "总资产报酬率", "总资产净利润", "投入资本回报率", "总资产净利率(杜邦分析)", // 结构指标 "流动资产/总资产", "非流动资产/总资产", "有形资产/总资产", "带息债务/全部投入资本", "归属于母公司的股东权益/全部投入资本", "流动负债/负债合计", "非流动负债/负债合计", "有形资产/负债合计", // 单季度指标 "经营活动单季度净收益", "价值变动单季度净收益", "扣除非经常损益后的单季度净利润", "每股收益(单季度)", "销售净利率(单季度)", "销售毛利率(单季度)", "销售期间费用率(单季度)", "净资产收益率(单季度)", "净资产单季度收益率(扣除非经常损益)", "总资产净利润(单季度)", // 同比增长率 "基本每股收益同比增长率(%)", "稀释每股收益同比增长率(%)", "每股经营活动产生的现金流量净额同比增长率(%)", "营业利润同比增长率(%)", "利润总额同比增长率(%)", "归属母公司股东的净利润同比增长率(%)", "归属母公司股东的净利润-扣除非经常损益同比增长率(%)", "经营活动产生的现金流量净额同比增长率(%)", "净资产收益率(摊薄)同比增长率(%)", "每股净资产相对年初增长率(%)", "资产总计相对年初增长率(%)", "归属母公司的股东权益相对年初增长率(%)", "营业总收入同比增长率(%)", "营业收入同比增长率(%)", "净资产同比增长率", // 其他比率指标 "净利润/营业总收入", "销售费用/营业总收入", "管理费用/营业总收入", "财务费用/营业总收入", "资产减值损失/营业总收入", "营业总成本/营业总收入", "营业利润/营业总收入", "息税前利润/营业总收入", "经营活动净收益/利润总额", "价值变动净收益/利润总额", "营业外收支净额/利润总额", "所得税/利润总额", "扣除非经常损益后的净利润/净利润", "销售商品提供劳务收到的现金/营业收入", "经营活动产生的现金流量净额/营业收入", "经营活动产生的现金流量净额/经营活动净收益", "资本支出/折旧和摊销", "经营活动产生的现金流量净额/负债合计", "经营活动产生的现金流量净额/带息债务", "经营活动产生的现金流量净额/净债务", "长期债务与营运资金比率", "息税折旧摊销前利润/负债合计", "营业利润/利润总额", "非营业利润/利润总额", "经营活动产生的现金流量净额/营业利润", "货币资金/流动负债", "货币资金/带息流动负债", "营业利润/流动负债", "营业利润/负债合计", "利润总额/营业收入", // 年度化指标 "年化净资产收益率", "年化总资产报酬率", "年化总资产净利率", "年化投入资本回报率", "平均净资产收益率(增发条件)", // 单季度增长比率 "营业总收入同比增长率(%)(单季度)", "营业总收入环比增长率(%)(单季度)", "营业收入同比增长率(%)(单季度)", "营业收入环比增长率(%)(单季度)", "营业利润同比增长率(%)(单季度)", "营业利润环比增长率(%)(单季度)", "净利润同比增长率(%)(单季度)", "净利润环比增长率(%)(单季度)", "归属母公司股东的净利润同比增长率(%)(单季度)", "归属母公司股东的净利润环比增长率(%)(单季度)", // 单季度比率指标 "净利润/营业总收入(单季度)", "销售费用/营业总收入 (单季度)", "管理费用/营业总收入 (单季度)", "财务费用/营业总收入 (单季度)", "资产减值损失/营业总收入(单季度)", "营业总成本/营业总收入 (单季度)", "营业利润/营业总收入(单季度)", "经营活动净收益/利润总额(单季度)", "价值变动净收益/利润总额(单季度)", "扣除非经常损益后的净利润/净利润(单季度)", "销售商品提供劳务收到的现金/营业收入(单季度)", "经营活动产生的现金流量净额/营业收入(单季度)", "经营活动产生的现金流量净额/经营活动净收益(单季度)", } var fiData [][]string for _, row := range finaIndicator { fiData = append(fiData, []string{ fmt.Sprintf("%d", row.Period), row.AnnDate, row.EndDate, // 每股指标 fmt.Sprintf("%.2f", row.Eps), fmt.Sprintf("%.2f", row.DtEps), fmt.Sprintf("%.2f", row.TotalRevenuePs), fmt.Sprintf("%.2f", row.RevenuePs), fmt.Sprintf("%.2f", row.CapitalResePs), fmt.Sprintf("%.2f", row.SurplusResePs), fmt.Sprintf("%.2f", row.UndistProfitPs), fmt.Sprintf("%.2f", row.Diluted2Eps), fmt.Sprintf("%.2f", row.Bps), fmt.Sprintf("%.2f", row.Ocfps), fmt.Sprintf("%.2f", row.Retainedps), fmt.Sprintf("%.2f", row.Cfps), fmt.Sprintf("%.2f", row.EbitPs), fmt.Sprintf("%.2f", row.FcffPs), fmt.Sprintf("%.2f", row.FcfePs), // 利润表相关 fmt.Sprintf("%.2f", row.ExtraItem), fmt.Sprintf("%.2f", row.ProfitDedt), fmt.Sprintf("%.2f", row.GrossMargin), fmt.Sprintf("%.2f", row.OpIncome), fmt.Sprintf("%.2f", row.ValuechangeIncome), fmt.Sprintf("%.2f", row.InterstIncome), fmt.Sprintf("%.2f", row.Daa), fmt.Sprintf("%.2f", row.Ebit), fmt.Sprintf("%.2f", row.Ebitda), fmt.Sprintf("%.2f", row.Fcff), fmt.Sprintf("%.2f", row.Fcfe), fmt.Sprintf("%.2f", row.RdExp), fmt.Sprintf("%.2f", row.FixedAssets), fmt.Sprintf("%.2f", row.ProfitPrefinExp), fmt.Sprintf("%.2f", row.NonOpProfit), // 资产负债表相关 fmt.Sprintf("%.2f", row.CurrentExint), fmt.Sprintf("%.2f", row.NoncurrentExint), fmt.Sprintf("%.2f", row.Interestdebt), fmt.Sprintf("%.2f", row.Netdebt), fmt.Sprintf("%.2f", row.TangibleAsset), fmt.Sprintf("%.2f", row.WorkingCapital), fmt.Sprintf("%.2f", row.NetworkingCapital), fmt.Sprintf("%.2f", row.InvestCapital), fmt.Sprintf("%.2f", row.RetainedEarnings), // 偿债能力指标 fmt.Sprintf("%.2f", row.CurrentRatio), fmt.Sprintf("%.2f", row.QuickRatio), fmt.Sprintf("%.2f", row.CashRatio), fmt.Sprintf("%.2f", row.DebtToAssets), fmt.Sprintf("%.2f", row.AssetsToEqt), fmt.Sprintf("%.2f", row.DpAssetsToEqt), fmt.Sprintf("%.2f", row.DebtToEqt), fmt.Sprintf("%.2f", row.EqtToDebt), fmt.Sprintf("%.2f", row.OcfToShortdebt), fmt.Sprintf("%.2f", row.EbitToInterest), // 运营能力指标 fmt.Sprintf("%.2f", row.InvturnDays), fmt.Sprintf("%.2f", row.ArturnDays), fmt.Sprintf("%.2f", row.InvTurn), fmt.Sprintf("%.2f", row.ArTurn), fmt.Sprintf("%.2f", row.CaTurn), fmt.Sprintf("%.2f", row.FaTurn), fmt.Sprintf("%.2f", row.AssetsTurn), fmt.Sprintf("%.2f", row.TurnDays), fmt.Sprintf("%.2f", row.TotalFaTrun), // 盈利能力指标 fmt.Sprintf("%.2f", row.NetprofitMargin), fmt.Sprintf("%.2f", row.GrossprofitMargin), fmt.Sprintf("%.2f", row.CogsOfSales), fmt.Sprintf("%.2f", row.ExpenseOfSales), fmt.Sprintf("%.2f", row.Roe), fmt.Sprintf("%.2f", row.RoeWaa), fmt.Sprintf("%.2f", row.RoeDt), fmt.Sprintf("%.2f", row.Roa), fmt.Sprintf("%.2f", row.Npta), fmt.Sprintf("%.2f", row.Roic), fmt.Sprintf("%.2f", row.RoaDp), // 结构指标 fmt.Sprintf("%.2f", row.CaToAssets), fmt.Sprintf("%.2f", row.NcaToAssets), fmt.Sprintf("%.2f", row.TbassetsToTotalassets), fmt.Sprintf("%.2f", row.IntToTalcap), fmt.Sprintf("%.2f", row.EqtToTalcapital), fmt.Sprintf("%.2f", row.CurrentdebtToDebt), fmt.Sprintf("%.2f", row.LongdebToDebt), fmt.Sprintf("%.2f", row.TangibleassetToDebt), // 单季度指标 fmt.Sprintf("%.2f", row.QOpincome), fmt.Sprintf("%.2f", row.QInvestincome), fmt.Sprintf("%.2f", row.QDtprofit), fmt.Sprintf("%.2f", row.QEps), fmt.Sprintf("%.2f", row.QNetprofitMargin), fmt.Sprintf("%.2f", row.QGscaleprofitMargin), fmt.Sprintf("%.2f", row.QExpToSales), fmt.Sprintf("%.2f", row.QRoe), fmt.Sprintf("%.2f", row.QDtRoe), fmt.Sprintf("%.2f", row.QNpta), // 同比增长率 fmt.Sprintf("%.2f%%", row.BasicEpsYoy), fmt.Sprintf("%.2f%%", row.DtEpsYoy), fmt.Sprintf("%.2f%%", row.CfpsYoy), fmt.Sprintf("%.2f%%", row.OpYoy), fmt.Sprintf("%.2f%%", row.EbtYoy), fmt.Sprintf("%.2f%%", row.NetprofitYoy), fmt.Sprintf("%.2f%%", row.DtNetprofitYoy), fmt.Sprintf("%.2f%%", row.OcfYoy), fmt.Sprintf("%.2f%%", row.RoeYoy), fmt.Sprintf("%.2f%%", row.BpsYoy), fmt.Sprintf("%.2f%%", row.AssetsYoy), fmt.Sprintf("%.2f%%", row.EqtYoy), fmt.Sprintf("%.2f%%", row.TrYoy), fmt.Sprintf("%.2f%%", row.OrYoy), fmt.Sprintf("%.2f%%", row.EquityYoy), // 其他比率指标 fmt.Sprintf("%.2f", row.ProfitToGr), fmt.Sprintf("%.2f", row.SaleexpToGr), fmt.Sprintf("%.2f", row.AdminexpOfGr), fmt.Sprintf("%.2f", row.FinaexpOfGr), fmt.Sprintf("%.2f", row.ImpaiTtm), fmt.Sprintf("%.2f", row.GcOfGr), fmt.Sprintf("%.2f", row.OpOfGr), fmt.Sprintf("%.2f", row.EbitOfGr), fmt.Sprintf("%.2f", row.OpincomeOfEbt), fmt.Sprintf("%.2f", row.InvestincomeOfEbt), fmt.Sprintf("%.2f", row.NOpProfitOfEbt), fmt.Sprintf("%.2f", row.TaxToEbt), fmt.Sprintf("%.2f", row.DtprofitToProfit), fmt.Sprintf("%.2f", row.SalescashToOr), fmt.Sprintf("%.2f", row.OcfToOr), fmt.Sprintf("%.2f", row.OcfToOpincome), fmt.Sprintf("%.2f", row.CapitalizedToDa), fmt.Sprintf("%.2f", row.OcfToDebt), fmt.Sprintf("%.2f", row.OcfToInterestdebt), fmt.Sprintf("%.2f", row.OcfToNetdebt), fmt.Sprintf("%.2f", row.LongdebtToWorkingcapital), fmt.Sprintf("%.2f", row.EbitdaToDebt), fmt.Sprintf("%.2f", row.OpToEbt), fmt.Sprintf("%.2f", row.NopToEbt), fmt.Sprintf("%.2f", row.OcfToProfit), fmt.Sprintf("%.2f", row.CashToLiqdebt), fmt.Sprintf("%.2f", row.CashToLiqdebtWithinterest), fmt.Sprintf("%.2f", row.OpToLiqdebt), fmt.Sprintf("%.2f", row.OpToDebt), fmt.Sprintf("%.2f", row.ProfitToOp), // 年度化指标 fmt.Sprintf("%.2f", row.RoeYearly), fmt.Sprintf("%.2f", row.Roa2Yearly), fmt.Sprintf("%.2f", row.RoaYearly), fmt.Sprintf("%.2f", row.RoicYearly), fmt.Sprintf("%.2f", row.RoeAvg), // 单季度增长比率 fmt.Sprintf("%.2f%%", row.QGrYoy), fmt.Sprintf("%.2f%%", row.QGrQoq), fmt.Sprintf("%.2f%%", row.QSalesYoy), fmt.Sprintf("%.2f%%", row.QSalesQoq), fmt.Sprintf("%.2f%%", row.QOpYoy), fmt.Sprintf("%.2f%%", row.QOpQoq), fmt.Sprintf("%.2f%%", row.QProfitYoy), fmt.Sprintf("%.2f%%", row.QProfitQoq), fmt.Sprintf("%.2f%%", row.QNetprofitYoy), fmt.Sprintf("%.2f%%", row.QNetprofitQoq), // 单季度比率指标 fmt.Sprintf("%.2f", row.QProfitToGr), fmt.Sprintf("%.2f", row.QSaleexpToGr), fmt.Sprintf("%.2f", row.QAdminexpToGr), fmt.Sprintf("%.2f", row.QFinaexpToGr), fmt.Sprintf("%.2f", row.QImpairToGrTtm), fmt.Sprintf("%.2f", row.QGcToGr), fmt.Sprintf("%.2f", row.QOpToGr), fmt.Sprintf("%.2f", row.QOpincomeToEbt), fmt.Sprintf("%.2f", row.QInvestincomeToEbt), fmt.Sprintf("%.2f", row.QDtprofitToProfit), fmt.Sprintf("%.2f", row.QSalescashToOr), fmt.Sprintf("%.2f", row.QOcfToSales), fmt.Sprintf("%.2f", row.QOcfToOr), }) } md.Table("最近3年的股票财务指标", fiHeaders, fiData) md.BR() md.SaveToFile("./result/" + code + ".md") } func GetStocks() (stocks []string) { impl.DBService.Model(&models.StockBasic{}).Group("ts_code").Pluck("ts_code", &stocks) return } func GetIndustry() (industry []string) { impl.DBService.Model(&models.StockBasic{}).Group("industry").Pluck("industry", &industry) return } func GetArgs(code string) *models.StockArgs { var args models.StockArgs err := impl.DBService.Where("ts_code = ?", code).First(&args).Error if err != nil { return nil } return &args } func GetBasic(code string) *models.StockBasic { var data StockData impl.DBService.Where("ts_code = ?", code).First(&data.Basic) return &data.Basic }