量化數據庫設計


前言

在業界,評價一個策略好壞的標准,通常會去觀察收益曲線的波動,看是否平順,也就是控制最大回撤,追求高夏普。而降低策略波動很重要的一個方法就是多品種,多參數的對沖,比如同樣是多空對沖底層邏輯的策略,往往在單獨品種上面表現一般,但是延伸到多品種,多市場的時候,會有很大的改善,若再疊加多組參數(一個參數取多個處於參數平原的值去運行,非增加參數),也能對降低策略的波動(雖然必然會犧牲收益)。
因此,經常會發生在這情況,隨着策略優化的進行,會發現需要調用的數據越來越多,越來越雜,很可能新的數據不兼容歷史格式,從而單獨建庫。到最后發現策略每天運行需要的數據雜亂無章,調用數據相關的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';

完成,遠程鏈接成功!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM