为啥使用数据库
在做量化投研的过程中,一个适合的数据库往往能够提高工作的效率,在过去的工作研究经历中,使用过csv文件、pickle文件、mysql、mogodb等数据库,在我自己以后的投资研究过程中,尝试使用mongodb数据库和man-group(英士曼集团)开源的基于mongodb的数据库框架-ARCTIC,应该足够能够满足我的投研需要了。
必须要说明的是,arctic数据库应该算不上最快的时序数据库,有很多收费或者免费的数据库都比它效率要高一些,比如收费的kdb+数据库,半收费的dophindb等,arctic的优势在于免费、简单易用,所以在存储股票、期货、基金、期权、债券、可转债、外汇等数据的时候,我选择了ARCTIC。
安装教程
使用之前首先需要在电脑上安装mongodb数据库,需要安装python,然后安装arctic。
数据库命名
在使用ARCTIC的时候,需要创建两个名字,一个是library_name,一个是symbol_name,所以对数据库的名字做一个统一的规定,library_name是大类资产的名字,symbol_name是具体资产__周期__交易所的名字,这样同一规定之后,方便后续数据的管理工作。
股票 — STOCKS
期货 — FUTURES
基金 — FUNDS
期权 — OPTIONS
债券 — BONDS
可转债 — CBONDS
外汇 ---- FORES
数字货币 — DIGITALS
一个存储数字货币的例子
import gzip import os,sys import pandas as pd from arctic import Arctic # 连接数据库 conn = Arctic('127.0.0.1') # 判断library是否存在,如果不存在就创建一个 if "DIGITALS" not in conn.list_libraries(): conn.initialize_library("DIGITALS") # 连接到具体的library中 lib = conn["DIGITALS"] # 遍历数据并存储 data_root = "/home/yun/Downloads/spot/" timeframe = "1m" symbol_type = "spot" exchange = "binance" file_list = os.listdir(data_root) for file in file_list: symbol = file.split(".")[0] symbol_name = symbol+"__"+timeframe+"__"+symbol_type+"__"+exchange with gzip.open("/home/yun/Downloads/spot/"+file, 'rb') as f: df = pd.read_csv(f) lib.write(symbol_name, df) print(f"存储数据{file}成功") # 读取数据 # symbol_name = 'USDS-USDT__1m__spot__binance' # data = lib.read(symbol_name).data # 判断是否满足 data == df
读取数字货币数据,并使用plotly_express画出收益率直方图,观察收益率分布情况
# 获取数据 import gzip import os,sys import pandas as pd from arctic import Arctic # 连接数据库 conn = Arctic('127.0.0.1') # 连接到具体的library中 lib = conn["DIGITALS"] # 打印当前library中有多少的symbol symbol_list = lib.list_symbols() # 循环数据,并打印数据,生成一个1分钟收益率,然后生成一个直方图 data = pd.DataFrame() count = 0 for symbol in symbol_list: if "spot" in symbol: count+=1 name = symbol.split("__")[0] df = lib.read(symbol).data df['ret'] = df['close'].pct_change() df['name'] = name df = df[['ret','name']] if count<3: data = data.append(df) print(symbol) data = data.dropna() import plotly_express as px fig = px.histogram(data,x="ret",color="name") fig.show()
从1分钟收益率的直方图上来看,这两个数字货币的绝大多数时间内收益率波动都比较小,但是有极少数的1分钟K线的收益率非常高或者非常低。