V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
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 · 2016-07-11 16:34:39 +08:00 · 8003 次点击
    这是一个创建于 3068 天前的主题,其中的信息可能已经有所发展或是发生改变。

    当前情况

    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 条回复    2016-07-12 18:03:00 +08:00
    b821025551b
        1
    b821025551b  
       2016-07-11 16:56:57 +08:00
    1.id 无论是否有用都要留;
    2.trade_data 提出一个单独表, OHLCV 里的 trade_date 存新表的 id ;
    3.trade_date 和 stock_code 可以判断唯一性,那么是否对于 id 也是唯一的,是否可以直接用“没有用处”的 id 。
    billgreen1
        2
    billgreen1  
    OP
       2016-07-11 17:24:20 +08:00
    @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
       2016-07-11 17:29:15 +08:00
    @b821025551b 很多时候,两张表没有“关系”, 唯一联系就是通过(trade_date_id, stock_code_id)配对。
    leedstyh
        4
    leedstyh  
       2016-07-11 17:40:41 +08:00 via Android
    ID 没用,取消吧,不要纠结 date 和 code 的重复,股票数据天然的 key 就是 ticker+timestamp ,你 factor 的表我猜是每天的 TA 数据吧,和 ohlcv 存成一张表呢? fundamental 数据存另外一张表怎么样

    事实上我是用 kv 数据库来存股票数据的
    billgreen1
        5
    billgreen1  
    OP
       2016-07-11 18:23:12 +08:00
    @leedstyh 你说的对,是每天的 TA 数据。 问题是太多了,放到一张表里有点太吓人。现在是想着按类别存放,比如动量类,波动类,等。另外还有每日的估值类因子。
    fcicq
        6
    fcicq  
       2016-07-11 20:28:47 +08:00
    楼主没钱上商用列存啊
    billgreen1
        7
    billgreen1  
    OP
       2016-07-11 23:15:54 +08:00
    @fcicq 可以详细说说嘛?不了解商用列存是什么
    fcicq
        8
    fcicq  
       2016-07-11 23:31:14 +08:00
    @billgreen1 因为回复的时候没仔细看节点. MySQL 没有列存引擎. 重复 2000 次对于列存来说没什么特别的.
    8bit
        9
    8bit  
       2016-07-11 23:39:45 +08:00 via Android
    股票 id ,名称之类都可以抽出来,行情这种单独一张表出来,楼主设计的时候要估算下总体数据量
    8bit
        10
    8bit  
       2016-07-11 23:42:13 +08:00 via Android
    日期可以单独来张表,应付查询。一些区间行情可以计算的
    billgreen1
        11
    billgreen1  
    OP
       2016-07-12 07:46:31 +08:00
    @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  
       2016-07-12 08:13:12 +08:00 via Android
    @billgreen1 日期就冗余行情里面,没必要提出来
    realpg
        13
    realpg  
       2016-07-12 08:56:06 +08:00   ❤️ 1
    @billgreen1
    关键表全部数字化 该有的冗余都应该有
    很多看起来不该有的冗余在统计时如果避免两个巨大的表 join ,都应该设计
    估计好数据量,每个查询的预计检索数据量,查询品读,超过一定范围,就要考虑检索时间了

    另外,总在用的数据表,基础数据表,能数字就数字型,省空间,检索快
    xchange
        14
    xchange  
       2016-07-12 18:03:00 +08:00   ❤️ 1
    国内几个大的公司内部的行情表里 trade date 都是冗余的;股票的代码、名称、缩写等信息等等都是做一张单独的证券代码表,每个股票有一个内部代码,通过内部代码和其他表关联。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3709 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:35 · PVG 18:35 · LAX 02:35 · JFK 05:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.