基于Tushare和ElegantRL的量化交易实战

这篇具有很好参考价值的文章主要介绍了基于Tushare和ElegantRL的量化交易实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Tushare介绍

1.关于Tushare

Tushare 是一个免费、开源的python财经数据接口包,数据内容包含股票、指数、基金、期货、债券、外汇、行业大数据等,同时包括了数字货币行情等区块链数据,为各类金融投资和研究人员提供适用的数据和工具,目前已全面升级到 Tushare pro 了,非常适合用于进行数据分析和可视化。

官网链接:Tushare大数据社区

elegantrl,python,金融

 2、Tushare安装及初始化

​​​​​​​Github网址: https://github.com/waditu/Tushare

使用pip安装tushare包

pip install tushare lxml

导入tushare

import tushare as ts

设置token

ts.set_token('your token here')

在官网注册账户即可获取token。以上方法只需要在第一次或者token失效后调用,完成调取tushare数据凭证的设置,正常情况下不需要重复设置。也可以忽略此步骤,直接用pro_api('your token')完成初始化。

初始化pro接口

pro = ts.pro_api()

3.Tushare接口调用

Tushare的数据接口分为沪深股票、指数、基金、期货、期权、债券、外汇、港股、行业经济、宏观经济、特色大数据共计十一大类,沪深其中股票分为基础数据、行情数据、财务数据、市场参考数据四类接口。Tushare也提供了区块链相关的基础数据、行情数据、资讯公告三类接口,以及新浪财经、东方财富、同花顺、云财经、华尔街见闻等财经网站的宏观经济、外汇、A股、区块链、美股、石油、黄金、黄金外汇、港股、商品、债券、公司、市场、焦点、央行等财经资讯类消息。

Tushare API接口需要根据注册账户的积分数量获取相应的访问权限,积分等级不够可能导致API接口无权限访问,区块链相关接口需要捐款获取相应权限。

官网权限说明:https://tushare.pro/document/1?doc_id=108

股票行情数据

获取股票基础信息数据,包括股票代码、高开底收等。

pro = ts.pro_api()

df = pro.daily(ts_code='000001.SZ', start_date='20180701', end_date='20180718')

#多个股票
df = pro.daily(ts_code='000001.SZ,600000.SH', start_date='20180701', end_date='20180718')

数据样例

ts_code     trade_date  open  high   low  close  pre_close  change    pct_chg  vol        amount
0  000001.SZ   20180718  8.75  8.85  8.69   8.70       8.72   -0.02       -0.23   525152.77   460697.377
1  000001.SZ   20180717  8.74  8.75  8.66   8.72       8.73   -0.01       -0.11   375356.33   326396.994
2  000001.SZ   20180716  8.85  8.90  8.69   8.73       8.88   -0.15       -1.69   689845.58   603427.713
3  000001.SZ   20180713  8.92  8.94  8.82   8.88       8.88    0.00        0.00   603378.21   535401.175
4  000001.SZ   20180712  8.60  8.97  8.58   8.88       8.64    0.24        2.78  1140492.31  1008658.828
5  000001.SZ   20180711  8.76  8.83  8.68   8.78       8.98   -0.20       -2.23   851296.70   744765.824
6  000001.SZ   20180710  9.02  9.02  8.89   8.98       9.03   -0.05       -0.55   896862.02   803038.965
7  000001.SZ   20180709  8.69  9.03  8.68   9.03       8.66    0.37        4.27  1409954.60  1255007.609
8  000001.SZ   20180706  8.61  8.78  8.45   8.66       8.60    0.06        0.70   988282.69   852071.526
9  000001.SZ   20180705  8.62  8.73  8.55   8.60       8.61   -0.01       -0.12   835768.77   722169.579

财务指标数据

获取上市公司各类财务指标数据,如ROA、ROE等。


pro = ts.pro_api()

df = pro.fina_indicator(ts_code='600000.SH')'20180718')

数据样例

ts_code  ann_date  end_date   eps  dt_eps  total_revenue_ps  revenue_ps  \
0  600000.SH  20180830  20180630  0.95    0.95            2.8024      2.8024   
1  600000.SH  20180428  20180331  0.46    0.46            1.3501      1.3501   
2  600000.SH  20180428  20171231  1.84    1.84            5.7447      5.7447   
3  600000.SH  20180428  20171231  1.84    1.84            5.7447      5.7447   
4  600000.SH  20171028  20170930  1.45    1.45            4.2507      4.2507   
5  600000.SH  20171028  20170930  1.45    1.45            4.2507      4.2507   
6  600000.SH  20170830  20170630  0.97    0.97            2.9659      2.9659   
7  600000.SH  20170427  20170331  0.63    0.63            1.9595      1.9595   
8  600000.SH  20170427  20170331  0.63    0.63            1.9595      1.9595  

二、基于ElegantRL的量化交易机器人

1.下载数据并预处理

使用Tushare下载1635天的中国A股数据,包括基本行情数据、各类技术指标与财务指标。

财务数据

编写函数下载并处理为自己的dataframe格式

def get_fund_data(list_ticker):

    fund_data = pd.DataFrame()
    pro = ts.pro_api()

    for i in list_ticker:
        data = pro.fina_indicator(ts_code=i, start_date='20150118', end_date='20190731').drop_duplicates(subset='end_date')
        fund_data = pd.concat([fund_data,data], axis=0)

    date = pd.to_datetime(fund_data['end_date'],format='%Y%m%d').to_frame('date')
    tic = fund_data['ts_code'].to_frame('tic')
    OPM = fund_data['grossprofit_margin'].to_frame('OPM')
    NPM = fund_data['netprofit_margin'].to_frame('NPM')
    ROA = fund_data['roa'].to_frame('ROA')
    ROE = fund_data['roe'].to_frame('ROE')
    EPS = fund_data['eps'].to_frame('EPS')
    cur_ratio = fund_data['current_ratio'].to_frame('cur_ratio')
    quick_ratio = fund_data['quick_ratio'].to_frame('quick_ratio')
    cash_ratio = fund_data['cash_ratio'].to_frame('cash_ratio')
    acc_rec_turnover = fund_data['ar_turn'].to_frame('acc_rec_turnover')
    debt_ratio = fund_data['debt_to_assets'].to_frame('debt_ratio')
    debt_to_equity = fund_data['debt_to_eqt'].to_frame('debt_to_equity')

    ratios = pd.concat([date,tic,OPM,NPM,ROA,ROE,EPS,
                    cur_ratio,quick_ratio,cash_ratio,acc_rec_turnover,
                   debt_ratio,debt_to_equity], axis=1)
    ratios = ratios.sort_values(by=['date','tic']).reset_index(drop=True)

    return ratios

结果显示

elegantrl,python,金融

基本行情数据、技术指标等同理。

数据连接与预处理

去除非法数据

final_ratios = ratios.copy()
final_ratios = final_ratios.fillna(0)
final_ratios = final_ratios.replace(np.inf,0)

利用date和tic将数据连接

import itertools
list_date = list(pd.date_range(df['date'].min(),df['date'].max()))
combination = list(itertools.product(list_date,list_ticker))

# Merge stock price data and ratios into one dataframe
processed_full = pd.DataFrame(combination,columns=["date","tic"]).merge(df,on=["date","tic"],how="left")
processed_full = processed_full.merge(final_ratios,how='left',on=['date','tic'])
processed_full = processed_full.sort_values(['tic','date'])

将财务指标数据回填,保证数据完整性

# Backfill the ratio data to make them daily
processed_full = processed_full.bfill(axis='rows')

结果显示

elegantrl,python,金融

2.训练DRL模型

DRL模型采用开源的ElegantRL库作为框架。

交易任务的MDP模型:我们将交易任务建模为马尔可夫决策过程(MDP)(S, A, P, r, γ),其中SA分别表示state space和action space,P(s'|s, A)表示转移概率,r(s, a)为奖励函数,γ∈(0, 1)为折现因子。具体地说,该状态表示DRL agent对市场环境的一次观测,action space由agent在某种状态下可采取的行动组成,r (s, a, s')激励agent学习更好的政策。交易agent的目的是学习一种策略elegantrl,python,金融使预期回报elegantrl,python,金融 最大化。

相关代码来自FinRL-Meta Demo_China_A_share_market

run函数超参数配置

def run(gpu_id=0):
    env = StockTradingEnv()
    env_func = StockTradingEnv
    env_args = get_gym_env_args(env=env, if_print=False)
    env_args['beg_idx'] = 10  # training set
    env_args['end_idx'] = 1296  # training set

    args = Arguments(AgentPPO, env_func=env_func, env_args=env_args)
    args.target_step = args.max_step * 4
    args.reward_scale = 2 ** -7
    args.learning_rate = 1.5 ** -14
    args.break_step = int(10e5)

    args.learner_gpus = gpu_id
    args.random_seed += gpu_id + 1943
    train_agent(args)

连接ElegantRL库代码

run() 函数将会用到以下内容:

# env.py
class StockTradingEnv()  # 来自FinRL库的交易仿真环境
def build_env()  # 创建训练仿真环境
def get_gym_env_args()  # 获得仿真环境的参数

# net.py
class ActorPPO  # PPO算法的策略网络
class CriticPPO  # PPO算法的价值网络

# agent.py
class AgentPPO  # PPO算法的主体
class ReplayBufferList  # 经验回放缓存(存放强化学习的训练数据)

# run.py
class Arguments  # 强化学习的超参数(可以看这个类的注释了解超参数的作用)
def train_agent()  # 训练强化学习智能体的函数

为了满足训练的需要,需要对 StockTradingEnv 类做一些修改。

训练与评估模型

使用 check_env() 函数对测试集的数据进行测试

  • random action 表示交易动作是随机的 action=rd.uniform(-1, 1, action_dim),强化学习训练得到的智能体不应该比这个分数低。
  • buy all share 表示一直使用最大的额度买入所有股票 action=np.ones(action_dim),能一定程度上反映大盘走势

为了方便演示和学习,选择了较少的数据,从而把训练时间压缩到1000秒内。实际上,训练数据需要再多一个数量级。

| StockTradingEnv: close_ary.shape (339, 15)
| StockTradingEnv: tech_ary.shape (339, 120)
| StockTradingEnv: fund_ary.shape (339, 165)

cumulative_returns of random action:      1.21
cumulative_returns of random action:      1.20
cumulative_returns of random action:      1.18
cumulative_returns of random action:      1.43

cumulative_returns of buy all share:      1.36
cumulative_returns of buy all share:      1.36
cumulative_returns of buy all share:      1.36
cumulative_returns of buy all share:      1.36

 使用 run() 函数进行训练

| StockTradingEnv: close_ary.shape (1625, 15)
| StockTradingEnv: tech_ary.shape (1625, 120)
| StockTradingEnv: fund_ary.shape (1625, 165)
| Arguments Remove cwd: ./StockTradingEnv-v2_PPO_0
| StockTradingEnv: close_ary.shape (1286, 15)
| StockTradingEnv: tech_ary.shape (1286, 120)
| StockTradingEnv: fund_ary.shape (1286, 165)
Step:7.71e+03  ExpR:   -0.01  Returns:    0.84  ObjC:    0.66  ObjA:   -0.02  
Step:6.17e+04  ExpR:    0.27  Returns:    3.42  ObjC:    0.49  ObjA:   -0.29  
Step:1.16e+05  ExpR:    0.23  Returns:    3.18  ObjC:    0.26  ObjA:   -0.31  
Step:1.70e+05  ExpR:    0.07  Returns:    1.81  ObjC:    0.21  ObjA:   -0.23  
Step:2.24e+05  ExpR:    0.23  Returns:    3.24  ObjC:    0.17  ObjA:   -0.24  
Step:2.78e+05  ExpR:    0.00  Returns:    1.15  ObjC:    0.17  ObjA:   -0.25  
Step:3.32e+05  ExpR:    0.04  Returns:    1.42  ObjC:    0.11  ObjA:   -0.25  
Step:3.86e+05  ExpR:    0.05  Returns:    1.36  ObjC:    0.07  ObjA:   -0.22  
Step:4.39e+05  ExpR:    0.05  Returns:    1.51  ObjC:    0.06  ObjA:   -0.28  
Step:4.93e+05  ExpR:    0.05  Returns:    1.50  ObjC:    0.03  ObjA:   -0.24  
Step:5.47e+05  ExpR:    0.04  Returns:    1.48  ObjC:    0.15  ObjA:   -0.32  
Step:6.01e+05  ExpR:    0.05  Returns:    1.54  ObjC:    0.09  ObjA:   -0.20  
Step:6.55e+05  ExpR:    0.05  Returns:    1.54  ObjC:    0.06  ObjA:   -0.25  
Step:7.09e+05  ExpR:    0.07  Returns:    1.74  ObjC:    0.06  ObjA:   -0.29  
Step:7.63e+05  ExpR:    0.05  Returns:    1.40  ObjC:    0.03  ObjA:   -0.25  
Step:8.17e+05  ExpR:    0.05  Returns:    1.46  ObjC:    0.02  ObjA:   -0.36  
Step:8.71e+05  ExpR:    0.21  Returns:    2.96  ObjC:    0.25  ObjA:   -0.21  
Step:9.25e+05  ExpR:    0.21  Returns:    2.86  ObjC:    0.16  ObjA:   -0.33  
Step:9.79e+05  ExpR:    0.21  Returns:    2.97  ObjC:    0.10  ObjA:   -0.29  
| UsedTime: 1118 | SavedDir: ./StockTradingEnv-v2_PPO_0

 使用 evaluate_models_in_directory() 函数进行模型评估

| StockTradingEnv: close_ary.shape (339, 15)
| StockTradingEnv: tech_ary.shape (339, 120)
| StockTradingEnv: fund_ary.shape (339, 165)
cumulative_returns     1.084  actor_00000000007710_00000011_-0000.01.pth
cumulative_returns     1.411  actor_00000000061680_00000073_00000.27.pth
cumulative_returns     1.381  actor_00000000115650_00000132_00000.23.pth
cumulative_returns     1.167  actor_00000000169620_00000192_00000.07.pth
cumulative_returns     1.445  actor_00000000223590_00000252_00000.23.pth
cumulative_returns     1.210  actor_00000000277560_00000311_00000.00.pth
cumulative_returns     1.126  actor_00000000331530_00000371_00000.04.pth
cumulative_returns     0.965  actor_00000000385500_00000430_00000.05.pth
cumulative_returns     0.965  actor_00000000439470_00000490_00000.05.pth
cumulative_returns     0.965  actor_00000000493440_00000552_00000.05.pth
cumulative_returns     1.025  actor_00000000547410_00000612_00000.04.pth
cumulative_returns     1.339  actor_00000000601380_00000671_00000.05.pth
cumulative_returns     1.265  actor_00000000655350_00000728_00000.05.pth
cumulative_returns     1.258  actor_00000000709320_00000788_00000.07.pth
cumulative_returns     1.258  actor_00000000763290_00000847_00000.05.pth
cumulative_returns     1.258  actor_00000000817260_00000909_00000.05.pth
cumulative_returns     1.421  actor_00000000871230_00000970_00000.21.pth
cumulative_returns     1.421  actor_00000000925200_00001031_00000.21.pth
cumulative_returns     1.421  actor_00000000979170_00001091_00000.21.pth

cumulative_returns 表示从开始到结束智能体交易获得的收益。为了方便,我们直接显示了「本金的增长倍数」。

actor_00000000004998_00000003_00000.08.pth 是训练时保存的策略网络模型文件 actor,表示它是在环境中采样4998步,训练3秒,探索环境的得分是0.08的一个模型,它的实际得分是 1.093,表示在一段时间的交易后,本金增长了1.093倍。

连接Tensorboard可视化与调参

elegantrl,python,金融

只是自己留作纪念用,如有问题请指出文章来源地址https://www.toymoban.com/news/detail-783452.html

到了这里,关于基于Tushare和ElegantRL的量化交易实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AI时代Python量化交易实战:ChatGPT引领新时代

    ChatGPT让量化交易师率飞起来! 金融量化交易新模式 一本专注于帮助交易师在AI时代实现晋级、提高效率的图书 书中介绍了如何使用 ChatGPT 来完成量化交易的各个环节 并通过实战案例展示了ChatGPT在实际量化交易中的应用方法 量化交易新模式:让量化交易更高效、更快捷、更

    2024年02月04日
    浏览(50)
  • python数据分析及可视化(十六)金融量化(金融工具、金融分析、Tushare安装使用、双均线分析)

    金融就是对现有资源进行重新整合之后,实现价值和利润的等效流通。 比如小明想把手里的资金投资给小李,而小李有好的增值项目但是缺少资金,如果小李的项目创业成功,小明的资金就会增长。 在金融市场中可交易的金融资产,主要分为股票、期货、黄金、外汇、基金

    2024年02月10日
    浏览(75)
  • Python量化投资——金融数据最佳实践: 使用qteasy+tushare搭建本地金融数据仓库并定期批量更新【附源码】

    做量化投资或者对量化交易感兴趣的朋友应该都需要用到大量的金融数据,例如股票价格,基金净值、上市公司技术指标和财务指标等等。但是,如何有效、可靠地获取金融数据,并且有效地使用,却是一个令人头疼的问题。在这篇文章中,我想跟大家交流我的使用心得,分

    2024年02月04日
    浏览(54)
  • Python:Python编程:金融量化交易

    在金融量化交易中,下面几个模块是应用的比较广泛的 numpy (Numberic Python) : 提供大量的数值编程工具,可以方便的处理:向量矩阵等运算,相比高昂的 matlab , NumPy的出现使 Python得到了更多人的青睐。 scipy : 更多应用于 统计,优化,差值,数值积分,时频率转换等领域 Pandas

    2024年02月07日
    浏览(40)
  • Python量化交易策略--双均线策略及代码

            双均线策略是比较经典的策略,股票的价格均线是投资参考的重要指标。均线有快线和慢线之分,当快线向上穿过慢线则是金叉,一般执行买入操作,当快线向下穿过慢线时则形成死叉,一般执行卖出操作。基于这个基本思路,出于兴趣爱好,便使用python复现了这个

    2023年04月11日
    浏览(85)
  • 【python量化交易】qteasy使用教程04 -使用内置交易策略,搭积木式创建复杂交易策略

    @ 目录 使用内置交易策略,组合成复杂策略 开始前的准备工作 本节的目标 多重策略以及策略组合 定义策略组合方式 blender blender 示例 使用四则运算符定义blender表达式 使用逻辑运算符定义blender表达式: blender表达式中还可以包含括号和一些函数: blender 表达式中每个策略可

    2024年04月14日
    浏览(47)
  • 量化交易——python数据分析及可视化

    数据来源:tushare 数据字段包含:日期,开盘价,收盘价,最低价,最高价,涨跌 需要计算的数据:macd,diff,dea (1)计算指数移动平均值(EMA) 12日EMA的算式为 EMA(12)=前一日EMA(12)×11/13+今日收盘价×2/13 26日EMA的算式为 EMA(26)=前一日EMA(26)×25/27+今日收盘价×2/27 (

    2024年02月15日
    浏览(40)
  • 你应该知道的21大Python量化交易工具

           技术可用性的快速增长使个人交易者也能够进行系统和算法交易。下面为大家分享2022年 Python 量化交易使用最广泛的21大交易平台和框架、经纪自营商、数据提供商和其他有用的交易库等,这些交易库适用于搭建个人完整的量化分析和交易系统。 一、云交易平台    

    2023年04月08日
    浏览(44)
  • 量化交易与人工智能:Python库的应用与效用

    💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】 🤟 基于Web端打造的:👉轻量化工具创作平台 💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 量化交易是一种利用计算机算法执行交易策略的交易方法,它依赖于严格定义的规则和数学模型,而非人

    2024年02月05日
    浏览(54)
  • Python可视化在量化交易中的应用(13)_Seaborn直方图

    seaborn中绘制直方图使用的是sns.histlot()函数: sns.histplot(data,x,y,hue,weights,stat=‘count’,bins=‘auto’,binwidth,binrange,discrete,cumulative,common_bins,common_norm,multiple=‘layer’,element=‘bars’,fill,shrink=1,kde,kde_kws,line_kws,thresh=0,pthresh,pmax,cbar,cbar_ax,cbar_kws,palette,hue_order,hue_norm,color,log_scale,legend,ax

    2024年02月12日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包