实用案例学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秒