This commit is contained in:
满脸小星星 2025-10-22 13:39:33 +08:00
parent 8203b5dd74
commit f6682be833
9 changed files with 97 additions and 491 deletions

View File

@ -14,4 +14,5 @@ reports/
.idea
.vscode
*.swp
*.swo
*.swo
*.log

440
data.sql
View File

@ -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;

View File

@ -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
dbutils==3.1.2
pyyaml==6.0.3
xtquant==250516.1.1

View File

@ -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(期货)
# 数据库配置

View File

@ -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)}")

View File

@ -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)}")

View File

@ -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

View File

@ -295,3 +295,6 @@ if __name__ == '__main__':

View File

@ -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',