Git Product home page Git Product logo

rl-stock's Introduction

📈 如何用深度强化学习自动炒股

💡 初衷

最近一段时间,受到新冠疫情的影响,股市接连下跌,作为一棵小白菜兼小韭菜,竟然产生了抄底的大胆想法,拿出仅存的一点私房钱梭哈了一把。

第二天,暴跌,俺加仓

第三天,又跌,俺加仓

第三天,又跌,俺又加仓...

drawing

一番错误操作后,结果惨不忍睹,第一次买股票就被股市一段暴打,受到了媳妇无情的嘲讽。痛定思痛,俺决定换一个思路:如何用深度强化学习来自动模拟炒股? 实验验证一下能否获得收益。

📖 监督学习与强化学习的区别

监督学习(如 LSTM)可以根据各种历史数据来预测未来的股票的价格,判断股票是涨还是跌,帮助人做决策。

drawing

而强化学习是机器学习的另一个分支,在决策的时候采取合适的行动 (Action) 使最后的奖励最大化。与监督学习预测未来的数值不同,强化学习根据输入的状态(如当日开盘价、收盘价等),输出系列动作(例如:买进、持有、卖出),使得最后的收益最大化,实现自动交易。

drawing

🤖 OpenAI Gym 股票交易环境

观测 Observation

策略网络观测的就是一只股票的各项参数,比如开盘价、收盘价、成交数量等。部分数值会是一个很大的数值,比如成交金额或者成交量,有可能百万、千万乃至更大,为了训练时网络收敛,观测的状态数据输入时,必须要进行归一化,变换到 [-1, 1] 的区间内。

参数名称 参数描述 说明
date 交易所行情日期 格式:YYYY-MM-DD
code 证券代码 格式:sh.600000。sh:上海,sz:深圳
open 今开盘价格 精度:小数点后4位;单位:人民币元
high 最高价 精度:小数点后4位;单位:人民币元
low 最低价 精度:小数点后4位;单位:人民币元
close 今收盘价 精度:小数点后4位;单位:人民币元
preclose 昨日收盘价 精度:小数点后4位;单位:人民币元
volume 成交数量 单位:股
amount 成交金额 精度:小数点后4位;单位:人民币元
adjustflag 复权状态 不复权、前复权、后复权
turn 换手率 精度:小数点后6位;单位:%
tradestatus 交易状态 1:正常交易 0:停牌
pctChg 涨跌幅(百分比) 精度:小数点后6位
peTTM 滚动市盈率 精度:小数点后6位
psTTM 滚动市销率 精度:小数点后6位
pcfNcfTTM 滚动市现率 精度:小数点后6位
pbMRQ 市净率 精度:小数点后6位

动作 Action

假设交易共有买入卖出保持 3 种操作,定义动作(action)为长度为 2 的数组

  • action[0] 为操作类型;
  • action[1] 表示买入或卖出百分比;
动作类型 action[0] 说明
1 买入 action[1]
2 卖出 action[1]
3 保持

注意,当动作类型 action[0] = 3 时,表示不买也不抛售股票,此时 action[1] 的值无实际意义,网络在训练过程中,Agent 会慢慢学习到这一信息。

奖励 Reward

奖励函数的设计,对强化学习的目标至关重要。在股票交易的环境下,最应该关心的就是当前的盈利情况,故用当前的利润作为奖励函数。即当前本金 + 股票价值 - 初始本金 = 利润

# profits
reward = self.net_worth - INITIAL_ACCOUNT_BALANCE
reward = 1 if reward > 0 else reward = -100

为了使网络更快学习到盈利的策略,当利润为负值时,给予网络一个较大的惩罚 (-100)。

策略梯度

因为动作输出的数值是连续,因此使用基于策略梯度的优化算法,其中比较知名的是 PPO 算法,OpenAI 和许多文献已把 PPO 作为强化学习研究中首选的算法。PPO 优化算法 Python 实现参考 stable-baselines

🕵️‍♀️ 模拟实验

环境安装

# 虚拟环境
virtualenv -p python3.6 venv
source ./venv/bin/activate
# 安装库依赖
pip install -r requirements.txt

股票数据获取

股票证券数据集来自于 baostock,一个免费、开源的证券数据平台,提供 Python API。

>> pip install baostock -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn

数据获取代码参考 get_stock_data.py

>> python get_stock_data.py

将过去 20 多年的股票数据划分为训练集,和末尾 1 个月数据作为测试集,来验证强化学习策略的有效性。划分如下

1990-01-01 ~ 2019-11-29 2019-12-01 ~ 2019-12-31
训练集 测试集

验证结果

单只股票

  • 初始本金 10000
  • 股票代码:sh.600036(招商银行)
  • 训练集: stockdata/train/sh.600036.招商银行.csv
  • 测试集: stockdata/test/sh.600036.招商银行.csv
  • 模拟操作 20 天,最终盈利约 400

drawing

多只股票

选取 1002 只股票,进行训练,共计

  • 盈利: 44.5%
  • 不亏不赚: 46.5%
  • 亏损:9.0%

drawing

drawing

👻 最后

  • 股票 Gym 环境主要参考 Stock-Trading-Environment,对观测状态、奖励函数和训练集做了修改。
  • 俺完全是股票没入门的新手,难免存在错误,欢迎指正!
  • 数据和方法皆来源于网络,无法保证有效性,Just For Fun

📚 参考资料

rl-stock's People

Contributors

dependabot[bot] avatar wangshub avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rl-stock's Issues

总体收益基本为负的RL_stock_trade_policy_Demo

将工程移植到baselines3,并调试运行成功,用sh.600036当日一个月前的所有数据训练,用最近一个月的数据测试,并尝试修改其回报修正策略,测试的结果是收益随价格运动而运动,收益曲线与价格曲线波动一致,不知问题在哪里?

还存在一个严重问题

发现一些股票的数据训练后会出现不买不卖的操作,不知道是不是某些数据有问题,这样导致不赚不赔,这样的结果没有意义

利润还要减去交易手续费

每个市场不一样,沪市有买入、卖出手续费,卖出盈利了还有税,都算成本,不然高频下来你会发现这部分费用占大头。

filename has "*" to be removed

for the file: get_stock_data.py
you need to change line 46
from
df_code.to_csv(f'{self.output_dir}/{row["code"]}.{row["code_name"]}.csv', index=False)
to
df_code.to_csv(f'{self.output_dir}/{row["code"]}.{row["code_name"].replace("*","")}.csv', index=False)

是不是缺少了文件夹啊

vis.ipynb里的open('./code-600000-603000.pkl', 'rb')这个文件夹怎么来的呢?有没有完整的jupyter运行代码

不懂就问

不懂就问,会不会是亏损的惩罚太大,而且不盈利没有惩罚才会有这么多不盈利不亏损的策略存在

tensorflow-gpu版本from1.14.0 to 1.15.2修改可能引起的不兼容问题

应该是gast、tensorboard、tensorflow-estimator的版本没有同步修改

cmd:pip install -r requirements.txt
Log:
ERROR: tensorflow-gpu 1.15.2 has requirement gast==0.2.2, but you'll have gast 0.3.3 which is incompatible.
ERROR: tensorflow-gpu 1.15.2 has requirement tensorboard<1.16.0,>=1.15.0, but you'll have tensorboard 1.14.0 which is incompatible.
ERROR: tensorflow-gpu 1.15.2 has requirement tensorflow-estimator==1.15.1, but you'll have tensorflow-estimator 1.14.0 which is incompatible.

汇报一个小小的BUG,

53行,写入文件,
df_code.to_csv(f'{self.output_dir}/{row["code"]}.{row["code_name"]}.csv'
当股票代码为*ST开头的时候, 会报错,去掉{row["code_name"]}之后正常。

如何自动运行

如何才能让轮子转起来,好比今天运行程序那未来如何操作,只能跑历史数据吗?如何让test里面的数据每日自动增加并且每天提供信号

想问一下tf的版本

我用的是tf-gpu1.15.2和tf-estimator1.15.1的版本,运行时报错
The name tf.ConfigProto is deprecated. Please use tf.compat.v1.ConfigProto instead
求问应该按照哪一个版本

萌新

为何我运行总是有各种问题,一堆又一堆?

框架上的问题

机器之心上看到该 proj ,过来扫了一眼。类似的工作,我两年前做过。指出一个比较严重的问题。

每个 episode 应该是随机取一个时间段跨度。为了便于对比 reward ,这个跨度的时间长度可以是相同的。现在这种划分 train-set 和 validation-set 的思考角度是错误的。想象一下,你的 simulate trade (game env) 没有随机性,RL Model 在多次迭代后,记住的是状态路径,不具备好的泛化能力。

另:推荐使用 tushare , 数据更加全面一些。

tensorflow-gpu 1.15.2 在win7上 运行扔是显示 tensorflow not include contrib

der.cc:44] Successfully opened dynamic library cudart64_100.dll
WARNING:tensorflow:
The TensorFlow contrib module will not be included in TensorFlow 2.0.
For more information, please see:

Data missing

之前main函数里面的代码在哪里,怎么找不到了

ModuleNotFoundError: No module named 'baostock'

 pip3 install baostock
Looking in indexes: https://mirrors.aliyun.com/pypi/simple/
Requirement already satisfied: baostock in ./venv/lib/python3.7/site-packages (0.8.8)
Requirement already satisfied: pandas>=0.18.0 in ./venv/lib/python3.7/site-packages (from baostock) (1.0.3)
Requirement already satisfied: pytz>=2017.2 in ./venv/lib/python3.7/site-packages (from pandas>=0.18.0->baostock) (2019.3)
Requirement already satisfied: numpy>=1.13.3 in ./venv/lib/python3.7/site-packages (from pandas>=0.18.0->baostock) (1.18.2)
Requirement already satisfied: python-dateutil>=2.6.1 in ./venv/lib/python3.7/site-packages (from pandas>=0.18.0->baostock) (2.8.1)
Requirement already satisfied: six>=1.5 in ./venv/lib/python3.7/site-packages (from python-dateutil>=2.6.1->pandas>=0.18.0->baostock) (1.14.0)

$ py3  get_stock_data.py
Traceback (most recent call last):
  File "get_stock_data.py", line 1, in <module>
    import baostock as bs
ModuleNotFoundError: No module named 'baostock'

萌新求问

大家是如何运行的,为啥运行不了啊,迷惑了,萌新想跑着试试

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.