
实用案例学DolphinDB:tushare数据保存、WorldQuant因子(附完整代码)
发布日期:2021-05-07 14:14:23
浏览次数:19
分类:精选文章
本文共 4303 字,大约阅读时间需要 14 分钟。
DolphinDB入门与实践:基于World Quant的金融因子实现
作为一款专为时序数据设计的高性能时序数据库,DolphinDB在金融领域的应用越来越广泛。本文将从新手的视角,介绍DolphinDB的安装、实用操作以及基于World Quant论文《101 Formulaic Alphas》的金融因子实现。
前导知识
在开始使用DolphinDB之前,需要理解一些基本概念:
因子:本文主要基于World Quant发表的论文《101 Formulaic Alphas》,实现了Alpha #001和Alpha #098这两个因子。这些因子基于股票的历史数据和市场行为,用于捕捉股票的隐性风险和超额收益。
截面数据与时序数据:
- 截面数据:指不同主体在同一时间点或时间段的同一指标数据,如工业普查数据、人口普查数据等。
- 时序数据:指同一指标按时间顺序记录的数据列,如股票价格、成交量等。
目标因子介绍
Alpha #001
rank(Ts_ArgMax(SignedPower((returns < 0 ? stddev(returns, 20) : close), 2), 5)) - 0.5
该因子通过计算股票回报率与其波动率的关系,捕捉超额收益的潜在因子。
Alpha #098
rank(decay_linear(correlation(vwap, sum(adv5, 26.4719), 4.58418), 7.18088)) - rank(decay_linear(Ts_Rank(Ts_ArgMin(correlation(rank(open), rank(adv15), 20.8187), 8.62571), 6.95668), 8.07206))
该因子结合了成交量、价格和市场流动性等多个因素,用于评估股票的超额收益。
数据准备
数据表结构
以下是用于存储股票日线数据的表结构:
字段 | 意义 |
---|---|
symbol | 股票代码 |
date | 日期 |
volume | 成交量 |
vwap | 成交量的加权平均价 |
open | 开盘价格 |
close | 收盘价格 |
pre_close | 前日收盘价格 |
change | 涉及差异 |
pct_change | 涉及比例 |
数据导入
使用Tushare API将股票数据导入DolphinDB。以下是导入代码示例:
import tushare as tsimport pandas as pdimport numpy as npimport dolphindb as ddbpro = ts.pro_api('') # 替换为实际的Pro API密钥s = ddb.session()s.connect("localhost", 8848, "admin", "123456")def dateRange(beginDate, endDate): dates = [] dt = datetime.datetime.strptime(beginDate, "%Y%m%d") currentDate = beginDate while currentDate <= endDate: dates.append(currentDate) dt = dt + datetime.timedelta(1) currentDate = dt.strftime("%Y%m%d") return datesfor dates in dateRange('20080101', '20100110'): df = pro.daily(trade_date=dates) df['trade_date'] = pd.to_datetime(df['trade_date']) if len(df): t1.append(s.table(data=df)) print(t1.rows)for dates in dateRange('20080101', '20100110'): ds = pro.daily_basic(trade_date=dates) ds['trade_date'] = pd.to_datetime(ds['trade_date']) ds['volume_ratio'] = np.float64(ds['volume_ratio']) if len(ds): t2.append(s.table(data=ds)) print(t2.rows)
数据保存与管理
数据库创建
在DolphinDB中创建数据库,以下是创建磁盘数据库的示例:
dbPath = "D:/Dolphin_test"if existsDatabase(dbPath): dropDatabase(dbPath)columns1 = ['ts_code', 'trade_date', 'open', 'high', 'low', 'close', 'pre_close', 'change', 'pct_change', 'vol', 'amount']type1 = ['SYMBOL', 'NANOTIMESTAMP', 'DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE']db = database(dbPath, RANGE, yearRange)hushen_daily_line = db.createPartitionedTable(table(100000000:0, columns1, type1), 'hushen_daily_line', 'trade_date')columns2 = ['ts_code', 'trade_date', 'close', 'turnover_rate', 'turnover_rate_f', 'volume_ratio', 'pe', 'pr_ttm', 'pb', 'ps', 'ps_ttm', 'total_share', 'float_share', 'free_share', 'total_mv', 'circ_mv']type2 = ['SYMBOL', 'NANOTIMESTAMP', 'DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE']hushen_daily_indicator = db.createPartitionedTable(table(100000000:0, columns2, type2), 'hushen_daily_indicator', 'trade_date')
数据查看
使用DolphinDB查询已保存数据量:
select count(*) from hushen_daily_line
金融因子计算
计算滚动波动率
daily_line = loadTable("dfs://daily_line", "hushen_daily_line")t = select ts_code, trade_date, mstd(pct_change/100, 21) as mvol from daily_line context by ts_codeselect * from t where trade_date = '2008.11.14'
因子计算
以下是Alpha #001和Alpha #098的实现代码:
def alpha1(stock): t = select trade_date, ts_code, mimax(pow(iif(ratios(close) < 1.0, mstd(ratios(close) - 1, 20), close), 2.0), 5) as maxIndex from stock context by ts_code return select trade_date, ts_code, rank(maxIndex) - 0.5 as A1 from t context by trade_datedef alpha98(stock): t = select ts_code, trade_date, wavg(close, vol) as vwap, open, mavg(vol, 5) as adv5, mavg(vol, 15) as adv15 from stock context by ts_code update t set rank_open = rank(open), rank_adv15 = rank(adv15) context by trade_date update t set decay7 = mavg(mcorr(vwap, msum(adv5, 26), 5), 1..7), decay8 = mavg(mrank(9 - mimin(mcorr(rank_open, rank_adv15, 21), 9), true, 7), 1..8) context by ts_code return select ts_code, trade_date, rank(decay7) - rank(decay8) as A98 from t context by trade_date
References
本文中的数据库操作示例参考了DolphinDB官方文档,具体操作请见相关文档。
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月01日 10时29分21秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux系统编程44 信号 - 信号的响应过程分析!!!
2019-03-04
VL53L0x TOF激光测距的 stm32 HAL库驱动代码
2019-03-04
怎么玩LOG4J
2019-03-04
Oracle创建用户,分配表空间
2019-03-04
自定义标签(JSP2.0)简单标签
2019-03-04
MyBatis自定义类型转换器
2019-03-04
机器学习(湖北师范大学教程)-极大似然估计算法
2019-03-04
【C# 重构】—参数化查询, 需要参数,但未提供该参数
2019-03-04
决策树(二)—— ID3和C4.5
2019-03-04
MySQL~教你满分回答什么是数据库索引? 索引的数据结构是什么? 什么是事务?
2019-03-04
操作系统~进程的状态、转换、控制
2019-03-04
操作系统~线程概念以及多线程模型
2019-03-04
数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,时间复杂度均为O(1))
2019-03-04
Python:函数 ----》装饰器函数
2019-03-04
Python:面向对象
2019-03-04
Python练习题 :随机生成一批数
2019-03-04
Spring源码:prepareBeanFactory(beanFactory);方法
2019-03-04
Spring源码:initApplicationEventMulticaster源码解析
2019-03-04
AcWing 786: 第k个数
2019-03-04
AcWing 828. 模拟栈
2019-03-04