<jupyter_start><jupyter_text>Quantitative trading in China A stock market with FinRL<jupyter_code>import os
import time
import sys
from copy import deepcopy

import torch
import torch.nn as nn
import numpy as np
import numpy.random as rd
import pandas as pd<jupyter_output><empty_output><jupyter_text>Download training dataDownload training data (2.1MB) from github: `https://github.com/Yonv1943/Python/blob/master/scow`And save in current working path :`.`训练数据是中国A股 1113 天的股票价格，以及其他与交易相关的因子。<jupyter_code>!wget https://github.com/Yonv1943/Python/blob/master/scow/China_A_shares.pandas.dataframe<jupyter_output>--2022-04-02 16:30:34--  https://github.com/Yonv1943/Python/blob/master/scow/China_A_shares.pandas.dataframe
Resolving github.com (github.com)... 192.168.3.11
Connecting to github.com (github.com)|192.168.3.11|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘China_A_shares.pandas.dataframe.3’

China_A_shares.pand     [ <=>                ] 120.73K  --.-KB/s    in 0.1s    

2022-04-02 16:30:35 (1.12 MB/s) - ‘China_A_shares.pandas.dataframe.3’ saved [123624]<jupyter_text>金融仿真环境部分 FinRL相关代码来自[FinRL-Meta Demo_China_A_share_market](https://github.com/AI4Finance-Foundation/FinRL-Meta/blob/master/Demo_China_A_share_market.ipynb)我们将这1113天的中国A股数据，简单地分成：- 训练集占75%，0~834天- 测试集站25% 834~1113天分钟级甚至秒级的数据的数据量将会很多，我们这里只是一个简单的教程，因为数据太少，所以我们没有划分验证集（validation），请读者注意。这个的交易训练环境 env（或者说仿真器 simulator）的超参数配置如下：```class StockTradingEnv:    def __init__(self,         initial_amount=1e6,   初始本金        max_stock=1e2,   最大交易额度，买入或卖出100个单位        buy_cost_pct=1e-3,   交易损耗率设为 0.001        sell_cost_pct=1e-3,   交易损耗率设为 0.001        gamma=0.99,   强化学习的折扣比率，给人为设置的终止状态的reward进行补偿的时候会用到        beg_idx=0,    使用数据集的这个位置之后的数据        end_idx=1113   使用数据集的这个位置之前的数据     ):```cumulative_returns 表示从开始到结束智能体交易获得的收益。为了方便，我们直接显示了「本金的增长倍数」。如 1.19 表示在一段时间的交易后，本金增长了1.19倍。- random action 表示交易动作是随机的 `action=rd.uniform(-1, 1, action_dim)`，强化学习训练得到的智能体不应该比这个分数低。- buy all share 表示一直使用最大的额度买入所有股票 `action=np.ones(action_dim)`，能一定程度上反映大盘走势我们为了方便演示和学习，选择了较少的数据，从而把训练时间压缩到1000秒内。实际上，训练数据需要再多一个数量级。<jupyter_code>from demo_FinRL_ElegantRL_China_A_shares import StockTradingEnv
from demo_FinRL_ElegantRL_China_A_shares import check_env

check_env()<jupyter_output>| StockTradingEnv: close_ary.shape (279, 15)
| StockTradingEnv: tech_ary.shape (279, 120)

cumulative_returns of random action:      1.24
cumulative_returns of random action:      1.28
cumulative_returns of random action:      1.53
cumulative_returns of random action:      1.29

cumulative_returns of buy all share:      1.19
cumulative_returns of buy all share:      1.19
cumulative_returns of buy all share:      1.19
cumulative_returns of buy all share:      1.19<jupyter_text>深度强化学习部分 ElegantRL相关代码来自[ElegantRL helloworld](https://github.com/AI4Finance-Foundation/ElegantRL/tree/master/elegantrl_helloworld)我们使用ElegantRL库的代码，连接上FinRL的仿真环境，加载中国A股的数据，调用`run()`函数，训练一个自动交易智能体。`run()` 函数将会用到以下内容：``` env.pyclass StockTradingEnv()   来自FinRL库的交易仿真环境def build_env()   创建训练仿真环境def get_gym_env_args()   获得仿真环境的参数 net.pyclass ActorPPO   PPO算法的策略网络class CriticPPO   PPO算法的价值网络 agent.pyclass AgentPPO   PPO算法的主体class ReplayBufferList   经验回放缓存（存放强化学习的训练数据） run.pyclass Arguments   强化学习的超参数（可以看这个类的注释了解超参数的作用）def train_agent()   训练强化学习智能体的函数```**记得选则你训练用的GPU卡ID**，填上0表示用ID编号为0 的GPU卡`run(gpu_id=0)`。如果没有GPU，可以填`-1`，或者不做任何处理，代码会自己选择。我们用的数据比较少，用笔记本也能在500秒内完成训练，想要缩短训练时间，可以把训练步数改小`args.break_step = int(5e5)`  Import modules<jupyter_code>from demo_FinRL_ElegantRL_China_A_shares import StockTradingEnv
from demo_FinRL_ElegantRL_China_A_shares import get_gym_env_args
from demo_FinRL_ElegantRL_China_A_shares import AgentPPO
from demo_FinRL_ElegantRL_China_A_shares import Arguments
from demo_FinRL_ElegantRL_China_A_shares import train_agent

def run(gpu_id=-1):
    env = StockTradingEnv()
    env_func = StockTradingEnv
    env_args = get_gym_env_args(env=env, if_print=False)
    env_args['beg_idx'] = 0  # training set
    env_args['end_idx'] = 834  # 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 = 2 ** -14
    args.break_step = int(5e5)

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

run()
训练结束后，会有很多策略网络的模型文件保存在 `| Arguments Remove cwd: ./StockTradingEnv-v2_PPO_-1`
    
你也可以在训练前，修改这个超参数，自己选择保存目录位置`args.cwd=./current_working_directory`

我接下来使用函数`evaluate_models_in_directory(dir_path='./StockTradingEnv-v2_PPO_-1')`评估保存在目录中的模型文件。
from demo_FinRL_ElegantRL_China_A_shares import evaluate_models_in_directory

evaluate_models_in_directory(dir_path='./StockTradingEnv-v2_PPO_-1')<jupyter_output>| evaluate_models_in_directory: gpu_id -1
| evaluate_models_in_directory: dir_path ./StockTradingEnv-v2_PPO_-1
| StockTradingEnv: close_ary.shape (279, 15)
| StockTradingEnv: tech_ary.shape (279, 120)
cumulative_returns     1.093  actor_00000000004998_00000003_00000.08.pth
cumulative_returns     1.067  actor_00000000059976_00000033_00000.32.pth
cumulative_returns     1.107  actor_00000000114954_00000062_00000.40.pth
cumulative_returns     1.090  actor_00000000169932_00000093_00000.42.pth
cumulative_returns     1.080  actor_00000000224910_00000122_00000.50.pth
cumulative_returns     1.147  actor_00000000279888_00000152_00000.58.pth
cumulative_returns     1.257  actor_00000000334866_00000183_00000.62.pth
cumulative_returns     1.295  actor_00000000389844_00000213_00000.67.pth
cumulative_returns     1.316  actor_00000000444822_00000243_00000.73.pth
cumulative_returns     1.299  actor_00000000499800_00000273_00000.77.pth
{'fraction_non_alphanumeric': 0.08958369927981732, 'fraction_numerical': 0.09819076058317232, 'mean_word_length': 5.827338129496403, 'pattern_counts': {'":': 0, '<': 15, '<?xml version=': 0, '>': 15, 'https://': 5, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 2, 'substrings_counts': 11, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '169240', 'license': 'Apache-2.0', 'n_tokens_mistral': 3008, 'n_tokens_neox': 2768, 'n_words': 333, 'path': 'examples/demo_FinRL_ElegantRL_China_A_shares.ipynb', 'repo_name': 'clairvoyant/ElegantRL', 'size': '5697'}