将强化学习运用到量化投资中实战篇(执行模块开发)
强化学习股票投资执行模块(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)
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类,并设置价值神经网络和策略神经网络的模型文件路径。 强化学习股权投资执行模块:强化学习设置(二)
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强化学习学习到的价值神经网络和策略神经网络保存为文件。
** **
|