diff --git a/cmd/cli/main.go b/cmd/cli/main.go index 8a58a3c..ef61927 100644 --- a/cmd/cli/main.go +++ b/cmd/cli/main.go @@ -22,18 +22,6 @@ func main() { config.New(ServiceKey) impl.NewImpl() - code := "601899.SH" - model := models.NewStratModel("selector", code) - stratRule := rule.NewRule(model) - stratRule.RunAi(code) - -} - -func main2() { - log.Println("Hello Cli!") - config.New(ServiceKey) - impl.NewImpl() - for _, code := range strategy.GetStocks() { strategy.InitCacheByCode(code) model := models.NewStratModel("selector", code) @@ -46,12 +34,25 @@ func main2() { stratRule.RunAmount(code) stratRule.RunRoe(code) stratRule.RunRsi(code) + stratRule.RunAi(code) } model.Save() } } +func ai() { + log.Println("Hello Cli!") + config.New(ServiceKey) + impl.NewImpl() + + code := "601899.SH" + model := models.NewStratModel("selector", code) + stratRule := rule.NewRule(model) + stratRule.RunAi(code) + +} + func main3() { log.Println("Hello Cli!") config.New(ServiceKey) diff --git a/internal/logic/deepseek/dpsk.go b/internal/logic/deepseek/dpsk.go deleted file mode 100644 index 0f40cfe..0000000 --- a/internal/logic/deepseek/dpsk.go +++ /dev/null @@ -1,266 +0,0 @@ -package deepseek - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "mime/multipart" - "net/http" - "os" - "path/filepath" - "time" -) - -// 配置结构体 -type Config struct { - APIKey string `json:"api_key"` - BaseURL string `json:"base_url"` - Model string `json:"model"` - MaxTokens int `json:"max_tokens"` - Temperature float64 `json:"temperature"` -} - -// 上传文件响应结构体 -type UploadResponse struct { - ID string `json:"id"` - Object string `json:"object"` - Bytes int `json:"bytes"` - CreatedAt int64 `json:"created_at"` - Filename string `json:"filename"` - Purpose string `json:"purpose"` -} - -// 消息结构体 -type Message struct { - Role string `json:"role"` - Content string `json:"content"` -} - -// 聊天请求结构体 -type ChatRequest struct { - Model string `json:"model"` - Messages []Message `json:"messages"` - MaxTokens int `json:"max_tokens,omitempty"` - Temperature float64 `json:"temperature,omitempty"` - Stream bool `json:"stream,omitempty"` -} - -// 聊天响应结构体 -type ChatResponse struct { - ID string `json:"id"` - Object string `json:"object"` - Created int64 `json:"created"` - Model string `json:"model"` - Choices []struct { - Index int `json:"index"` - Message struct { - Role string `json:"role"` - Content string `json:"content"` - } `json:"message"` - FinishReason string `json:"finish_reason"` - } `json:"choices"` - Usage struct { - PromptTokens int `json:"prompt_tokens"` - CompletionTokens int `json:"completion_tokens"` - TotalTokens int `json:"total_tokens"` - } `json:"usage"` -} - -// JSON响应包装器 -type JSONResponse struct { - Success bool `json:"success"` - Message string `json:"message,omitempty"` - Data interface{} `json:"data,omitempty"` - Error string `json:"error,omitempty"` -} - -// 上传文件到DeepSeek -func UploadFile(apiKey, filePath string) (*UploadResponse, error) { - file, err := os.Open(filePath) - if err != nil { - return nil, fmt.Errorf("打开文件失败: %v", err) - } - defer file.Close() - - // 创建multipart表单 - body := &bytes.Buffer{} - writer := multipart.NewWriter(body) - - // 添加文件字段 - part, err := writer.CreateFormFile("file", filepath.Base(filePath)) - if err != nil { - return nil, fmt.Errorf("创建表单文件失败: %v", err) - } - - _, err = io.Copy(part, file) - if err != nil { - return nil, fmt.Errorf("复制文件内容失败: %v", err) - } - - // 添加purpose字段 - _ = writer.WriteField("purpose", "assistants") - - err = writer.Close() - if err != nil { - return nil, fmt.Errorf("关闭writer失败: %v", err) - } - - // 创建请求 - req, err := http.NewRequest("POST", "https://api.deepseek.com/files", body) - if err != nil { - return nil, fmt.Errorf("创建请求失败: %v", err) - } - - req.Header.Set("Authorization", "Bearer "+apiKey) - req.Header.Set("Content-Type", writer.FormDataContentType()) - - // 发送请求 - client := &http.Client{Timeout: 30 * time.Second} - resp, err := client.Do(req) - if err != nil { - return nil, fmt.Errorf("发送请求失败: %v", err) - } - defer resp.Body.Close() - - // 读取响应 - respBody, err := io.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("读取响应失败: %v", err) - } - - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("API返回错误: %d %s", resp.StatusCode, string(respBody)) - } - - // 解析响应 - var uploadResp UploadResponse - err = json.Unmarshal(respBody, &uploadResp) - if err != nil { - return nil, fmt.Errorf("解析响应失败: %v", err) - } - - return &uploadResp, nil -} - -// 发送聊天请求(带文件) -func ChatWithFile(apiKey, fileID, question string, config Config) (*ChatResponse, error) { - // 构建消息内容 - content := fmt.Sprintf(`请分析我上传的Markdown文件并回答以下问题: -问题:%s - -请基于文件内容提供详细的回答。`, question) - - // 创建聊天请求 - chatReq := ChatRequest{ - Model: config.Model, - Messages: []Message{ - { - Role: "user", - Content: content, - }, - }, - MaxTokens: config.MaxTokens, - Temperature: config.Temperature, - Stream: false, - } - - // 如果有文件ID,添加到消息中 - if fileID != "" { - chatReq.Messages[0].Content = fmt.Sprintf(`我上传了一个Markdown文件(ID: %s),请分析这个文件并回答以下问题: -问题:%s - -请基于文件内容提供详细的回答。`, fileID, question) - } - - // 序列化请求体 - reqBody, err := json.Marshal(chatReq) - if err != nil { - return nil, fmt.Errorf("序列化请求失败: %v", err) - } - - // 创建请求 - req, err := http.NewRequest("POST", config.BaseURL+"/chat/completions", bytes.NewBuffer(reqBody)) - if err != nil { - return nil, fmt.Errorf("创建请求失败: %v", err) - } - - req.Header.Set("Authorization", "Bearer "+apiKey) - req.Header.Set("Content-Type", "application/json") - - // 发送请求 - client := &http.Client{Timeout: 60 * time.Second} - resp, err := client.Do(req) - if err != nil { - return nil, fmt.Errorf("发送请求失败: %v", err) - } - defer resp.Body.Close() - - // 读取响应 - respBody, err := io.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("读取响应失败: %v", err) - } - - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("API返回错误: %d - %s", resp.StatusCode, string(respBody)) - } - - // 解析响应 - var chatResp ChatResponse - err = json.Unmarshal(respBody, &chatResp) - if err != nil { - return nil, fmt.Errorf("解析响应失败: %v", err) - } - - return &chatResp, nil -} - -// 处理Markdown文件上传和问答 -func ProcessMarkdownQA(config Config, filePath, question string) ([]byte, error) { - var jsonResponse JSONResponse - - // 1. 上传文件 - fmt.Println("正在上传Markdown文件...") - uploadResp, err := UploadFile(config.APIKey, filePath) - if err != nil { - jsonResponse.Success = false - jsonResponse.Error = fmt.Sprintf("上传文件失败: %v", err) - return json.Marshal(jsonResponse) - } - - fmt.Printf("文件上传成功!文件ID: %s\n", uploadResp.ID) - - // 2. 使用文件进行问答 - fmt.Println("正在分析文件并回答问题...") - chatResp, err := ChatWithFile(config.APIKey, uploadResp.ID, question, config) - if err != nil { - jsonResponse.Success = false - jsonResponse.Error = fmt.Sprintf("问答失败: %v", err) - return json.Marshal(jsonResponse) - } - - // 3. 构建成功响应 - if len(chatResp.Choices) > 0 { - responseData := map[string]interface{}{ - "file_info": map[string]interface{}{ - "file_id": uploadResp.ID, - "filename": uploadResp.Filename, - "size_bytes": uploadResp.Bytes, - }, - "question": question, - "answer": chatResp.Choices[0].Message.Content, - "usage": chatResp.Usage, - "model": chatResp.Model, - } - - jsonResponse.Success = true - jsonResponse.Message = "处理成功" - jsonResponse.Data = responseData - } else { - jsonResponse.Success = false - jsonResponse.Error = "未收到有效回答" - } - - return json.MarshalIndent(jsonResponse, "", " ") -} diff --git a/internal/logic/strategy/rule/ai.go b/internal/logic/strategy/rule/ai.go index 2386cb1..a82d3ae 100644 --- a/internal/logic/strategy/rule/ai.go +++ b/internal/logic/strategy/rule/ai.go @@ -1,11 +1,16 @@ package rule import ( + "context" + "encoding/json" "fmt" + "os" + "strings" "git.apinb.com/bsm-sdk/core/utils" "git.apinb.com/quant/gostock/internal/config" - "git.apinb.com/quant/gostock/internal/logic/deepseek" + "github.com/go-deepseek/deepseek" + "github.com/go-deepseek/deepseek/request" ) var ( @@ -20,16 +25,31 @@ func (r *RuleFactory) RunAi(code string) { return } - c := deepseek.Config{ - APIKey: config.Spec.DeepSeekApiKey, // 替换为你的API Key - BaseURL: "https://api.deepseek.com", - Model: "deepseek-chat", // 或 "deepseek-coder" - MaxTokens: 2000, - Temperature: 0.7, + content, err := os.ReadFile(mdPath) + if err != nil { + r.Model.AiScrore = -1 + r.Model.AddDesc(fmt.Sprintf("%s markdown 读取错误,%v", mdPath, err)) + return } - prompt := "你是一名资深量化投研分析师。请根据markdown格式的附件内容,给出详细总结与买入评分(0-10),输出JSON,字段:summary(500字内中文总结)、score(0-10数字)、action(买入/谨慎/观望)、risk(一句风险提示)。" - result, err := deepseek.ProcessMarkdownQA(c, mdPath, prompt) + client, _ := deepseek.NewClient(config.Spec.DeepSeekApiKey) + //prompt := "你是一名资深量化投研分析师,分析" + code + "这个股票,该股票的详细数据在https://markdata.apinb.com/" + code + ".md 读取这个markdown格式的内容,根据内容中的行情,财报,技术指标等数据(倒序,最新在最前面),给出基本面总结,技术面总结,舆论总结等更多方面的总结,并输出买入评分(0-10)整数,输出JSON,字段:summary(500字内中文总结)、score(0-10数字)、action(买入/谨慎/观望)、risk(一句风险提示)。" + prompt := "你是一名资深量化投研分析师,分析" + code + "这个股票,根据内容中的行情,财报,技术指标等数据,给出基本面总结,技术面总结,舆论总结等更多方面的总结,并输出买入评分(0-10)整数,输出JSON,字段:summary(中文总结)、summary_2025(2025年财报总结)、summary_base(基本面分析总结)、summary_tech(技术面分析总结)、score(0-10数字)、support_level(支撑位价格)、resis_level(阻力位价格)、action(买入/谨慎/观望)、risk(一句风险提示)。\r\n" + prompt += "内容如下:\r\n" + prompt += string(content) + + chatReq := &request.ChatCompletionsRequest{ + Model: deepseek.DEEPSEEK_CHAT_MODEL, + Stream: false, + Messages: []*request.Message{ + { + Role: "system", + Content: prompt, // set your input message + }, + }, + } + + chatResp, err := client.CallChatCompletionsChat(context.Background(), chatReq) if err != nil { r.Model.AiScrore = -1 r.Model.AddDesc(fmt.Sprintf("处理失败: %v", err)) @@ -37,6 +57,27 @@ func (r *RuleFactory) RunAi(code string) { } // 输出JSON格式的结果 - fmt.Println(string(result)) + jsonBodys := strings.ReplaceAll(chatResp.Choices[0].Message.Content, "```json", "") + jsonBodys = strings.ReplaceAll(jsonBodys, "```", "") + + var result map[string]any + err = json.Unmarshal([]byte(jsonBodys), &result) + if err != nil { + r.Model.AiScrore = -1 + r.Model.AddDesc(fmt.Sprintf("Unmarshal: %v", err)) + return + } + + r.Model.AiSummary = result["summary"].(string) + r.Model.AiSummary2025 = result["summary_2025"].(string) + r.Model.AiSummaryBase = result["summary_base"].(string) + r.Model.AiSummaryTech = result["summary_tech"].(string) + r.Model.AiScrore = int(result["score"].(float64)) + r.Model.AiSupportLevel = result["support_level"].(float64) + r.Model.AiResisLevel = result["resis_level"].(float64) + r.Model.AiAction = result["action"].(string) + r.Model.AiRisk = result["risk"].(string) + + return } diff --git a/internal/models/strat_model.go b/internal/models/strat_model.go index ee8fdef..605264f 100644 --- a/internal/models/strat_model.go +++ b/internal/models/strat_model.go @@ -32,8 +32,15 @@ type StratModel struct { Desc []StratDesc `gorm:"foreignKey:StratModelID"` //AI - AiScrore int - AiReply string + AiSummary string + AiSummary2025 string + AiSummaryBase string + AiSummaryTech string + AiScrore int + AiSupportLevel float64 + AiResisLevel float64 + AiAction string + AiRisk string } func init() { diff --git a/markdata/601899.SH.md b/markdata/601899.SH.md index f14d40e..a13482b 100644 --- a/markdata/601899.SH.md +++ b/markdata/601899.SH.md @@ -14,7 +14,7 @@ 股票实控人 :上杭县财政局 股票实控人企业性质 :地方国有企业 -## 最近200天股票行情 +## 最近200天股票行情(倒序) | 日期 | 开盘价 | 收盘价 | 最高价 | 最低价 | 成交量 | 成交额 | | ------|---------|---------|---------|---------|---------|---------| | 20260128 | 41.40 | 42.30 | 42.58 | 40.60 | 6522833.03 | 27284833.18 | @@ -218,7 +218,7 @@ | 20250409 | 15.54 | 15.92 | 15.92 | 15.19 | 4467126.74 | 6914703.38 | | 20250408 | 15.54 | 15.95 | 15.95 | 15.21 | 3733607.40 | 5849553.14 | -## 最近200天股票指标 +## 最近200天股票指标(倒序) | 日期 | 当日收盘价 | 换手率 | 量比 | 市盈率 | 市盈率 TTM | 市净率 | 市销率 | 市销率 TTM | 股息率 | 股息率 TTM | 总股本 | 流通股本 | 自由流通股本 | 总市值 | 流通市值 | | ------|---------------|---------|------|---------|-------------|---------|---------|-------------|---------|-------------|---------|------------|------------------|---------|------------| | 20260128 | 42.30 | 3.17% | 1.34 | 35.09 | 24.69 | 6.70 | 3.70 | 3.43 | 1.18 | 1.18 | 2658973.31 | 2060089.31 | 1451737.54 | 112474571.18 | 87141777.98 | @@ -422,7 +422,7 @@ | 20250409 | 15.92 | 2.17% | 1.61 | 13.20 | 13.20 | 3.06 | 1.39 | 1.39 | 1.88 | 1.88 | 2657757.39 | 2058793.83 | 1450442.06 | 42311497.71 | 32775997.84 | | 20250408 | 15.95 | 1.81% | 1.59 | 13.23 | 13.23 | 3.07 | 1.40 | 1.40 | 1.88 | 1.88 | 2657757.39 | 2058793.83 | 1450442.06 | 42391230.43 | 32837761.65 | -## 最近3年的股票财务指标 +## 最近3年的股票财务指标(倒序) | 报告期数 | 公告日期 | 报告期 | 基本每股收益 | 稀释每股收益 | 每股营业总收入 | 每股营业收入 | 每股资本公积 | 每股盈余公积 | 每股未分配利润 | 期末摊薄每股收益 | 每股净资产 | 每股经营活动产生的现金流量净额 | 每股留存收益 | 每股现金流量净额 | 每股息税前利润 | 每股企业自由现金流量 | 每股股东自由现金流量 | 非经常性损益 | 扣除非经常性损益后的净利润 | 毛利 | 经营活动净收益 | 价值变动净收益 | 利息费用 | 折旧与摊销 | 息税前利润 | 息税折旧摊销前利润 | 企业自由现金流量 | 股权自由现金流量 | 研发费用 | 固定资产合计 | 扣除财务费用前营业利润 | 非营业利润 | 无息流动负债 | 无息非流动负债 | 带息债务 | 净债务 | 有形资产 | 营运资金 | 营运流动资本 | 全部投入资本 | 留存收益 | 流动比率 | 速动比率 | 保守速动比率 | 资产负债率 | 权益乘数 | 权益乘数(杜邦分析) | 产权比率 | 归属于母公司的股东权益/负债合计 | 经营活动产生的现金流量净额/流动负债 | 已获利息倍数 | 存货周转天数 | 应收账款周转天数 | 存货周转率 | 应收账款周转率 | 流动资产周转率 | 固定资产周转率 | 总资产周转率 | 营业周期 | 销售净利率 | 销售毛利率 | 销售成本率 | 销售期间费用率 | 净资产收益率 | 加权平均净资产收益率 | 净资产收益率(扣除非经常损益) | 总资产报酬率 | 总资产净利润 | 投入资本回报率 | 总资产净利率(杜邦分析) | 流动资产/总资产 | 非流动资产/总资产 | 有形资产/总资产 | 带息债务/全部投入资本 | 归属于母公司的股东权益/全部投入资本 | 流动负债/负债合计 | 非流动负债/负债合计 | 有形资产/负债合计 | 经营活动单季度净收益 | 价值变动单季度净收益 | 扣除非经常损益后的单季度净利润 | 每股收益(单季度) | 销售净利率(单季度) | 销售毛利率(单季度) | 销售期间费用率(单季度) | 净资产收益率(单季度) | 净资产单季度收益率(扣除非经常损益) | 总资产净利润(单季度) | 基本每股收益同比增长率(%) | 稀释每股收益同比增长率(%) | 每股经营活动产生的现金流量净额同比增长率(%) | 营业利润同比增长率(%) | 利润总额同比增长率(%) | 归属母公司股东的净利润同比增长率(%) | 归属母公司股东的净利润-扣除非经常损益同比增长率(%) | 经营活动产生的现金流量净额同比增长率(%) | 净资产收益率(摊薄)同比增长率(%) | 每股净资产相对年初增长率(%) | 资产总计相对年初增长率(%) | 归属母公司的股东权益相对年初增长率(%) | 营业总收入同比增长率(%) | 营业收入同比增长率(%) | 净资产同比增长率 | 净利润/营业总收入 | 销售费用/营业总收入 | 管理费用/营业总收入 | 财务费用/营业总收入 | 资产减值损失/营业总收入 | 营业总成本/营业总收入 | 营业利润/营业总收入 | 息税前利润/营业总收入 | 经营活动净收益/利润总额 | 价值变动净收益/利润总额 | 营业外收支净额/利润总额 | 所得税/利润总额 | 扣除非经常损益后的净利润/净利润 | 销售商品提供劳务收到的现金/营业收入 | 经营活动产生的现金流量净额/营业收入 | 经营活动产生的现金流量净额/经营活动净收益 | 资本支出/折旧和摊销 | 经营活动产生的现金流量净额/负债合计 | 经营活动产生的现金流量净额/带息债务 | 经营活动产生的现金流量净额/净债务 | 长期债务与营运资金比率 | 息税折旧摊销前利润/负债合计 | 营业利润/利润总额 | 非营业利润/利润总额 | 经营活动产生的现金流量净额/营业利润 | 货币资金/流动负债 | 货币资金/带息流动负债 | 营业利润/流动负债 | 营业利润/负债合计 | 利润总额/营业收入 | 年化净资产收益率 | 年化总资产报酬率 | 年化总资产净利率 | 年化投入资本回报率 | 平均净资产收益率(增发条件) | 营业总收入同比增长率(%)(单季度) | 营业总收入环比增长率(%)(单季度) | 营业收入同比增长率(%)(单季度) | 营业收入环比增长率(%)(单季度) | 营业利润同比增长率(%)(单季度) | 营业利润环比增长率(%)(单季度) | 净利润同比增长率(%)(单季度) | 净利润环比增长率(%)(单季度) | 归属母公司股东的净利润同比增长率(%)(单季度) | 归属母公司股东的净利润环比增长率(%)(单季度) | 净利润/营业总收入(单季度) | 销售费用/营业总收入 (单季度) | 管理费用/营业总收入 (单季度) | 财务费用/营业总收入 (单季度) | 资产减值损失/营业总收入(单季度) | 营业总成本/营业总收入 (单季度) | 营业利润/营业总收入(单季度) | 经营活动净收益/利润总额(单季度) | 价值变动净收益/利润总额(单季度) | 扣除非经常损益后的净利润/净利润(单季度) | 销售商品提供劳务收到的现金/营业收入(单季度) | 经营活动产生的现金流量净额/营业收入(单季度) | 经营活动产生的现金流量净额/经营活动净收益(单季度) | | ------------|------------|---------|------------------|------------------|---------------------|------------------|------------------|------------------|---------------------|------------------------|---------------|---------------------------------------------|------------------|------------------------|---------------------|------------------------------|------------------------------|------------------|---------------------------------------|------|---------------------|---------------------|------------|---------------|---------------|---------------------------|------------------------|------------------------|------------|------------------|---------------------------------|---------------|------------------|---------------------|------------|---------|------------|------------|------------------|------------------|------------|------------|------------|------------------|---------------|------------|--------------------------|------------|----------------------------------------------|----------------------------------------------------|------------------|------------------|------------------------|---------------|---------------------|---------------------|---------------------|------------------|------------|---------------|---------------|---------------|---------------------|------------------|------------------------------|-----------------------------------------|------------------|------------------|---------------------|--------------------------------|----------------------|-------------------------|----------------------|-------------------------------|----------------------------------------------------|-------------------------|----------------------------|-------------------------|------------------------------|------------------------------|---------------------------------------------|-----------------------|--------------------------|--------------------------|--------------------------------|-----------------------------|--------------------------------------------------|-----------------------------|------------------------------------|------------------------------------|---------------------------------------------------------------|------------------------------|------------------------------|---------------------------------------------------|-------------------------------------------------------------------------|---------------------------------------------------------|--------------------------------------------|---------------------------------------|------------------------------------|------------------------------------------------------|---------------------------------|------------------------------|------------------------|-------------------------|----------------------------|----------------------------|----------------------------|----------------------------------|-------------------------------|----------------------------|-------------------------------|----------------------------------|----------------------------------|----------------------------------|----------------------|----------------------------------------------|----------------------------------------------------|----------------------------------------------------|-------------------------------------------------------------|----------------------------|----------------------------------------------------|----------------------------------------------------|-------------------------------------------------|---------------------------------|----------------------------------------|---------------------------|------------------------------|------------------------------------------------------|---------------------------|---------------------------------|---------------------------|---------------------------|---------------------------|------------------------|------------------------|------------------------|---------------------------|--------------------------------------|--------------------------------------------|--------------------------------------------|-----------------------------------------|-----------------------------------------|-----------------------------------------|-----------------------------------------|--------------------------------------|--------------------------------------|--------------------------------------------------------------|--------------------------------------------------------------|--------------------------------------|------------------------------------------|------------------------------------------|------------------------------------------|-----------------------------------------------|---------------------------------------------|-----------------------------------------|-----------------------------------------------|-----------------------------------------------|-----------------------------------------------------------|-----------------------------------------------------------------|-----------------------------------------------------------------|--------------------------------------------------------------------------| | 20250930 | | 20250930 | -1.00 | -1.00 | 95.64 | 95.64 | 13.79 | 0.51 | 44.26 | 14.25 | 63.10 | 19.61 | 44.78 | 11.98 | 21.36 | -1.00 | -1.00 | -1.00 | -1.00 | 63383087733.00 | 46803448986.00 | 9284393989.00 | 1129657053.00 | -1.00 | 56775238527.00 | -1.00 | -1.00 | -1.00 | -1.00 | 151657889264.00 | 58224687938.00 | -817429439.00 | 60557447874.00 | 25620257470.00 | 169862882009.00 | 101770809487.00 | 78767242284.00 | 23509664219.00 | 12740572930.00 | 396829863999.00 | 119008338610.00 | 1.20 | 0.92 | 0.75 | 53.01 | 2.13 | 2.85 | 1.13 | 0.66 | 0.44 | 32.23 | 48.45 | 7.60 | 5.57 | 35.51 | 2.12 | 2.54 | 0.58 | 56.06 | 1.79 | 17.98 | 24.93 | 75.07 | 4.10 | 24.50 | -1.00 | -1.00 | 12.91 | 10.39 | 12.89 | 8.61 | 29.27 | 70.73 | 16.31 | 42.80 | 42.67 | 46.04 | 53.96 | 0.31 | 17174557354.00 | 4044913865.00 | -1.00 | 5.48 | 19.72 | 27.23 | 4.45 | 9.36 | -1.00 | 3.70 | 54.39% | 52.24% | 1343.09% | 57.51% | 57.52% | 55.45% | -1.00% | 44.31% | 23.18% | 1113.69% | 21.78% | 21.12% | 10.33% | 10.33% | -1.00% | 17.98 | 0.23 | 3.17 | 0.69 | -0.04 | 81.59 | 22.21 | 22.33 | 84.11 | 16.68 | 0.15 | 17.87 | -1.00 | 1.09 | 0.20 | 1.11 | -1.00 | 0.20 | 0.31 | 0.51 | 5.88 | -1.00 | 101.47 | -1.47 | 92.29 | 0.58 | 1.19 | 0.48 | 0.22 | 21.89 | 32.67 | 17.21 | 13.85 | 17.18 | -1.00 | 8.14% | -2.58% | 8.14% | -2.58% | 54.09% | 7.03% | 52.25% | 5.41% | 57.14% | 11.02% | 19.72 | 0.23 | 3.54 | 0.68 | -0.09 | 80.14 | 24.70 | 81.21 | 19.13 | -1.00 | 108.17 | 26.91 | 135.53 |