目录
一、概述
搭建个人金融系统,主要作用是拥有自己的金融数据库,能从互联网同步公开的数据到个人数据库,用于个人的研究和学习。
系统搭建步骤,首先搭建数据库,然后选择合适的数据同步平台将数据同步到自己的数据库,最后中现有数据库的基础上开发个人应用功能,如股市分析、基金分析等等。
后续可以利用数据库的数据搭建一个AI知识应用。可能会用到ChatGLM或Qwen2等
二、数据库选型
对于个人系统来说,从这几个方面考虑数据库选型:便捷、性能、可扩展性、安全性和总体成本。另外,金融系统后续涉及AI相关功能,在AI相关产品中对linux环境的兼容性比较好,所以我们还要考虑数据库在linux环境中能稳定运行。
那么从比较通用的几个数据库Microsoft SQL Server、Oracle Database、MySQL、PostgreSQL 和 SQLite来对比并做出选择。
Microsoft SQL Server
优点:
- 强大的企业级功能,包括高级安全特性、商业智能工具和集成的服务总线。
- 主要针对 Windows 平台支撑较好。
- 高度的可扩展性和稳定性,适合大型企业级应用程序。
- 提供了丰富的工具集,如SQL Server Management Studio和Integration Services。
- 具有较好的性能和事务处理能力。
缺点:
- 许可成本较高,对于小型应用不适用。
- 在 Linux 和 macOS 上的功能支持可能不如在 Windows 上全面。
- 成本相对较高。
Oracle Database
优点:
- 行业领先的性能和可扩展性,适合处理大量数据和高并发请求。
- 强大的安全性和容错机制,如Real Application Clusters (RAC)。
- 提供了一系列的工具和服务,如GoldenGate和Data Guard,以实现数据复制和高可用性。
- 广泛的企业应用支持和社区资源。
缺点:
- 成本高昂,尤其是在高可用性和性能优化方面。
- 学习曲线较陡峭,尤其是对于复杂功能的掌握。
- 软件安装和配置过程相对复杂。
MySQL
优点:
- 开源且免费,降低了总体拥有成本。
- 性能良好,特别是在读取密集型应用中。
- 社区版提供了基本的功能,企业版则提供了更多的高级特性和支持。
- 跨平台支持,可以在多种操作系统上运行。
- 有绿色版,可以放到任何磁盘运行,方便迁移。
- 有丰富的技术文档和丰富的工具支撑。
缺点:
- 事务处理能力和并发控制相比其他企业级数据库稍弱。
PostgreSQL
优点:
- 功能丰富,支持JSON、XML等现代数据类型,并具有高度的SQL标准兼容性。
- 开源但具备企业级特性,如多版本并发控制(MVCC)、在线热备份和点恢复。
- 社区活跃,更新频繁,持续改进和增强功能。
- 支持多种索引类型,包括B-tree、hash、GiST、SP-GiST、GIN和BRIN。
缺点:
- 相比于MySQL,学习曲线略陡峭。
- 在某些特定的性能指标上,如写入速度,可能不如其他专为特定用途设计的数据库。
SQLite
优点:
- 超轻量级,无需独立服务器进程,所有数据存储在一个文件中。
- 完全自包含,零配置,非常适合嵌入式系统和移动应用。
- 跨平台,可以在几乎所有操作系统上运行。
- 提供了事务支持和SQL功能。
缺点:
- 不适合高并发或多用户环境,因为它在多用户同时写入时效率较低。
- 没有内置的网络服务器,通常需要通过应用程序或其他服务器软件来提供网络访问。
- 在处理大量数据时,性能和可扩展性有限。
综上所述,MySQL数据库满足我们的实际需求,并且符合后续的扩展。具体下载地址如:
MySQL :: Download MySQL Community Server
三、数据库建库
根据数据库设计的第三范式,即数据库表没列都是最小单元、每个表都有主键、没列都依赖主键不存在传递的依赖。
本应用涉及的表不多,先满足最基本的需求。先满足股票数据。
涉及到表有:股票列表基础信息、A股日线行情、A股周线行情、每日指标、交易日历、自定义指标。
- 股票列表基础信息
用于保存当前最新的股票基本信息,每日更新数据,保障最新的数据同步到数据库。
sql
CREATE TABLE `runner_stock_basic` (
`symbol` varchar(11) CHARACTER SET utf8 NOT NULL COMMENT '股票代码',
`name` varchar(50) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '股票名称',
`area` varchar(50) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '所在地域',
`industry` varchar(50) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '所属行业',
`fullname` varchar(50) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '股票全称',
`enname` varchar(100) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '英文全称',
`market` varchar(50) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '市场类型 (主板/中小板/创业板/科创板)',
`exchange` varchar(50) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '交易所代码',
`curr_type` varchar(50) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '交易货币',
`list_status` varchar(50) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '上市状态: L上市 D退市 P暂停上市',
`list_date` varchar(50) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '上市日期',
`delist_date` varchar(50) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '退市日期',
`is_hs` varchar(50) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '是否沪深港通标的,N否 H沪股通 S深股通',
`ts_code` varchar(20) CHARACTER SET utf8 DEFAULT NULL COMMENT '股票代码(支持多个股票同时提取,逗号分隔)',
`adj_factor` double(10,4) DEFAULT NULL COMMENT '最新复权因子',
`create_datetime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '采集时间',
PRIMARY KEY (`symbol`) USING BTREE,
UNIQUE KEY `U_SYMBOL` (`symbol`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_croatian_ci ROW_FORMAT=DYNAMIC COMMENT='股票列表';
SET FOREIGN_KEY_CHECKS = 1;
- A股日线行情
用于保存每日的行情数据,数据每日用程序自动更新。
sql
CREATE TABLE `runner_stock_daily` (
`did` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`ts_code` varchar(20) NOT NULL COMMENT '股票代码(采集)',
`name` varchar(40) DEFAULT NULL,
`trade_date` date NOT NULL COMMENT '交易日期',
`open` float(20,4) DEFAULT '0.0000' COMMENT '开盘价',
`p_open` float(20,4) DEFAULT '0.0000' COMMENT '开盘价(前复权)',
`high` float(20,4) DEFAULT '0.0000' COMMENT '最高价',
`p_high` float(20,4) DEFAULT '0.0000' COMMENT '最高价(前复权)',
`low` float(20,4) DEFAULT '0.0000' COMMENT '最低价',
`p_low` float(20,4) DEFAULT '0.0000' COMMENT '最低价(前复权)',
`close` float(20,4) DEFAULT '0.0000' COMMENT '收盘价',
`p_close` float(20,4) DEFAULT '0.0000' COMMENT '收盘价(前复权)',
`pre_close` float(20,4) DEFAULT '0.0000' COMMENT '昨收价',
`p_pre_close` float(20,4) DEFAULT '0.0000' COMMENT '昨收价(前复权)',
`change` float(20,4) DEFAULT '0.0000' COMMENT '涨跌额',
`pct_chg` float(20,4) DEFAULT '0.0000' COMMENT '涨跌幅 (未复权,如果是复权请用 通用行情接口 )',
`vol` float(20,4) DEFAULT '0.0000' COMMENT '成交量 (手)',
`amount` float(20,4) DEFAULT '0.0000' COMMENT '成交额 (千元)',
`symbol` varchar(11) DEFAULT '0' COMMENT '股票代码',
`create_datetime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '采集时间',
PRIMARY KEY (`did`,`trade_date`) USING BTREE,
UNIQUE KEY `U_STOCK_DATE` (`ts_code`,`trade_date`) USING BTREE,
KEY `I_TRADE_DATE` (`trade_date`) USING BTREE,
KEY `I_TS_CODE` (`ts_code`) USING BTREE,
KEY `i_symbol` (`symbol`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=62632800 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='日线行情';
SET FOREIGN_KEY_CHECKS = 1;
- A股周线行情
用于保存周线的行情数据,数据每周用程序自动更新。
sql
CREATE TABLE `runner_stock_weekly` (
`did` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`ts_code` varchar(20) NOT NULL COMMENT '股票代码(采集)',
`name` varchar(40) DEFAULT NULL,
`trade_date` date NOT NULL COMMENT '交易日期',
`open` float(20,4) DEFAULT '0.0000' COMMENT '开盘价',
`p_open` float(20,4) DEFAULT '0.0000' COMMENT '开盘价(前复权)',
`high` float(20,4) DEFAULT '0.0000' COMMENT '最高价',
`p_high` float(20,4) DEFAULT '0.0000' COMMENT '最高价(前复权)',
`low` float(20,4) DEFAULT '0.0000' COMMENT '最低价',
`p_low` float(20,4) DEFAULT '0.0000' COMMENT '最低价(前复权)',
`close` float(20,4) DEFAULT '0.0000' COMMENT '收盘价',
`p_close` float(20,4) DEFAULT '0.0000' COMMENT '收盘价(前复权)',
`pre_close` float(20,4) DEFAULT '0.0000' COMMENT '昨收价',
`p_pre_close` float(20,4) DEFAULT '0.0000' COMMENT '昨收价(前复权)',
`change` float(20,4) DEFAULT '0.0000' COMMENT '涨跌额',
`pct_chg` float(20,4) DEFAULT '0.0000' COMMENT '涨跌幅 (未复权,如果是复权请用 通用行情接口 )',
`vol` float(20,4) DEFAULT '0.0000' COMMENT '成交量 (手)',
`amount` float(20,4) DEFAULT '0.0000' COMMENT '成交额 (千元)',
`symbol` varchar(11) DEFAULT '0' COMMENT '股票代码',
`create_datetime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '采集时间',
PRIMARY KEY (`did`,`trade_date`) USING BTREE,
UNIQUE KEY `U_STOCK_DATE` (`ts_code`,`trade_date`) USING BTREE,
KEY `I_TRADE_DATE` (`trade_date`) USING BTREE,
KEY `I_TS_CODE` (`ts_code`) USING BTREE,
KEY `i_symbol` (`symbol`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=30166565 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='日线行情';
SET FOREIGN_KEY_CHECKS = 1;
- 交易日历
每年同步一次数据,数据记录了一年的交易日。用数据库记录没事是否同步了相关数据,同步的数据量是多少。用来判断是否完成数据采集完整性。
sql
CREATE TABLE `runner_stock_trade_cal` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`exchange` varchar(5) DEFAULT NULL COMMENT '交易所 SSE上交所,SZSE深交所,CFFEX 中金所,SHFE 上期所,CZCE 郑商所,DCE 大商所,INE 上能源,IB 银行间,XHKG 港交所;;交易所 SSE上交所 SZSE深交所',
`cal_date` date DEFAULT NULL COMMENT '日历日期',
`is_open` varchar(12) DEFAULT NULL COMMENT '是否交易 0休市 1交易',
`pretrade_date` date DEFAULT NULL COMMENT '上一个交易日',
`stock_basic_spider` int(11) DEFAULT NULL COMMENT '0:进行中;-1:失败;1已完成(股票基本信息)',
`daily_spider` int(11) DEFAULT NULL COMMENT '0:进行中;-1:失败;1已完成',
`weekly_spider` int(11) DEFAULT NULL COMMENT '0:进行中;-1:失败;1已完成',
`adj_factor_spider` int(11) DEFAULT NULL COMMENT '采集复权因子',
`daily_qfq_compute` int(11) DEFAULT NULL COMMENT '0:进行中;-1:失败;1已完成',
`weekly_qfq_compute` int(11) DEFAULT NULL COMMENT '0:进行中;-1:失败;1已完成',
`daily_compute` int(11) DEFAULT NULL COMMENT '0:进行中;-1:失败;1已完成',
`weekly_compute` int(11) DEFAULT NULL COMMENT '0:进行中;-1:失败;1已完成',
`adj_factor_cnt` int(11) DEFAULT NULL COMMENT '当日采集的复权因子数量',
`daily_cnt` int(11) DEFAULT NULL COMMENT '当日采集的日线数据数量',
`weekly_cnt` int(11) DEFAULT NULL COMMENT '周采集的指标数量',
`dailybasic_cnt` int(11) DEFAULT NULL COMMENT '当日采集的每日指标数量',
`weeklybasic_cnt` int(11) DEFAULT NULL COMMENT '当日采集的每日指标数量',
`is_copy` int(11) DEFAULT '0' COMMENT '是否拷贝数据',
`create_datetime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '采集时间',
`daily_basic_cnt` int(11) DEFAULT NULL COMMENT '当日采集的每日指标数量',
`daily_basic_spider` int(11) DEFAULT NULL COMMENT '0:进行中;-1:失败;1已完成',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `u_cal_date` (`cal_date`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=43000 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='交易日历\r\n描述:获取各大交易所交易日历数据,默认提取的是上交所';
SET FOREIGN_KEY_CHECKS = 1;
- 自定义指标
用于记录通过通用指标计算的自定义指标,如macd、diff、dea、ma5、ma10、ma20等等。
sql
CREATE TABLE `runner_stock_daily_index` (
`did` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`ts_code` varchar(20) NOT NULL COMMENT '股票代码(采集)',
`trade_date` date NOT NULL COMMENT '交易日期',
`macd` float(20,6) DEFAULT '0.000000' COMMENT 'macd指标',
`diff` float(20,6) DEFAULT '0.000000' COMMENT 'dif指标',
`ema12` float(20,6) DEFAULT '0.000000' COMMENT 'ema12指标',
`ema26` float(20,6) DEFAULT '0.000000' COMMENT 'ema26指标',
`dea` float(20,6) DEFAULT '0.000000' COMMENT 'DEA指标',
`bar` float(20,6) DEFAULT '0.000000' COMMENT 'BAR 指标',
`createtime` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '数据更新时间',
`ma5` float(20,6) DEFAULT '0.000000' COMMENT 'ema5指标',
`ma10` float(20,6) DEFAULT '0.000000' COMMENT 'ema10指标',
`ma20` float(20,6) DEFAULT '0.000000' COMMENT 'ema20指标',
`ma60` float(20,6) DEFAULT '0.000000' COMMENT 'ema60指标',
`ema20` float(20,6) DEFAULT '0.000000' COMMENT 'ema26指标',
`upper20` float(20,6) DEFAULT '0.000000' COMMENT 'ema26指标',
`mid2` float(20,6) DEFAULT '0.000000' COMMENT 'ema26指标',
`qhd9` float(20,6) DEFAULT '0.000000' COMMENT 'ema26指标',
`qhj9` float(20,6) DEFAULT '0.000000' COMMENT 'ema26指标',
`lower2` float(20,6) DEFAULT NULL,
`qhk9` float(20,6) DEFAULT NULL,
PRIMARY KEY (`did`,`trade_date`) USING BTREE,
UNIQUE KEY `U_STOCK_DATE` (`ts_code`,`trade_date`) USING BTREE,
KEY `I_TRADE_DATE` (`trade_date`) USING BTREE,
KEY `I_TS_CODE` (`ts_code`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=77671402 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='日线行情';
SET FOREIGN_KEY_CHECKS = 1;
- 每日指标
用于记录每日交易所的指标数据。
sql
CREATE TABLE `runner_stock_daily_basic` (
`ts_code` varchar(20) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT 'TS股票代码',
`trade_date` date DEFAULT NULL COMMENT '交易日期(采集)',
`close` float(20,4) DEFAULT NULL COMMENT '当日收盘价',
`turnover_rate` float(20,4) DEFAULT NULL COMMENT '换手率(%)',
`turnover_rate_f` float(20,4) DEFAULT NULL COMMENT '换手率(自由流通股)',
`volume_ratio` float(20,4) DEFAULT NULL COMMENT '量比',
`pe` float(20,4) DEFAULT NULL COMMENT '市盈率(总市值/净利润, 亏损的PE为空)',
`pe_ttm` float(20,4) DEFAULT NULL COMMENT '市盈率(TTM,亏损的PE为空)',
`pb` float(20,4) DEFAULT NULL COMMENT '市净率(总市值/净资产)',
`ps` float(20,4) DEFAULT NULL COMMENT '市销率',
`ps_ttm` float(20,4) DEFAULT NULL COMMENT '市销率(TTM)',
`dv_ratio` float(20,4) DEFAULT NULL COMMENT '股息率 (%)',
`dv_ttm` float(20,4) DEFAULT NULL COMMENT '股息率(TTM)(%)',
`total_share` float(20,4) DEFAULT NULL COMMENT '总股本 (万股)',
`float_share` float(20,4) DEFAULT NULL COMMENT '流通股本 (万股)',
`free_share` float(20,4) DEFAULT NULL COMMENT '自由流通股本 (万)',
`total_mv` float(20,4) DEFAULT NULL COMMENT '总市值 (万元)',
`circ_mv` float(20,4) DEFAULT NULL COMMENT '流通市值(万元)',
`did` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`create_datetime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '采集时间',
`symbol` varchar(10) CHARACTER SET utf8 DEFAULT NULL COMMENT '交易代码',
PRIMARY KEY (`did`) USING BTREE,
UNIQUE KEY `U_STOCK_DATE` (`ts_code`,`trade_date`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=13444322 DEFAULT CHARSET=utf8 COLLATE=utf8_croatian_ci ROW_FORMAT=DYNAMIC COMMENT='每日指标\n';
SET FOREIGN_KEY_CHECKS = 1;
- 复权因子
用于记录每日的复权因子,包括当天的复权因子和上一交易日的复权因子,如复权因子发生变化,需要再次同步当前股票的数据,保证前复权数据准确性。
sql
CREATE TABLE `runner_stock_adjfactor` (
`aid` int(11) NOT NULL AUTO_INCREMENT,
`ts_code` varchar(10) DEFAULT NULL,
`symbol` varchar(11) DEFAULT NULL COMMENT '股票代码',
`trade_date` date DEFAULT NULL,
`adj_factor` float(10,4) DEFAULT NULL,
`last_adj_factor` float(10,4) DEFAULT NULL COMMENT '最新复权因子',
`pre_adj_factor` float(10,4) DEFAULT NULL COMMENT '前复权因子',
`create_datetime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '采集时间',
PRIMARY KEY (`aid`) USING BTREE,
UNIQUE KEY `i_code_date` (`ts_code`,`trade_date`) USING BTREE,
KEY `i_ts_code` (`ts_code`) USING BTREE,
KEY `i_trade__date` (`trade_date`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=43232627 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
SET FOREIGN_KEY_CHECKS = 1;
四、数据同步流程
五、结束语
本数据库为将来金融方面的研究提供基础条件。另外,根据需要后续不断完善数据库。
本数据为将来本地搭建个人或公司的知识图谱做前期数据准备。