量化数据库设计

前言

在业界,评价一个策略好坏的标准,通常会去观察收益曲线的波动,看是否平顺,也就是控制最大回撤,追求高夏普。而降低策略波动很重要的一个方法就是多品种,多参数的对冲,比如同样是多空对冲底层逻辑的策略,往往在单独品种上面表现一般,但是延伸到多品种,多市场的时候,会有很大的改善,若再叠加多组参数(一个参数取多个处于参数平原的值去运行,非增加参数),也能对降低策略的波动(虽然必然会牺牲收益)。
因此,经常会发生在这情况,随着策略优化的进行,会发现需要调用的数据越来越多,越来越杂,很可能新的数据不兼容历史格式,从而单独建库。到最后发现策略每天运行需要的数据杂乱无章,调用数据相关的API修改频率很高,功能划分也非常混乱,每次数据的更新修改效率低下,十分容易产生疏忽。针对这个问题,重新设计了量化数据库,便于后期的数据管理和调用。

数据库选型及结构

结合实际,从业务逻辑出发,量化数据入库主要是为了数据的管理以及使用,让使用者具有清晰的逻辑去调用数据。因此,数据库中一部分表用于维护不同类型数据之间的关系,另外一部分表用于按照调用逻辑进行实际存储。
量化数据(行情数据/指标因子/财务数据等等)基本上都是时序类的数据,并且数据的字段往往会随着研究的深入慢慢增加,因此数据的实际存储最终选择了ClickHouse(目前性能最好的列式存储数据库,并且支持多种查询方式,非常适合策略回测)
而用于数据关系维护的表则使用Mysql(也可以都使用Clickhouse 无伤大雅,只是关系型数据库做这个事情逻辑上更说得通而已加)。

思路

量化数据的管理抽象为三部分:

  1. 品种管理:负责记录入库的数据属于哪个金融类别(股票,期货,期权等),以及每个金融类别有哪些划分标准(比如:股票能按照指数、行业、概念,期货能按照行业、交易所等),每个划分标准由哪些组成(比如:股票指数包含 zz500 hs300)
    有了这些划分之后,当要入库和查询一些数据的时候,可以很清晰地去定位。

  2. 数据管理:负责记录入库的数据属于哪一方面(行情数据,因子数据,现货数据),每种数据类型由哪些组成(比如:行情数据有open high low close ,因子数据有 alpha1 alpha2... ... )
    最后 还需要记录每个品种管理中的金融类别支持哪些数据(比如:股票数据支持行情数据,因子数据, 期货数据支持现货数据)

  3. 数据存储:体现数据存储的真实结构 分库分表进行存储
    按照金融类别 分别创建以下数据库 以stock为例:

  • stock_manager (库) --> 每个金融类别划分标准组成一张表 记录这个类别在每个时间段的具体成员(如 hs300为一张表 通过这个表查可以查询hs300某个时段的股票组成)
  • stock_data_行情数据(库) ---> 每个品种的每个周期的所有相关数据列构成一张表(如 000001.SH_day 的所有数据为一张表)
  • stock_data_因子数据(库) ---> 每个品种的每个周期的所有相关数据列构成一张表(如 000001.SH_day 的所有数据为一张表)
    ... ...
    其他金融类别 以此类推。

数据库ER图

根据上述表结构,重构数据调用API,后期无论需要增加什么数据,都能在这个架构下在数据库中进行入库以及调用。

搭建

clickhouse

root权限创建/etc/apt/sources.list.d/clickhouse.list文件 并且写入:

deb http://repo.yandex.ru/clickhouse/deb/stable/ main/

(注意空格 否则后面报错)
设置了软件源,开始安装

sudo apt-get install dirmngr    # optional
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4    # optional
sudo apt-get update

可以选择网络安装

sudo apt-get install clickhouse-client clickhouse-server

也可以手动下载安装
先在官网下载以下3个文件,然后执行命令(可以使用samba 在window下载完传过去)

sudo dpkg -i clickhouse-common-static_20.9.2.20_amd64.deb
sudo dpkg -i clickhouse-server_20.9.2.20_all.deb
sudo dpkg -i clickhouse-client_20.9.2.20_all.deb

开启服务,可以在/var/log/clickhouse-server/目录中查看日志。

sudo service clickhouse-server start

开启远程访问

vi /etc/clickhouse-server/config.xml
<listen_host>0.0.0.0</listen_host> 取消注释

补充

rm /etc/clickhouse-server/users.d/default-password.xml

记得去掉这个文件 里面记录了default用户的密码

不过还有个问题,默认安转路径在系统盘,所以需要将数据存储到其他路径,下面这个方法没有修改配置文件,参考了网上的教程,单纯通过软链接设置来实现
(路径如果设置到root下的 好像会出问题 data_dir就是数据硬盘挂载的地址)

data_dir=/usr/local/data/clickhouse
mkdir -p $data_dir
####复制数据目录到新的路径
cp /var/lib/clickhouse/data -r $data_dir
cp /var/lib/clickhouse/flags -r $data_dir
cp /var/lib/clickhouse/format_schemas -r $data_dir
cp /var/lib/clickhouse/metadata -r $data_dir
cp /var/lib/clickhouse/preprocessed_configs -r $data_dir
cp /var/lib/clickhouse/tmp -r $data_dir
cp /var/lib/clickhouse/user_files -r $data_dir
####删除原来文件夹的文件
rm -rf /var/lib/clickhouse/data
rm -rf /var/lib/clickhouse/flags
rm -rf /var/lib/clickhouse/format_schemas
rm -rf /var/lib/clickhouse/metadata
rm -rf /var/lib/clickhouse/preprocessed_configs
rm -rf /var/lib/clickhouse/tmp
rm -rf /var/lib/clickhouse/user_files
####建立软连接
ln -s  $data_dir/data  /var/lib/clickhouse
ln -s  $data_dir/flags  /var/lib/clickhouse
ln -s  $data_dir/format_schemas /var/lib/clickhouse
ln -s  $data_dir/metadata  /var/lib/clickhouse
ln -s  $data_dir/preprocessed_configs  /var/lib/clickhouse
ln -s  $data_dir/tmp  /var/lib/clickhouse
ln -s  $data_dir/user_files  /var/lib/clickhouse
####给新的路径添加权限
chown -R clickhouse.clickhouse $data_dir
####重启clickhouse
sudo /etc/init.d/clickhouse-server restart

mysql

网上教程很多,比clickhouse简单,不多叙述。
记录几个需要配置的地方:
1.检查3306端口是否打开 netstat -an|grep 3306--->未打开则
2.设置root的host 运行远程
3.注释etc/mysql/mysql.conf.d/mysqld.cnf中bind-address = 127.0.0.1
补充:
还要给root添加密码才行,参考了 https://www.cnblogs.com/cpl9412290130/p/9583868.html

# Ubuntu切换到root 直接进入mysql
# 设置密码
1 use mysql;   然后敲回车
2 update user set authentication_string=password("你的密码") where user="root";  然后敲回车
3 flush privileges;  然后敲回车

select user, plugin from user;发现root的密码并没有修改 而是auth_socket,继续进行修改
4. update user set authentication_string=password("你的密码"),plugin='mysql_native_password' where user='root';

完成,远程链接成功!!

posted @ 2021-08-09 14:58  LazyTiming  阅读(1140)  评论(0编辑  收藏  举报