将强化学习运用到量化投资中实战篇(执行模块开发)

将强化学习运用到量化投资中实战篇(执行模块开发)


强化学习股票投资执行模块(main.py)配置程序参数进行各种条件下的强化学习,根据输入因素使用学习器类进行强化学习,并存储学习到的神经网络。本节内容主要介绍这个模块的程序参数和强化学习执行逻辑。

1.设置程序参数

通过指定各种选项配置程序参数以执行强化学习。以下代码片段显示了程序参数设置部分。
强化学习股票投资执行模块:程序因子设置

import os
import sys
import logging
import argparse
import json

import settings
import utils
import data_manager

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--stock_code', nargs='+')
    parser.add_argument('--ver', choices=['v1', 'v2'], default='v2')
    parser.add_argument('--rl_method', 
        choices=['dqn', 'pg', 'ac', 'a2c', 'a3c'])
    parser.add_argument('--net', 
        choices=['dnn', 'lstm', 'cnn'], default='dnn')
    parser.add_argument('--num_steps', type=int, default=1)
    parser.add_argument('--lr', type=float, default=0.01)
    parser.add_argument('--discount_factor', type=float, default=0.9)
    parser.add_argument('--start_epsilon', type=float, default=0)
    parser.add_argument('--balance', type=int, default=10000000)
    parser.add_argument('--num_epoches', type=int, default=100)
    parser.add_argument('--delayed_reward_threshold', 
        type=float, default=0.05)
    parser.add_argument('--backend', 
        choices=['tensorflow', 'plaidml'], default='tensorflow')
    parser.add_argument('--output_name', default=utils.get_time_str())
    parser.add_argument('--value_network_name')
    parser.add_argument('--policy_network_name')
    parser.add_argument('--reuse_models', action='store_true')
    parser.add_argument('--learning', action='store_true')
    parser.add_argument('--start_date', default='20170101')
    parser.add_argument('--end_date', default='20171231')
    args = parser.parse_args()

上面有很多设置,下面让我们来看看它们中的每一个的含义。

Python 提示:您可以使用 argparse 模块中的 ArgumentParser 类轻松组合 Python 程序参数。您可以创建
ArgumentParser 类对象并使用 add_argument()
函数添加程序参数。您可以配置位置和关键字参数。关键字参数名称以“-”或“–”开头。可以将参数类型指定为type,可以作为参数输入的值作为choices,参数的默认值作为default。有关
ArgumentParser 类的更多详细信息,我们建议您查看官方 Python 文档。https://docs.python.org/en/3/library/argparse.html

  • –stock_code:将成为强化学习环境的股票代码。对于 A3C,输入多个股票代码。

  • –ver:指定输入数据 的版本。使用 v2 作为默认值。

  • –rl_method:设置强化学习方法。选择 dqn、pg、ac、a2c 或 a3c 之一。

  • –net:选择用于价值神经网络和策略神经网络的神经网络类型。dnn选择, lstm,之一cnn。

  • –num_steps:决定在lstm和中使用的步长cnn。通过这个大小,特征向量的大小被扩展。

  • –lr:设置学习率。0.01等0.001可以设置。

  • –discount_factor:设置折扣率。0.9,0.8等等。

  • –start_epsilon: 决定探索的开始速度。随着时代的进行,探索率会降低。1,0.5等等。

  • –balance:设置股票投资模拟的初始资金。

  • –num_epoches:指定要执行的 epoch 数。100,1000等等。

  • –delayed_reward_threshold:设置延迟补偿的阈值。0.05,0.1等等。

  • –backend:设置框架以用作 Keras 的后端。您可以选择tensorflow和。plaidml

  • –output_name:保存输出文件的文件夹名称,如日志、可视化文件、神经网络模型等。

  • –value_network_name: 值神经网络模型文件名

  • –policy_network_name: 策略神经网络模型文件名

  • –reuse_models:是否重用一个神经网络模型

  • –learning:有或没有强化学习

  • –start_date:图表数据和训练数据开始日期

  • –end_date:图表数据和训练数据结束日期

2. 强化学习设置

根据以下代码段中输入的程序参数继续强化学习设置。
示例 强化学习股票投资执行模块:强化学习设置 (1)

  # 设置 Keras 后端
    if args.backend == 'tensorflow':
        os.environ['KERAS_BACKEND'] = 'tensorflow'
    elif args.backend == 'plaidml':
        os.environ['KERAS_BACKEND'] = 'plaidml.keras.backend'

    # 设置输出路径
    output_path = os.path.join(settings.BASE_DIR, 
        'output/{}_{}_{}'.format(args.output_name, args.rl_method, args.net))
    if not os.path.isdir(output_path):
        os.makedirs(output_path)

    # 记录参数
    with open(os.path.join(output_path, 'params.json'), 'w') as f:
        f.write(json.dumps(vars(args)))

    # 日志设置
    file_handler = logging.FileHandler(filename=os.path.join(
        output_path, "{}.log".format(args.output_name)), encoding='utf-8')
    stream_handler = logging.StreamHandler(sys.stdout)
    file_handler.setLevel(logging.DEBUG)
    stream_handler.setLevel(logging.INFO)
    logging.basicConfig(format="%(message)s",
        handlers=[file_handler, stream_handler], level=logging.DEBUG)

backend您可以在参数中输入tensorflow和plaidml。
尽可能使用tensorflow。对于 plaidML,使用线程的 A3C 可能无法正常工作。
并将输出路径设置为输入output_name, rl_method,net参数

Python 提示:文件路径在 Windows 操作系统中由 s 分隔,\在 Linux 操作系统中由s
分隔/。由于每个操作系统的路径构造方法不同os.path.join(),建议在Python中用函数配置路径。os.path.join(‘parent’,
‘child’)在 Windows’parent\child’上变为在 Linux 上’parent/child’。 Python
提示:os.path模块具有与路径相关的各种功能。os.path.exists(path)该函数path检查是否 .
os.path.isdir(path)该函数path检查 a
是否存在并且是一个文件夹。os.path.isfile(path)检查path它是否存在并且是一个文件。 Python
提示:该os.makedirs(path)函数创建path包含在
中的文件夹,如果它不存在。path如果是/a/b/c且仅存在当前/a路径,则在该文件夹下创建一个文件夹,并在该/a文件夹下创建一个文件夹,这样路径最终存在。b/a/bc/a/b/c

在该路径中,首先输入的程序参数以 JSON 格式保存。将程序参数作为字典后,将其以 JSON 格式保存在 params.json 文件中。它会在此输出路径中创建一个日志文件。

Python 提示:JSON 代表 JavaScript Object Notation,读作 Jason。JSON 与 Python
的字典非常兼容。Python 的 json 模块中的loads()函数和函数dumps()允许您将 JSON 字符串转换为字典,将字典转换为
JSON 字符串。
Python提示:ArgumentParser对象中存储的程序参数vars()可以通过Python内置函数以字典的形式获取。

下一部分是导入强化学习所需的agent类和learner类,并设置价值神经网络和策略神经网络的模型文件路径。
强化学习股权投资执行模块:强化学习设置(二)


#日志,需要先配置 Keras 后端,然后再导入 RLTrader 模块
    from agent import Agent
    from learners import DQNLearner, PolicyGradientLearner, \
        ActorCriticLearner, A2CLearner, A3CLearner

  # 准备模型路径
    value_network_path = ''
    policy_network_path = ''
    if args.value_network_name is not None:
        value_network_path = os.path.join(settings.BASE_DIR, 
            'models/{}.h5'.format(args.value_network_name))
    else:
        value_network_path = os.path.join(
            output_path, '{}_{}_value_{}.h5'.format(
                args.rl_method, args.net, args.output_name))
    if args.policy_network_name is not None:
        policy_network_path = os.path.join(settings.BASE_DIR, 
            'models/{}.h5'.format(args.policy_network_name))
    else:
        policy_network_path = os.path.join(
            output_path, '{}_{}_policy_{}.h5'.format(
                args.rl_method, args.net, args.output_name))

之所以在此处导入代理和强化学习学习器类,是因为必须先设置日志设置,并且这些设置也适用于相应的类。
value_network_name如果指定,则将值神经网络模型路径准备为此models文件夹中的文件。<value_network_name>.h5这是在重用模型时方便地指定模型的选项。policy_network_name同样,如果指定,策略神经网络模型models将保存在文件夹中。value_network_name如果没有参数,policy_network_name则模型文件保存在输出路径中。

3.运行强化学习

下面展示了设置学习器类参数的部分。
强化学习股权投资执行模块:强化学习执行(一)

    common_params = {}
    list_stock_code = []
    list_chart_data = []
    list_training_data = []
    list_min_trading_unit = []
    list_max_trading_unit = []

    for stock_code in args.stock_code:
       # 准备图表数据、训练数据
        chart_data, training_data = data_manager.load_data(
            os.path.join(settings.BASE_DIR, 
            'data/{}/{}.csv'.format(args.ver, stock_code)), 
            args.start_date, args.end_date, ver=args.ver)

        # 设置最小/最大投资单位
        min_trading_unit = max(int(100000 / chart_data.iloc[-1]['close']), 1)
        max_trading_unit = max(int(1000000 / chart_data.iloc[-1]['close']), 1)

       # 设置常用参数
        common_params = {'rl_method': args.rl_method, 
            'delayed_reward_threshold': args.delayed_reward_threshold,
            'net': args.net, 'num_steps': args.num_steps, 'lr': args.lr,
            'output_path': output_path, 'reuse_models': args.reuse_models}

由于 A3C 并行对多只股票进行强化学习,因此它将股票代码、图表数据、训练数据以及最小和最大投资单位保持为一个列表。
最低投资单位是100,000 RMB以内的股票数量,最大投资单位是100万RMB以内的股票数量。
强化学习方法有共同的参数。common_params我们将这些常用参数存储在字典中。它存储了强化学习方法、延迟补偿阈值、神经网络类型、要在 LSTM 和 CNN 中使用的步数、学习率、输出路径以及是否重用神经网络模型。
下一步是创建并运行一个学习器类来执行强化学习。
强化学习股权投资执行模块:强化学习执行(二)

# 开始强化学习
        learner = None
        if args.rl_method != 'a3c':
            common_params.update({'stock_code': stock_code,
                'chart_data': chart_data, 
                'training_data': training_data,
                'min_trading_unit': min_trading_unit, 
                'max_trading_unit': max_trading_unit})
            if args.rl_method == 'dqn':
                learner = DQNLearner(**{**common_params, 
                'value_network_path': value_network_path})
            elif args.rl_method == 'pg':
                learner = PolicyGradientLearner(**{**common_params, 
                'policy_network_path': policy_network_path})
            elif args.rl_method == 'ac':
                learner = ActorCriticLearner(**{**common_params, 
                    'value_network_path': value_network_path, 
                    'policy_network_path': policy_network_path})
            elif args.rl_method == 'a2c':
                learner = A2CLearner(**{**common_params, 
                    'value_network_path': value_network_path, 
                    'policy_network_path': policy_network_path})
            if learner is not None:
                learner.run(balance=args.balance, 
                    num_epoches=args.num_epoches, 
                    discount_factor=args.discount_factor, 
                    start_epsilon=args.start_epsilon,
                    learning=args.learning)
                learner.save_models()
        else:
            list_stock_code.append(stock_code)
            list_chart_data.append(chart_data)
            list_training_data.append(training_data)
            list_min_trading_unit.append(min_trading_unit)
            list_max_trading_unit.append(max_trading_unit

它根据强化学习的类型确定强化学习学习器类别,并指定价值神经网络和策略神经网络的路径。通过创建学习器类run()的对象并调用该对象的函数来开始强化学习。根据训练数据的大小、时期和设备的性能,强化学习的执行时间可能会有很大差异。
当强化学习完成时,调用一个函数来保存学习到的神经网络模型save_models()。
这是创建 A3CLearner 类对象并为 A3C 强化学习调用run()和函数的部分save_models()。
强化学习股权投资执行模块:强化学习执行(三)

if args.rl_method == 'a3c':
        learner = A3CLearner(**{
            **common_params, 
            'list_stock_code': list_stock_code, 
            'list_chart_data': list_chart_data, 
            'list_training_data': list_training_data,
            'list_min_trading_unit': list_min_trading_unit, 
            'list_max_trading_unit': list_max_trading_unit,
            'value_network_path': value_network_path, 
            'policy_network_path': policy_network_path})

        learner.run(balance=args.balance, num_epoches=args.num_epoches, 
                    discount_factor=args.discount_factor, 
                    start_epsilon=args.start_epsilon,
                    learning=args.learning)
        learner.save_models()

A3CLearner 类以列表的形式接收图表数据和训练数据等参数。A3CLearner 类run()函数使用线程并行执行多个 A2C 强化学习。每个 A2C 强化学习共享一个价值神经网络和一个策略神经网络。
强化学习完成后,将A3C强化学习学习到的价值神经网络和策略神经网络保存为文件。

**在这里插入图片描述
**

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值