diff --git a/.dockerignore b/.dockerignore index 0ba4256..dee6183 100644 --- a/.dockerignore +++ b/.dockerignore @@ -14,4 +14,5 @@ reports/ .idea .vscode *.swp -*.swo \ No newline at end of file +*.swo +*.log \ No newline at end of file diff --git a/data.sql b/data.sql index 3deaf09..5505f8d 100644 --- a/data.sql +++ b/data.sql @@ -11,130 +11,12 @@ Target Server Version : 90200 (9.2.0) File Encoding : 65001 - Date: 26/06/2025 11:41:15 + Date: 28/09/2025 14:05:57 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; --- ---------------------------- --- Table structure for eastmoney_rzrq_data --- ---------------------------- -DROP TABLE IF EXISTS `eastmoney_rzrq_data`; -CREATE TABLE `eastmoney_rzrq_data` ( - `trade_date` date NOT NULL, - `index_value` decimal(10, 4) NULL DEFAULT NULL COMMENT '指数', - `change_percent` decimal(10, 4) NULL DEFAULT NULL COMMENT '涨跌幅', - `float_market_value` decimal(20, 2) NULL DEFAULT NULL COMMENT '流通市值', - `change_percent_3d` decimal(10, 4) NULL DEFAULT NULL COMMENT '3日涨跌幅', - `change_percent_5d` decimal(10, 4) NULL DEFAULT NULL COMMENT '5日涨跌幅', - `change_percent_10d` decimal(10, 4) NULL DEFAULT NULL COMMENT '10日涨跌幅', - `financing_balance` decimal(20, 2) NULL DEFAULT NULL COMMENT '融资余额', - `financing_balance_ratio` decimal(10, 4) NULL DEFAULT NULL COMMENT '融资余额占比', - `financing_buy_amount` decimal(20, 2) NULL DEFAULT NULL COMMENT '融资买入额', - `financing_buy_amount_3d` decimal(20, 2) NULL DEFAULT NULL COMMENT '3日融资买入额', - `financing_buy_amount_5d` decimal(20, 2) NULL DEFAULT NULL COMMENT '5日融资买入额', - `financing_buy_amount_10d` decimal(20, 2) NULL DEFAULT NULL COMMENT '10日融资买入额', - `financing_repay_amount` decimal(20, 2) NULL DEFAULT NULL COMMENT '融资偿还额', - `financing_repay_amount_3d` decimal(20, 2) NULL DEFAULT NULL COMMENT '3日融资偿还额', - `financing_repay_amount_5d` decimal(20, 2) NULL DEFAULT NULL COMMENT '5日融资偿还额', - `financing_repay_amount_10d` decimal(20, 2) NULL DEFAULT NULL COMMENT '10日融资偿还额', - `financing_net_amount` decimal(20, 2) NULL DEFAULT NULL COMMENT '融资净额', - `financing_net_amount_3d` decimal(20, 2) NULL DEFAULT NULL COMMENT '3日融资净额', - `financing_net_amount_5d` decimal(20, 2) NULL DEFAULT NULL COMMENT '5日融资净额', - `financing_net_amount_10d` decimal(20, 2) NULL DEFAULT NULL COMMENT '10日融资净额', - `securities_balance` decimal(20, 2) NULL DEFAULT NULL COMMENT '融券余额', - `securities_volume` decimal(20, 2) NULL DEFAULT NULL COMMENT '融券余量', - `securities_repay_volume` decimal(20, 2) NULL DEFAULT NULL COMMENT '融券偿还量', - `securities_repay_volume_3d` decimal(20, 2) NULL DEFAULT NULL COMMENT '3日融券偿还量', - `securities_repay_volume_5d` decimal(20, 2) NULL DEFAULT NULL COMMENT '5日融券偿还量', - `securities_repay_volume_10d` decimal(20, 2) NULL DEFAULT NULL COMMENT '10日融券偿还量', - `securities_sell_volume` decimal(20, 2) NULL DEFAULT NULL COMMENT '融券卖出量', - `securities_sell_volume_3d` decimal(20, 2) NULL DEFAULT NULL COMMENT '3日融券卖出量', - `securities_sell_volume_5d` decimal(20, 2) NULL DEFAULT NULL COMMENT '5日融券卖出量', - `securities_sell_volume_10d` decimal(20, 2) NULL DEFAULT NULL COMMENT '10日融券卖出量', - `securities_net_volume` decimal(20, 2) NULL DEFAULT NULL COMMENT '融券净量', - `securities_net_volume_3d` decimal(20, 2) NULL DEFAULT NULL COMMENT '3日融券净量', - `securities_net_volume_5d` decimal(20, 2) NULL DEFAULT NULL COMMENT '5日融券净量', - `securities_net_volume_10d` decimal(20, 2) NULL DEFAULT NULL COMMENT '10日融券净量', - `total_rzrq_balance` decimal(20, 2) NULL DEFAULT NULL COMMENT '融资融券余额', - `total_rzrq_balance_cz` decimal(20, 2) NULL DEFAULT NULL COMMENT '融资融券余额差值', - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`trade_date`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '东方财富融资融券数据表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for fear_greed_index --- ---------------------------- -DROP TABLE IF EXISTS `fear_greed_index`; -CREATE TABLE `fear_greed_index` ( - `id` int NOT NULL AUTO_INCREMENT, - `index_value` decimal(5, 2) NOT NULL COMMENT '恐贪指数值(0-100)', - `trading_date` date NOT NULL COMMENT '交易日期', - `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `uk_trading_date`(`trading_date` ASC) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 1003 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '市场恐贪指数数据' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for follow_stock --- ---------------------------- -DROP TABLE IF EXISTS `follow_stock`; -CREATE TABLE `follow_stock` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `stock_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '股票代码', - `stock_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '股票名称', - `add_time` datetime NULL DEFAULT NULL COMMENT '添加时间', - `status` tinyint NULL DEFAULT 1 COMMENT '状态', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `uk_stock_code`(`stock_code` ASC) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 22 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '关注的股票' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for fund_cang --- ---------------------------- -DROP TABLE IF EXISTS `fund_cang`; -CREATE TABLE `fund_cang` ( - `id` int NOT NULL AUTO_INCREMENT, - `fund_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `fund_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `company_money` decimal(20, 2) NULL DEFAULT NULL, - `company_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `company_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `fund_data` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 1874595 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for fundamental_analysis --- ---------------------------- -DROP TABLE IF EXISTS `fundamental_analysis`; -CREATE TABLE `fundamental_analysis` ( - `id` int NOT NULL AUTO_INCREMENT, - `stock_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '股票代码', - `stock_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '股票名称', - `dimension` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分析维度', - `ai_response` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'AI分析结果', - `reasoning_process` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '推理过程', - `references` json NULL COMMENT '参考资料', - `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `extra_info` json NULL COMMENT '扩展信息', - PRIMARY KEY (`id`) USING BTREE, - INDEX `idx_stock_dimension`(`stock_code` ASC, `dimension` ASC) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 12104 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '基本面分析结果表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for gp_category_industry --- ---------------------------- -DROP TABLE IF EXISTS `gp_category_industry`; -CREATE TABLE `gp_category_industry` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT 'id', - `category_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '分类名称', - `belong_industry` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '所属行业', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 52 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; - -- ---------------------------- -- Table structure for gp_code_all -- ---------------------------- @@ -151,58 +33,6 @@ CREATE TABLE `gp_code_all` ( PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 6686 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '所有个股代码-爬取指数用' ROW_FORMAT = Dynamic; --- ---------------------------- --- Table structure for gp_code_hk --- ---------------------------- -DROP TABLE IF EXISTS `gp_code_hk`; -CREATE TABLE `gp_code_hk` ( - `id` int NOT NULL AUTO_INCREMENT, - `gp_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `gp_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `gp_code_two` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `gp_code_three` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `market_cap` decimal(20, 2) NULL DEFAULT NULL, - `mark1` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `mark2` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 2956 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '所有指数代码-爬取数据使用' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for gp_code_zs --- ---------------------------- -DROP TABLE IF EXISTS `gp_code_zs`; -CREATE TABLE `gp_code_zs` ( - `id` int NOT NULL AUTO_INCREMENT, - `gp_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `gp_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `gp_code_two` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `gp_code_three` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `market_cap` decimal(20, 2) NULL DEFAULT NULL, - `mark1` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `mark2` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 6686 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '所有指数代码-爬取数据使用' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for gp_data --- ---------------------------- -DROP TABLE IF EXISTS `gp_data`; -CREATE TABLE `gp_data` ( - `id` int NOT NULL AUTO_INCREMENT, - `pg_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `xiangsidu` decimal(10, 2) NULL DEFAULT NULL COMMENT '控制相似度为多少的时候进行回测 和下面的数字是关联的', - `ii` int NULL DEFAULT NULL COMMENT '相似度的条数', - `raye_ga_hc` decimal(10, 2) NULL DEFAULT NULL COMMENT '回测涨跌幅大于多少的数据', - `huice_function_num` int NULL DEFAULT NULL COMMENT '回测判断胜率方法 0是代表相差1%或者同涨同跌都算胜 1是代表相差1%算胜 2是代表同涨同跌算胜', - `yes_yuce` int NULL DEFAULT NULL, - `no_yuce` int NULL DEFAULT NULL, - `yes_yuce_twoday` int NULL DEFAULT NULL, - `no_yuce_twoday` int NULL DEFAULT NULL, - `yes_yuce_fiveday` int NULL DEFAULT NULL, - `no_yuce_fiveday` int NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 42690 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic; - -- ---------------------------- -- Table structure for gp_day_data -- ---------------------------- @@ -224,26 +54,12 @@ CREATE TABLE `gp_day_data` ( `pe` decimal(10, 2) NULL DEFAULT NULL COMMENT '当前PE', `ps` decimal(10, 2) NULL DEFAULT NULL COMMENT '当前PS', `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `pre_close` decimal(10, 2) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, INDEX `idx_symbol`(`symbol` ASC) USING BTREE, INDEX `idx_timestamp`(`timestamp` ASC) USING BTREE, INDEX `idx_symbol_time`(`symbol` ASC, `timestamp` ASC) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 28356293 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for gp_ex_rights_log --- ---------------------------- -DROP TABLE IF EXISTS `gp_ex_rights_log`; -CREATE TABLE `gp_ex_rights_log` ( - `id` int NOT NULL AUTO_INCREMENT, - `stock_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '股票代码', - `change_date` date NULL DEFAULT NULL COMMENT '除权变动日期', - `before_price` decimal(10, 3) NULL DEFAULT NULL COMMENT '变动前收盘价(数据库中的价格)', - `after_price` decimal(10, 3) NULL DEFAULT NULL COMMENT '变动后收盘价(API获取的价格)', - `update_time` datetime NULL DEFAULT NULL COMMENT '脚本执行的更新时间', - `optimization_flag` int NULL DEFAULT NULL COMMENT '波段优化标志,1为已经完成优化', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 285 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '股票除权日志表' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB AUTO_INCREMENT = 36167913 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for gp_gnbk @@ -255,263 +71,21 @@ CREATE TABLE `gp_gnbk` ( `bk_name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, `gp_code` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, `gp_name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for gp_gnbk_all --- ---------------------------- -DROP TABLE IF EXISTS `gp_gnbk_all`; -CREATE TABLE `gp_gnbk_all` ( - `id` bigint NULL DEFAULT NULL, - `bk_code` bigint NULL DEFAULT NULL, - `bk_name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, - `gp_code` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, - `gp_name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for gp_gnbk_gn --- ---------------------------- -DROP TABLE IF EXISTS `gp_gnbk_gn`; -CREATE TABLE `gp_gnbk_gn` ( - `id` bigint NULL DEFAULT NULL, - `bk_code` bigint NULL DEFAULT NULL, - `bk_name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, - `gp_code` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, - `gp_name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '概念板块' ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for gp_hybk -- ---------------------------- DROP TABLE IF EXISTS `gp_hybk`; CREATE TABLE `gp_hybk` ( - `id` bigint NULL DEFAULT NULL, + `id` bigint NOT NULL AUTO_INCREMENT, `bk_code` bigint NULL DEFAULT NULL, `bk_name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, `gp_code` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, `gp_name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, `Unnamed: 5` double NULL DEFAULT NULL, - `Unnamed: 6` double NULL DEFAULT NULL -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for gp_main_business --- ---------------------------- -DROP TABLE IF EXISTS `gp_main_business`; -CREATE TABLE `gp_main_business` ( - `stock_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '股票代码', - `stock_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '股票简称', - `report_date` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '报告期(YYYYMMDD)', - `product_rank` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '项目排名(1-5)', - `product_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '项目名称', - `revenue` decimal(20, 2) NULL DEFAULT NULL COMMENT '项目收入', - `cost` decimal(20, 2) NULL DEFAULT NULL COMMENT '项目成本', - `profit` decimal(20, 2) NULL DEFAULT NULL COMMENT '项目毛利', - `profit_margin` decimal(10, 4) NULL DEFAULT NULL COMMENT '项目毛利率', - PRIMARY KEY (`stock_code`, `report_date`, `product_rank`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for gp_min_data --- ---------------------------- -DROP TABLE IF EXISTS `gp_min_data`; -CREATE TABLE `gp_min_data` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `symbol` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '个股代码', - `timestamp` timestamp NULL DEFAULT NULL COMMENT '时间戳', - `volume` bigint NULL DEFAULT NULL COMMENT '数量', - `open` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '开始价', - `high` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '最高价', - `low` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '最低价', - `close` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '结束价', - `chg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '变化数值', - `percent` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '变化百分比', - `turnoverrate` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `amount` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '成交金额', + `Unnamed: 6` double NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 61116588 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for gp_product_category --- ---------------------------- -DROP TABLE IF EXISTS `gp_product_category`; -CREATE TABLE `gp_product_category` ( - `id` int NOT NULL AUTO_INCREMENT, - `category_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `product_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `stock_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `stock_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`) USING BTREE, - INDEX `idx_stock_code`(`stock_code` ASC) USING BTREE, - INDEX `idx_product_name`(`product_name` ASC) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 35869 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for gp_zygc --- ---------------------------- -DROP TABLE IF EXISTS `gp_zygc`; -CREATE TABLE `gp_zygc` ( - `id` int NOT NULL AUTO_INCREMENT, - `gp_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '股票名称', - `gp_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '股票代码', - `zygc_xmmc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '主营构成(按行业)-项目名称', - `zygc_xmsr` decimal(20, 0) NULL DEFAULT NULL COMMENT '主营构成(按行业)-项目收入', - `zygc_xmmlr` decimal(10, 2) NULL DEFAULT NULL COMMENT '主营构成(按行业)-项目毛利率', - `belong_time` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '所属财报期', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 12774 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '个股的主营构成' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for gp_zyyw --- ---------------------------- -DROP TABLE IF EXISTS `gp_zyyw`; -CREATE TABLE `gp_zyyw` ( - `id` int NOT NULL AUTO_INCREMENT, - `gp_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '股票名称', - `gp_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '股票代码', - `zyyw_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '主营业务名称', - `zyyw_zb` decimal(10, 2) NULL DEFAULT NULL COMMENT '主营业务占比', - `belong_time` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '所属财报期', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 25280 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '上市公司主营业务占比' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for hk_hot_stocks --- ---------------------------- -DROP TABLE IF EXISTS `hk_hot_stocks`; -CREATE TABLE `hk_hot_stocks` ( - `id` int NOT NULL AUTO_INCREMENT, - `symbol` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, - `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, - `value` int NULL DEFAULT NULL, - `increment` int NULL DEFAULT NULL, - `rank_change` int NULL DEFAULT NULL, - `percent` float NULL DEFAULT NULL, - `current` float NULL DEFAULT NULL, - `chg` float NULL DEFAULT NULL, - `exchange` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, - `stock_type` int NULL DEFAULT NULL, - `add_time` datetime NULL DEFAULT NULL, - `status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 53981 CHARACTER SET = sjis COLLATE = sjis_japanese_ci ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for limitup_analysis_stock_changes --- ---------------------------- -DROP TABLE IF EXISTS `limitup_analysis_stock_changes`; -CREATE TABLE `limitup_analysis_stock_changes` ( - `symbol` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, - `net_profit_cagr` double NULL DEFAULT NULL, - `north_net_inflow` double NULL DEFAULT NULL, - `ps` double NULL DEFAULT NULL, - `type` bigint NULL DEFAULT NULL, - `percent` double NULL DEFAULT NULL, - `has_follow` tinyint(1) NULL DEFAULT NULL, - `tick_size` double NULL DEFAULT NULL, - `pb_ttm` double NULL DEFAULT NULL, - `float_shares` bigint NULL DEFAULT NULL, - `current` double NULL DEFAULT NULL, - `amplitude` double NULL DEFAULT NULL, - `pcf` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, - `current_year_percent` double NULL DEFAULT NULL, - `float_market_capital` double NULL DEFAULT NULL, - `north_net_inflow_time` double NULL DEFAULT NULL, - `market_capital` double NULL DEFAULT NULL, - `dividend_yield` double NULL DEFAULT NULL, - `lot_size` bigint NULL DEFAULT NULL, - `roe_ttm` double NULL DEFAULT NULL, - `total_percent` double NULL DEFAULT NULL, - `percent5m` double NULL DEFAULT NULL, - `income_cagr` double NULL DEFAULT NULL, - `amount` double NULL DEFAULT NULL, - `chg` double NULL DEFAULT NULL, - `issue_date_ts` bigint NULL DEFAULT NULL, - `eps` double NULL DEFAULT NULL, - `main_net_inflows` double NULL DEFAULT NULL, - `volume` bigint NULL DEFAULT NULL, - `volume_ratio` double NULL DEFAULT NULL, - `pb` double NULL DEFAULT NULL, - `followers` bigint NULL DEFAULT NULL, - `turnover_rate` double NULL DEFAULT NULL, - `mapping_quote_current` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, - `first_percent` double NULL DEFAULT NULL, - `name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, - `pe_ttm` double NULL DEFAULT NULL, - `dual_counter_mapping_symbol` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, - `total_shares` bigint NULL DEFAULT NULL, - `limitup_days` bigint NULL DEFAULT NULL, - `id` bigint NULL DEFAULT NULL -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for rzrq_data --- ---------------------------- -DROP TABLE IF EXISTS `rzrq_data`; -CREATE TABLE `rzrq_data` ( - `trade_date` date NOT NULL COMMENT '交易日期', - `sh_financing_balance` decimal(12, 2) NULL DEFAULT NULL COMMENT '上海融资余额(亿元)', - `sz_financing_balance` decimal(12, 2) NULL DEFAULT NULL COMMENT '深圳融资余额(亿元)', - `bj_financing_balance` decimal(12, 2) NULL DEFAULT NULL COMMENT '北京融资余额(亿元)', - `total_financing_balance` decimal(12, 2) NULL DEFAULT NULL COMMENT '融资余额合计(亿元)', - `sh_financing_buy` decimal(12, 2) NULL DEFAULT NULL COMMENT '上海融资买入额(亿元)', - `sz_financing_buy` decimal(12, 2) NULL DEFAULT NULL COMMENT '深圳融资买入额(亿元)', - `bj_financing_buy` decimal(12, 2) NULL DEFAULT NULL COMMENT '北京融资买入额(亿元)', - `total_financing_buy` decimal(12, 2) NULL DEFAULT NULL COMMENT '融资买入额合计(亿元)', - `sh_securities_balance` decimal(12, 2) NULL DEFAULT NULL COMMENT '上海融券余量余额(亿元)', - `sz_securities_balance` decimal(12, 2) NULL DEFAULT NULL COMMENT '深圳融券余量余额(亿元)', - `bj_securities_balance` decimal(12, 2) NULL DEFAULT NULL COMMENT '北京融券余量余额(亿元)', - `total_securities_balance` decimal(12, 2) NULL DEFAULT NULL COMMENT '融券余量余额合计(亿元)', - `sh_rzrq_balance` decimal(12, 2) NULL DEFAULT NULL COMMENT '上海融资融券余额(亿元)', - `sz_rzrq_balance` decimal(12, 2) NULL DEFAULT NULL COMMENT '深圳融资融券余额(亿元)', - `bj_rzrq_balance` decimal(12, 2) NULL DEFAULT NULL COMMENT '北京融资融券余额(亿元)', - `total_rzrq_balance` decimal(12, 2) NULL DEFAULT NULL COMMENT '融资融券余额合计(亿元)', - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`trade_date`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '融资融券数据表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for stock_price_changes --- ---------------------------- -DROP TABLE IF EXISTS `stock_price_changes`; -CREATE TABLE `stock_price_changes` ( - `symbol` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, - `name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, - `current` double NULL DEFAULT NULL, - `percent` double NULL DEFAULT NULL, - `time_mark` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, - `add_time` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; - --- ---------------------------- --- Table structure for stock_price_data --- ---------------------------- -DROP TABLE IF EXISTS `stock_price_data`; -CREATE TABLE `stock_price_data` ( - `stock_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '股票代码', - `stock_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '股票名称', - `latest_price` decimal(10, 2) NULL DEFAULT NULL COMMENT '最新价', - `change_percent` decimal(10, 2) NULL DEFAULT NULL COMMENT '涨跌幅', - `change_amount` decimal(10, 2) NULL DEFAULT NULL COMMENT '涨跌额', - `volume` bigint NULL DEFAULT NULL COMMENT '成交量(手)', - `amount` decimal(20, 2) NULL DEFAULT NULL COMMENT '成交额', - `amplitude` decimal(10, 2) NULL DEFAULT NULL COMMENT '振幅', - `turnover_rate` decimal(10, 2) NULL DEFAULT NULL COMMENT '换手率', - `pe_ratio` decimal(10, 2) NULL DEFAULT NULL COMMENT '市盈率', - `high_price` decimal(10, 2) NULL DEFAULT NULL COMMENT '最高价', - `low_price` decimal(10, 2) NULL DEFAULT NULL COMMENT '最低价', - `open_price` decimal(10, 2) NULL DEFAULT NULL COMMENT '开盘价', - `pre_close` decimal(10, 2) NULL DEFAULT NULL COMMENT '昨收价', - `total_market_value` decimal(20, 2) NULL DEFAULT NULL COMMENT '总市值', - `float_market_value` decimal(20, 2) NULL DEFAULT NULL COMMENT '流通市值', - `pb_ratio` decimal(10, 2) NULL DEFAULT NULL COMMENT '市净率', - `list_date` date NULL DEFAULT NULL COMMENT '上市日期', - `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`stock_code`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '实时股价数据表' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 8331 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '行业板块' ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; diff --git a/requirements.txt b/requirements.txt index 093a6d6..23163dd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,4 +19,6 @@ pandas==2.2.3 apscheduler==3.11.0 pymongo==4.13.0 scikit-learn==1.6.1 -dbutils==3.1.2 \ No newline at end of file +dbutils==3.1.2 +pyyaml==6.0.3 +xtquant==250516.1.1 \ No newline at end of file diff --git a/src/QMT/config.yaml b/src/QMT/config.yaml index 345792c..9ad093d 100644 --- a/src/QMT/config.yaml +++ b/src/QMT/config.yaml @@ -1,11 +1,11 @@ # QMT交易配置 qmt_config: # 客户端路径 - client_path: "D:\\SoftwareCenter\\中金财富QMT个人版模拟交易端38421\\userdata_mini" + client_path: "D:\\SoftwareCenter\\中金财富QMT个人版交易端\\userdata_mini" # 账户配置 account: - account_id: "10839603" # 资金账号 + account_id: "79355243" # 资金账号 account_type: "STOCK" # 账号类型:STOCK(股票) CREDIT(信用) FUTURE(期货) # 数据库配置 diff --git a/src/QMT/database_manager.py b/src/QMT/database_manager.py index b987163..25d206e 100644 --- a/src/QMT/database_manager.py +++ b/src/QMT/database_manager.py @@ -124,7 +124,7 @@ class DatabaseManager: 'buy_amount': float(buy_amount), 'trading_version': int(tver or 0) } - self.logger.info(f"加载买入计划: {len(buy_plans)}个") + # self.logger.info(f"加载买入计划: {len(buy_plans)}个") return buy_plans except Exception as e: self.logger.error(f"获取买入计划失败: {str(e)}") @@ -154,7 +154,7 @@ class DatabaseManager: 'sell_quantity': sell_quantity, 'trading_version': int(tver or 0) } - self.logger.info(f"加载卖出计划: {len(sell_plans)}个") + # self.logger.info(f"加载卖出计划: {len(sell_plans)}个") return sell_plans except Exception as e: self.logger.error(f"获取卖出计划失败: {str(e)}") diff --git a/src/QMT/main.py b/src/QMT/main.py index 06e54b3..e3da02b 100644 --- a/src/QMT/main.py +++ b/src/QMT/main.py @@ -10,7 +10,9 @@ from xtquant.xttype import StockAccount # 导入自定义模块 from config_loader import get_qmt_config, get_logging_config, get_strategy_config -from strategy import load_initial_positions, create_buy_strategy_callback, create_sell_strategy_callback, start_account_funds_monitor, start_reconciliation_monitor, start_position_snapshot_monitor +from strategy import load_initial_positions, create_buy_strategy_callback, create_sell_strategy_callback, \ + start_account_funds_monitor, start_reconciliation_monitor, start_position_snapshot_monitor, \ + refresh_positions_snapshot from redis_state_manager import RedisStateManager from database_manager import DatabaseManager, close_pool from trader_callback import MyXtQuantTraderCallback @@ -97,7 +99,7 @@ if __name__ == '__main__': sell_plans = rsm.get_all_sell_plans() logger.info(f"买入计划数量(Redis): {len(buy_plans)}") logger.info(f"卖出计划数量(Redis): {len(sell_plans)}") - logger.info(f"每只股票买入金额: {buy_amount}元") + # logger.info(f"每只股票买入金额: {buy_amount}元") logger.info("="*50) # 显示买入计划 @@ -183,7 +185,6 @@ if __name__ == '__main__': # 启动每10分钟持仓快照覆盖更新线程(只更新DB,不叠加) start_position_snapshot_monitor(xt_trader, acc, logger, interval_seconds=600) - # 下载股票数据 xtdata.download_sector_data() @@ -194,26 +195,32 @@ if __name__ == '__main__': sell_strategy_callback = create_sell_strategy_callback(xt_trader, acc, logger) # 订阅买卖计划中的股票行情(基于Redis) + subscription_ids = {} # 统一管理所有订阅ID + if buy_plans: buy_code_list = list(buy_plans.keys()) logger.info(f"开始订阅 {len(buy_code_list)} 只买入股票的行情...") for code in buy_code_list: - xtdata.subscribe_quote(code, '1m', callback=buy_strategy_callback) - logger.info(f"已订阅买入 {code} ({buy_plans[code].get('stock_name','')}) 行情") + sub_id = xtdata.subscribe_quote(code, '1d', callback=buy_strategy_callback) + subscription_ids[code] = sub_id + logger.info(f"已订阅买入 {code} ({buy_plans[code].get('stock_name','')}) 行情,订阅ID: {sub_id}") if sell_plans: sell_code_list = list(sell_plans.keys()) logger.info(f"开始订阅 {len(sell_code_list)} 只卖出股票的行情...") for code in sell_code_list: - xtdata.subscribe_quote(code, '1m', callback=sell_strategy_callback) - logger.info(f"已订阅卖出 {code} ({sell_plans[code].get('stock_name','')}) 行情") + sub_id = xtdata.subscribe_quote(code, '1d', callback=sell_strategy_callback) + subscription_ids[code] = sub_id + logger.info(f"已订阅卖出 {code} ({sell_plans[code].get('stock_name','')}) 行情,订阅ID: {sub_id}") # 计划同步线程:每60秒从MySQL同步到Redis,并直接更新订阅(不再分线程管理订阅) import threading, time def plan_sync_worker(): interval = 60 # 固定60秒同步一次 # 当前已订阅集合 - subscribed_buy = set(buy_plans.keys()) - subscribed_sell = set(sell_plans.keys()) + subscribed_codes = set(subscription_ids.keys()) + # 存储订阅ID的字典,初始化为初始订阅ID + current_subscription_ids = subscription_ids.copy() + while True: try: time.sleep(interval) @@ -262,25 +269,28 @@ if __name__ == '__main__': for code in del_sell: rsm.del_sell_plan(code) # 直接同步订阅(差分) - new_buy_sub = latest_buy_codes - new_sell_sub = latest_sell_codes - # 买入订阅差分 - for code in new_buy_sub - subscribed_buy: - xtdata.subscribe_quote(code, '1m', callback=buy_strategy_callback) - logger.info(f"[订阅新增-买入] {code}") - for code in subscribed_buy - new_buy_sub: - xtdata.unsubscribe_quote(code) - logger.info(f"[取消订阅-买入] {code}") - # 卖出订阅差分 - for code in new_sell_sub - subscribed_sell: - xtdata.subscribe_quote(code, '1m', callback=sell_strategy_callback) - logger.info(f"[订阅新增-卖出] {code}") - for code in subscribed_sell - new_sell_sub: - xtdata.unsubscribe_quote(code) - logger.info(f"[取消订阅-卖出] {code}") - subscribed_buy = new_buy_sub - subscribed_sell = new_sell_sub - logger.info("计划同步与订阅更新完成") + new_codes = latest_buy_codes | latest_sell_codes + + # 新增订阅 + for code in new_codes - subscribed_codes: + # 判断是买入还是卖出计划 + if code in latest_buy_codes: + sub_id = xtdata.subscribe_quote(code, '1d', callback=buy_strategy_callback) + logger.info(f"[订阅新增-买入] {code},订阅ID: {sub_id}") + else: + sub_id = xtdata.subscribe_quote(code, '1d', callback=sell_strategy_callback) + logger.info(f"[订阅新增-卖出] {code},订阅ID: {sub_id}") + current_subscription_ids[code] = sub_id + + # 取消订阅 + for code in subscribed_codes - new_codes: + if code in current_subscription_ids: + xtdata.unsubscribe_quote(current_subscription_ids[code]) + del current_subscription_ids[code] + logger.info(f"[取消订阅] {code}") + + subscribed_codes = new_codes + # logger.info("计划同步与订阅更新完成") except Exception as e: logger.warning(f"计划同步线程异常: {str(e)}") diff --git a/src/QMT/strategy.py b/src/QMT/strategy.py index b3e28d1..2a3b411 100644 --- a/src/QMT/strategy.py +++ b/src/QMT/strategy.py @@ -273,7 +273,7 @@ def create_buy_strategy_callback(xt_trader, acc, buy_amount, logger): xtconstant.STOCK_BUY, buy_volume, xtconstant.FIX_PRICE, - target_price, + current_price, 'auto_buy_strategy', order_id ) @@ -282,6 +282,7 @@ def create_buy_strategy_callback(xt_trader, acc, buy_amount, logger): add_pending_order(stock_code, order_id, buy_volume, current_price, target_price, 'buy', logger) logger.info(f"已提交买入订单: {stock_code} {buy_volume}股,价格{target_price},订单ID: {order_id}") + update_account_funds_periodically(xt_trader, acc, logger) else: logger.warning(f"买入数量计算为0,跳过 {stock_code}") else: @@ -375,6 +376,7 @@ def create_sell_strategy_callback(xt_trader, acc, logger): add_pending_order(stock_code, order_id, sell_volume, current_price, target_price, 'sell', logger) logger.info(f"已提交卖出订单: {stock_code} {sell_volume}股,价格{target_price},订单ID: {order_id}") + update_account_funds_periodically(xt_trader, acc, logger) else: logger.warning(f"卖出数量为0,跳过 {stock_code}") else: @@ -544,32 +546,46 @@ def refresh_positions_snapshot(xt_trader, acc, logger): try: code = pos.stock_code # 获取持仓基本信息 - total_qty = int(getattr(pos, 'm_nVolume', 0) or 0) - available_qty = int(getattr(pos, 'm_nCanUseVolume', 0) or 0) - frozen_qty = max(0, total_qty - available_qty) # 冻结数量 = 总数量 - 可用数量 - - # 获取价格和市值信息 - cost_price = float(getattr(pos, 'm_dOpenPrice', 0.0) or 0.0) - market_price = float(getattr(pos, 'm_dLastPrice', 0.0) or 0.0) - market_value = float(getattr(pos, 'm_dInstrumentValue', 0.0) or 0.0) - - # 获取盈亏信息 - profit_loss = float(getattr(pos, 'm_dPositionProfit', 0.0) or 0.0) - position_cost = float(getattr(pos, 'm_dPositionCost', 0.0) or 0.0) - - # 计算盈亏比例 + total_qty = int(getattr(pos, 'volume', 0)) # 使用 'volume' 或 'm_nVolume' + available_qty = int(getattr(pos, 'can_use_volume', 0)) # 使用 'can_use_volume' 或 'm_nCanUseVolume' + + # 直接使用API返回的冻结数量字段,这比自己计算更准确 + frozen_qty = int(getattr(pos, 'frozen_volume', 0)) # 使用 'frozen_volume' 或 'm_nFrozenVolume' + + # 如果总持仓为0,则没有处理的必要,直接跳过 + if total_qty == 0: + continue + + # 2. 获取价格和市值信息 + cost_price = float(getattr(pos, 'avg_price', 0.0)) # 使用 'avg_price' 或 'm_dAvgPrice' + market_value = float(getattr(pos, 'market_value', 0.0)) # 使用 'market_value' 或 'm_dMarketValue' + + # 3. 根据现有字段计算缺失的信息 + + # 计算市价 (Market Price) + # 正如您所说,通过 市值 / 总数量 来计算,并处理总数量为0的情况 + market_price = market_value / total_qty if total_qty > 0 else 0.0 + + # 计算持仓成本 (Position Cost) + position_cost = cost_price * total_qty + + # 计算持仓盈亏 (Profit/Loss) + # 盈亏 = 总市值 - 总成本 + profit_loss = market_value - position_cost + + # 计算盈亏比例 (Profit/Loss Ratio) if position_cost > 0: profit_loss_ratio = (profit_loss / position_cost) * 100 else: - profit_loss_ratio = 0.0 + profit_loss_ratio = 0.0 # 如果成本为0,则盈亏比例也为0 - if total_qty > 0: - dbm.upsert_position_snapshot( - code, total_qty, available_qty, frozen_qty, - cost_price, market_price, market_value, - profit_loss, profit_loss_ratio - ) - valid_codes.append(code) + # if total_qty > 0: + dbm.upsert_position_snapshot( + code, total_qty, available_qty, frozen_qty, + cost_price, market_price, market_value, + profit_loss, profit_loss_ratio + ) + valid_codes.append(code) except Exception as e: logger.warning(f"处理持仓记录失败 {getattr(pos, 'stock_code', 'unknown')}: {e}") continue diff --git a/src/quantitative_analysis/us_batch_stock_price_collector.py b/src/quantitative_analysis/us_batch_stock_price_collector.py index 8379b9c..7f85e71 100644 --- a/src/quantitative_analysis/us_batch_stock_price_collector.py +++ b/src/quantitative_analysis/us_batch_stock_price_collector.py @@ -295,3 +295,6 @@ if __name__ == '__main__': + + + diff --git a/src/scripts/config.py b/src/scripts/config.py index 400fc39..32d5bde 100644 --- a/src/scripts/config.py +++ b/src/scripts/config.py @@ -11,7 +11,7 @@ XUEQIU_HEADERS = { 'Accept-Encoding': 'gzip, deflate, br, zstd', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Client-Version': 'v2.44.75', - 'Cookie': 'cookiesu=811743062689927; device_id=33fa3c7fca4a65f8f4354e10ed6b7470; smidV2=20250327160437f244626e8b47ca2a7992f30f389e4e790074ae48656a22f10; HMACCOUNT=8B64A2E3C307C8C0; s=c611ttmqlj; xq_is_login=1; u=8493411634; bid=4065a77ca57a69c83405d6e591ab5449_m8r2nhs8; __utma=1.434320573.1747189698.1747189698.1747189698.1; __utmc=1; __utmz=1.1747189698.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); snbim_minify=true; _c_WBKFRo=dsWgHR8i8KGPbIyhFlN51PHOzVuuNytvUAFppfkD; _nb_ioWEgULi=; aliyungf_tc=00c6b999835b16cea9e4a6aab36cca373a0976bf55ee74770d11f421f7119ad8; Hm_lvt_1db88642e346389874251b5a1eded6e3=1757464900; xq_a_token=0c9cfffc3d713428b4759d3c4e11fff91b618525; xqat=0c9cfffc3d713428b4759d3c4e11fff91b618525; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOjg0OTM0MTE2MzQsImlzcyI6InVjIiwiZXhwIjoxNzYxNTYzMTU1LCJjdG0iOjE3NTg5NzExNTUyODksImNpZCI6ImQ5ZDBuNEFadXAifQ.KotT161D0bQF-m3HNgQFTknHqUpMUR_KWY7BAjiLKOaQocVghM85sCKUretUK5OpMDXMzGPhzxTWMs4VhGxKUHxHSu3inrbCw7rgGDtK0Lnr_6OXHkEMwDadN37V3AYbxKWaX609pACLK1q2cvRmGg94wAgj9KEqu76gdV4w4tRv4LupUJQgYb6M0GEVe7ejLs2_CdV5PV7j0PSjTtpjaeZWkc9YhW32vOyA6gg3fU9S4BQg7qgciYLI8AxiU-GYgFLyFSK2S7nvAngz8TEhNoQcClKrD4NeqqSj2nA5bh5_5FM8AbdbKGw6K8eIO0wkxCV2iUWBDMz-h160cX0GLw; xq_r_token=e586d0abb8de83a22a5d66be2f908954a50005b2; .thumbcache_f24b8bbe5a5934237bbc0eda20c1b6e7=nGvY6/KwbtfD3HgPBzY+S0khnrVCqr4mPyfsZ27X+GjYcRWS61PMogABu5uvj/LAd4TJsSFQiYwdEepZMxwg3A%3D%3D; ssxmod_itna=1-iqmxyQG=KWqGqwD4qeqY5Lor=G2zDuDBP01DpxYK0CDmxjKideDUDtTxR3R27rQA04D7777mqqeCQ_4D/A0ieDZDGKQDqx0or0KBiBUPehSmRxdW9gTBThssUUo8vG8FV4x9WCL5ZG9emiTjxIx_D0aDmKDUx4x_BAYDeWFDCeDQxirDD4DAmPDFxibDimAb4DdkK8EvUOpIDGrDlKDRchok4GWDiPD76gDl6gpbDDCDiyjKV3Dixiaz3eDBomc41iI4xi3kb8_c8b5Yq4EWi2ID7v3DlPqjdnIKy/M4E3Eps/9=agju40ODG6CofPchOBoFO3o6=rlwIlqrDKpY4Kleiix57xhx_eQDrWD57IpDx54_xmmZ7hpY21Bb0nQi/AO4b3mDrnNDt0=a0q345Bi5Drhl54nmeYnAD_mmD_GWq7h1iGq7YzGxA8DqBD=4nz7xNImYnb47xxD; ssxmod_itna2=1-iqmxyQG=KWqGqwD4qeqY5Lor=G2zDuDBP01DpxYK0CDmxjKideDUDtTxR3R27rQA04D7777mqqeCQ4DW_QRiAwxKA07vi3WDj4pxkh3pfaDlxTMHwkxxRl_UFFyKFmUR1v7kCiqQHALxyxuseYn8Q79bLg08eBKxkZwGFEy8ZxTGW7YkIrrzM=5YCx_Gem5Qg2HvQz9AhR0FvxfOG7AQwzoPjSpGmtApnKdwC4uUuzI6eDo2Bedxmf8L2fgms1KnurZO0K=m0ifvg8yDYb=qs=GimaBFojOsWf01ibDy6ZP5DLpur3mS//PdQPR0PqEEqiKseLxQQ3iKiC3ijQ5zKLELcAULPdKD6Q86ejjQKAk6K3leiePYGxdGpYpDbO3YPKa_x4RPTxTif5T3mOIGa8TCY44Y4hWn1AQq7G1nDQ7GQ7D5BDxzWw8bz3D; is_overseas=0; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1759979780', + 'Cookie': 'cookiesu=811743062689927; device_id=33fa3c7fca4a65f8f4354e10ed6b7470; smidV2=20250327160437f244626e8b47ca2a7992f30f389e4e790074ae48656a22f10; HMACCOUNT=8B64A2E3C307C8C0; s=c611ttmqlj; xq_is_login=1; u=8493411634; bid=4065a77ca57a69c83405d6e591ab5449_m8r2nhs8; __utma=1.434320573.1747189698.1747189698.1747189698.1; __utmc=1; __utmz=1.1747189698.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); snbim_minify=true; _c_WBKFRo=dsWgHR8i8KGPbIyhFlN51PHOzVuuNytvUAFppfkD; _nb_ioWEgULi=; aliyungf_tc=00c6b999835b16cea9e4a6aab36cca373a0976bf55ee74770d11f421f7119ad8; Hm_lvt_1db88642e346389874251b5a1eded6e3=1760079937; .thumbcache_f24b8bbe5a5934237bbc0eda20c1b6e7=cL1C7SjsshX5JK0Re7ihF6dZxxNiOAPyX1snDwPjwIcOT4loJZk0lvOmuGrSePCN89PG5UQYB5CVV6XtcSAIMw%3D%3D; xq_a_token=716a8b0d84aecdccf652cf125bfe9733d3a66c6e; xqat=716a8b0d84aecdccf652cf125bfe9733d3a66c6e; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOjg0OTM0MTE2MzQsImlzcyI6InVjIiwiZXhwIjoxNzYyOTEyMjgyLCJjdG0iOjE3NjAzMjAyODI0MzEsImNpZCI6ImQ5ZDBuNEFadXAifQ.cFoUZrJkZMr55bCXCQpoPsTfLpyU6Es3ieEgNLwCsSd_ty3jysDF8eVjaZCXo9u0qcl15kK2tb1KYaA2_cqpFOhhfBBE6WvHIaMtzp8EWW5LhCuCfX0cGgsqua9hsE6HLCIxAM7ZUzYvR_bm-tRJWkVUrKFyyoTLn6NVSyub8eya2y9Dpd0B3n-FbDUbuRs6QIVNOVnE8OlGsBXHUOdMTo2s1-PGzZ3Qaw-LwBR3hkCBLZzeIkpGllESWATfNQ0xgOtRXwG-HO189JqmdEtEEpXiu1aXvvOerNuCxJpY-1QHS7UNYrUy6u36bz6xKVzcXnfrTn_aannNoTGDuMldEg; xq_r_token=eec2f02f63dc672682f60584946e2e697f19d846; acw_tc=b65cfd2717603418882762100e56b805ecd396f75d259a0af2bbedda624afd; is_overseas=0; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1760342262; ssxmod_itna=1-iqmxyQG=KWqGqwD4qeqY5Lor=G2zDuDBP01DpxYK0CDmxjKideDUDtTxR3RpDDq7x4/K07np1DBw4qrDnqD80DQeDvexkGwzMFnw2b33N7hRtdeSEjvFpvTVc4RnEXGF=MSnVriUCrKexGLDY=DCqe4exrrDYYfDBYD74G_DDeDih3Dj4GmDGYtOeDFfCuNq6R5=xDwDB=DmLqTfeDEDG3D0fRxFLv3wW4DGqDS8=BWxD3Df4uzDDXz_UvqIj5DbEbN5laTS77ilm43feDMWxGX7BCsqK1cMhWNxHCLrS2FkPGuDG6Ogj0tQqQO3i2YLo44QDmmirjP4BDr0DpD43BDd0dimGxY_4BD3liiDxe4eqiD3nqdBDwn010bm2R6jpxjAMEX/aEVPirDr7eIgnv6lpz7GAOGT9bzlwGmDT/0Y_x=FRY0b47xxD; ssxmod_itna2=1-iqmxyQG=KWqGqwD4qeqY5Lor=G2zDuDBP01DpxYK0CDmxjKideDUDtTxR3RpDDq7x4/K07nPrDGbWNrdkSmoT3Mnld744WYBD8yz4D', 'Referer': 'https://weibo.com/u/7735765253', 'Sec-Ch-Ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122"', 'Sec-Ch-Ua-Mobile': '?0',