搭建个人的金融系统-----第一章,数据库设计

目录

一、概述

二、数据库选型

三、数据库建库

四、数据同步流程


一、概述

搭建个人金融系统,主要作用是拥有自己的金融数据库,能从互联网同步公开的数据到个人数据库,用于个人的研究和学习。

系统搭建步骤,首先搭建数据库,然后选择合适的数据同步平台将数据同步到自己的数据库,最后中现有数据库的基础上开发个人应用功能,如股市分析、基金分析等等。

后续可以利用数据库的数据搭建一个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;

四、数据同步流程

五、结束语

本数据库为将来金融方面的研究提供基础条件。另外,根据需要后续不断完善数据库。

本数据为将来本地搭建个人或公司的知识图谱做前期数据准备。

相关推荐
鹿子铭25 分钟前
单线程Redis:Redis为什么这么快
数据库·redis
宜向华1 小时前
opencv 实现两个图片的拼接去重功能
人工智能·opencv·计算机视觉
OpenVINO生态社区1 小时前
【了解ADC差分非线性(DNL)错误】
人工智能
JSON_L1 小时前
MySQL 事务处理
数据库·mysql
如果你想拥有什么先让自己配得上拥有1 小时前
第二十四篇——地形篇:知己知彼知地形
金融
醉后才知酒浓2 小时前
图像处理之蒸馏
图像处理·人工智能·深度学习·计算机视觉
爱打lan球的程序员3 小时前
redis分布式锁和lua脚本
数据库·redis·分布式
炸弹气旋3 小时前
基于CNN卷积神经网络迁移学习的图像识别实现
人工智能·深度学习·神经网络·计算机视觉·cnn·自动驾驶·迁移学习
python_知世3 小时前
时下改变AI的6大NLP语言模型
人工智能·深度学习·自然语言处理·nlp·大语言模型·ai大模型·大模型应用
愤怒的可乐3 小时前
Sentence-BERT实现文本匹配【CoSENT损失】
人工智能·深度学习·bert