› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
billgreen1
V2EX  ›  MySQL

请教一下股票相关数据的数据库设计。

  •  
  •   billgreen1 · Jul 11, 2016 · 8896 views
    This topic created in 3733 days ago, the information mentioned may be changed or developed.

    当前情况

    1. 有一张 OHLCV 表,日度的,也就是每个交易日都有一条记录。格式如下:

    id, trade_date, stock_code, open, high, low, close, volume

    其中 id 主键,自增。 通过 trade_date 和 stock_code 可以唯一确定一行。

    目前觉得不合理的地方:

    1. id 目前没有用处,目前查询都是通过查询一段时间范围内, 一些股票的数据。
    2. 重复过多,每天大约有 2000+个股票数据, 这样 trade_date 就要重复 2000+次。
    3. 和其他表合并不方便。目前合并的时候,都是通过 trade_date 和 stock_code 来判断唯一性。
    这两个字段都要在其他表中存储。
    
    1. 有一些基本面的数据,是季度的 date , stock_code, f1, f2, f3, .....

    date 只有四种可能: XXXX-03-31, XXXX-06-30, XXXX-09-30, XXXX-12-31. (但是这些日期不一定是 trade_date.) 分别表示第 1,2,3,4 季度数据。由于数据发布的滞后性, 我需要对于日度数据: 1 、 2 、 3 月底采用上一年 Q3 的数据; 4 、 5 、 6 、 7 月底用本年 Q1 的数据; 8 、 9 月底用本年 Q2 的数据; 10 、 11 、 12 用本年 Q3 的数据。

    还有一些表, 也是日度数据, 有 id, trade_date, stock_code, col1, col2, col3 , ...... 同样的 id 自增;主键。 同样是 trade_date, stock_code 唯一的确定一行数据。

    这张表和 OHLCV 合并时,就是靠 trade_date, stock_code 来和 OHLCV 的相应的行来对应。

    我觉得应该有更好的方法。

    先行谢过了。

    14 replies  •  2016-07-12 18:03:00 +08:00
    b821025551b
        1
    b821025551b  
       Jul 11, 2016
    1.id 无论是否有用都要留;
    2.trade_data 提出一个单独表, OHLCV 里的 trade_date 存新表的 id ;
    3.trade_date 和 stock_code 可以判断唯一性,那么是否对于 id 也是唯一的,是否可以直接用“没有用处”的 id 。
    billgreen1
        2
    billgreen1  
    OP
       Jul 11, 2016
    @b821025551b id 是自增主键,当然也是唯一的。

    假设 OHLCV 是价格表(表名称 price), 日度数据。表里现存 id, trade_date_id, stock_id, open, high, low, close, volume 等。由于其 id 是自增的,当日也能唯一确定一条数据。


    另有日度因子表(表名称 factors.) 日度数据。 表里也要存 id, trade_date_id, stock_id, fac1, fac2, fac3, ....

    我要将这两个表合并的时候,还是得设置 where price.trade_date_id = factors.trade_date_id and

    price.stock_id = factors.stock_id.

    主要问题是很多表中都有相同的两列(trade_date/stock_code) 或者 ( trade_date_id/stock_code_id)
    billgreen1
        3
    billgreen1  
    OP
       Jul 11, 2016
    @b821025551b 很多时候,两张表没有“关系”, 唯一联系就是通过(trade_date_id, stock_code_id)配对。
    leedstyh
        4
    leedstyh  
       Jul 11, 2016 via Android
    ID 没用,取消吧,不要纠结 date 和 code 的重复,股票数据天然的 key 就是 ticker+timestamp ,你 factor 的表我猜是每天的 TA 数据吧,和 ohlcv 存成一张表呢? fundamental 数据存另外一张表怎么样

    事实上我是用 kv 数据库来存股票数据的
    billgreen1
        5
    billgreen1  
    OP
       Jul 11, 2016
    @leedstyh 你说的对,是每天的 TA 数据。 问题是太多了,放到一张表里有点太吓人。现在是想着按类别存放,比如动量类,波动类,等。另外还有每日的估值类因子。
    fcicq
        6
    fcicq  
       Jul 11, 2016
    楼主没钱上商用列存啊
    billgreen1
        7
    billgreen1  
    OP
       Jul 11, 2016
    @fcicq 可以详细说说嘛?不了解商用列存是什么
    fcicq
        8
    fcicq  
       Jul 11, 2016
    @billgreen1 因为回复的时候没仔细看节点. MySQL 没有列存引擎. 重复 2000 次对于列存来说没什么特别的.
    8bit
        9
    8bit  
       Jul 11, 2016 via Android
    股票 id ,名称之类都可以抽出来,行情这种单独一张表出来,楼主设计的时候要估算下总体数据量
    8bit
        10
    8bit  
       Jul 11, 2016 via Android
    日期可以单独来张表,应付查询。一些区间行情可以计算的
    billgreen1
        11
    billgreen1  
    OP
       Jul 12, 2016
    @8bit 我目前在这样考虑呢,谢谢啦。
    股票代码一张表: stock
    id, stock_code

    交易日期一张表: trade_date
    id, trade_date

    price 表
    设置两个外键约束(stock_code_id, trade_date_id)
    id, stock_code_id, trade_date_id, open, high, low, close, volume

    这样就是需要 join stock , trade_date 两个表
    8bit
        12
    8bit  
       Jul 12, 2016 via Android
    @billgreen1 日期就冗余行情里面,没必要提出来
    realpg
        13
    realpg  
       Jul 12, 2016   ❤️ 1
    @billgreen1
    关键表全部数字化 该有的冗余都应该有
    很多看起来不该有的冗余在统计时如果避免两个巨大的表 join ,都应该设计
    估计好数据量,每个查询的预计检索数据量,查询品读,超过一定范围,就要考虑检索时间了

    另外,总在用的数据表,基础数据表,能数字就数字型,省空间,检索快
    xchange
        14
    xchange  
       Jul 12, 2016   ❤️ 1
    国内几个大的公司内部的行情表里 trade date 都是冗余的;股票的代码、名称、缩写等信息等等都是做一张单独的证券代码表,每个股票有一个内部代码,通过内部代码和其他表关联。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2338 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 00:22 · PVG 08:22 · LAX 17:22 · JFK 20:22
    ♥ Do have faith in what you're doing.