V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
easternslope
V2EX  ›  程序员

在被股市一顿暴打后,研究了下如何用深度强化学习自动炒股 ~

  •  2
     
  •   easternslope ·
    wangshub · 2020-03-28 10:40:02 +08:00 · 18313 次点击
    这是一个创建于 404 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    💡 初衷

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

    第二天,暴跌,俺加仓

    第三天,又跌,俺加仓

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

    drawing

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

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

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

    drawing

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

    drawing

    🤖 OpenAI Gym 股票交易环境

    观测 Observation

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

    drawing

    动作 Action

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

    • action[0] 为操作类型;
    • action[1] 表示买入或卖出百分比;
    drawing

    注意,当动作类型 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

    📚 参考资料

    项目地址

    Github 源码地址: https://github.com/wangshub/RL-Stock

    160 条回复    2020-03-30 14:14:48 +08:00
    1  2  
    mrz3333
        101
    mrz3333   2020-03-28 17:07:15 +08:00 via iPhone
    我的天
    davidqw
        102
    davidqw   2020-03-28 17:40:44 +08:00   ❤️ 4
    靠水晶球谋生的人注定要吃碎在地上的玻璃
    123444a
        103
    123444a   2020-03-28 17:45:12 +08:00 via Android
    大哥在大陆融券卖出可以赚 20 万的
    Geekfake
        104
    Geekfake   2020-03-28 18:13:02 +08:00   ❤️ 2
    楼主都写了 Just for fun 一帮人在这搞认真还有指责?
    挺有意思的思路:) 手动点个赞
    lyminghao
        105
    lyminghao   2020-03-28 18:19:43 +08:00   ❤️ 3
    真没必要喷,谁都知道不可能用这个真的赚到钱,作为一个 RL 的入门小实验还是挺好的呀,感谢分享!
    hero158
        106
    hero158   2020-03-28 18:23:28 +08:00
    想得太简单了
    JCZ2MkKb5S8ZX9pq
        107
    JCZ2MkKb5S8ZX9pq   2020-03-28 18:29:49 +08:00
    这个月陆续买黄金股赚了点,个人的方法主要是控制每笔投入的比例。
    相比方法,理解游戏规则是更加基础的一步。这步做好了,才能规避一些模型设计上的问题。
    Windsooon
        108
    Windsooon   2020-03-28 18:46:14 +08:00
    一个小建议,如果你进入赌场但是选择同庄家赌的话,那么注定输多赢少。但是如果你能找到其他赌客和你对赌(例如某个赌局的结果打赌),那么你就有获胜的机会,因为你变相成为了庄家。同样的,你不需要去分析股票过往走势和数据,你可以去分析其他股民会怎么操作。例如,如果所有股民在 30 天平均线都会加仓的话,那么你在这个时候加仓就会相对安全。
    solidground
        109
    solidground   2020-03-28 19:02:59 +08:00
    @wangyzj lz 还不如用这本事去给研究社会学、历史学的人帮忙,说不定能拿国家项目。
    halaoo
        110
    halaoo   2020-03-28 19:11:40 +08:00
    没有通用的程式的,不用想了。否则证券公司自己都互相收割了。研究过一年多,K 线图筹码公式等等,还有什么战法都折腾过。很多人其实都知道庄家出千看得到底牌,都希望在庄家杀大赔小中,跟上小的蹭赢。其实,比较难,因为不同上市公司单操盘手都水准和技巧不一样。而且还受制于资金等等各项原因,寻求最优解,你根本不知道庄家的最优解是什么?

    中国经济危机,而且因为武汉这一次的事情,花费巨大。钱印了 50 万亿是一回事,但怎么赚?股市肯定是一个好而且必走的路。所以,前些天就应该进场了,会有一波上扬,再割韭菜,不然,重建武汉的钱何来?

    可以看看,武汉事件之前,外国资金在买哪些股?跟着傻老外,基本都能挣到钱。

    真正想搞的话,建议你去尝试 NBA,这个机会是最大的。
    bojue
        111
    bojue   2020-03-28 19:16:49 +08:00 via iPhone
    好洋气
    cweijan
        112
    cweijan   2020-03-28 19:21:44 +08:00
    没有用的, A 股的涨跌和相关政策关系很大, 你这样其实和所谓 K 线图差不多.. 一种信仰
    callmexiaodeng
        113
    callmexiaodeng   2020-03-28 19:31:01 +08:00
    @235777178 老哥有 link 吗
    callmexiaodeng
        114
    callmexiaodeng   2020-03-28 19:31:13 +08:00
    还不如玩 btc
    moqimoqide
        115
    moqimoqide   2020-03-28 19:33:36 +08:00
    巴甫洛夫走进一家酒吧,旁边有人手机铃响了。他惊呼一声:“Oh Shit,我忘了喂狗!”
    tsukiikekaoru
        116
    tsukiikekaoru   2020-03-28 19:36:39 +08:00 via iPhone
    被动投资,量化交易
    oddisland
        117
    oddisland   2020-03-28 19:36:56 +08:00
    炒股是艺术 不是科学
    cstome
        118
    cstome   2020-03-28 19:58:44 +08:00
    底价买入+拿得住 = 就没有不赚钱的

    什么是低价?
    A 股现在就是低价。
    235777178
        119
    235777178   2020-03-28 20:09:55 +08:00
    235777178
        120
    235777178   2020-03-28 20:10:09 +08:00
    darmau
        121
    darmau   2020-03-28 20:13:37 +08:00
    @lyminghao 谁都知道不可能用这个真的赚到钱

    如果你说的是真的,世界上就没有韭菜了。
    sorke
        122
    sorke   2020-03-28 21:33:38 +08:00
    进来,不错,mark,离开
    tushile928
        123
    tushile928   2020-03-28 21:39:39 +08:00
    现在国外一些公司都是这样干的,很多机器人在操作的。
    manami
        124
    manami   2020-03-28 21:41:22 +08:00
    A 股不按常规套路出牌,反人性反向操作就稳了,即使不赚钱也不会亏
    pb941129
        125
    pb941129   2020-03-28 21:50:40 +08:00
    作为一个量化🐶 一看这输入和结果 就知道代码(尤其是数据处理时候)八成有问题...
    做交易和做互联网运营数据或者自然数据分析还是很不一样的 需要处理很多人性中需要量化的东西
    pperlee
        126
    pperlee   2020-03-28 22:38:22 +08:00
    股票买的是未来。。不是过去。。所以不能拿以前的数据做论据。嗯,我是这样认为的,不知道 AI 怎么看。
    Allianzcortex
        127
    Allianzcortex   2020-03-28 23:40:40 +08:00
    HRT 和两个标准这些公司常年招 DL 相关 phd 做研究

    ![[email protected]_1l.jpg]( https://i.loli.net/2020/03/28/EJTuaC3zXQReDln.jpg)

    很多 DL 缺乏可解释性,用在推荐和广告上有偏差不要紧,敢真的把钱投进模型计算的结果需要相当大的勇气
    PbCopy111
        128
    PbCopy111   2020-03-29 00:21:39 +08:00
    你要是不对冲的话,还不如抛硬币来的好,不信你试试。
    eric
        129
    eric   2020-03-29 00:49:52 +08:00
    感谢你为市场提供流动性和 alpha 收益来源。
    yankebupt
        130
    yankebupt   2020-03-29 00:51:21 +08:00
    就是一課金玩家戲耍屌絲玩家的遊戲。
    雖然比較欣慰還有刷反向操作梗的
    但是動態賠率的賭場+強制延時就是爲了杜絕各種反向操作
    看明白就好了

    話說我到現在看得都不夠明白,有沒有
    iasuna
        131
    iasuna   2020-03-29 01:02:45 +08:00 via iPhone
    我同学就是搞 fintech 的 股票预测
    结论就是 想靠这个赚钱 不如去买彩票……
    alexapollo
        132
    alexapollo   2020-03-29 01:41:49 +08:00
    测试集只选取了这么小的样本,说明楼主也早已发现了测试集并不 work 。
    发这个帖子仅仅是掩耳盗铃、博取一波娱乐效应罢了。。
    realpg
        133
    realpg   2020-03-29 01:45:32 +08:00
    又有人发明了自动赔钱机啊
    afpro
        134
    afpro   2020-03-29 02:19:18 +08:00
    只靠大盘数据是不可能赚钱的 你算法再 NB 也没用 洗洗睡吧
    kaiki
        135
    kaiki   2020-03-29 02:45:23 +08:00
    建议写彩票分析 AI
    wmgx
        136
    wmgx   2020-03-29 03:21:31 +08:00 via Android
    最好的办法不应该是监控某个或者某几个专家的话吗?专家说买就卖,说卖就买🐶🐶🐶
    CodingPuppy
        137
    CodingPuppy   2020-03-29 06:00:38 +08:00 via Android
    kaiki
        138
    kaiki   2020-03-29 06:06:40 +08:00
    @wmgx 你说的这个很有道理,只需要一个 API 分析出目标专家们的建议,然后分类为买和卖,输出较少的那一方的值,自动炒股就成了
    cassyfar
        139
    cassyfar   2020-03-29 07:46:30 +08:00
    一直觉得 TA 就是坑韭菜的。专家们找就通过别的信息知道这股价有机率涨了,然后通过 TA 编写好听的理由告诉你去买。
    jamesxu
        140
    jamesxu   2020-03-29 08:44:34 +08:00 via iPhone
    股票这东西是不能预测的
    cue
        141
    cue   2020-03-29 08:59:59 +08:00 via iPhone
    说明楼主手里的钱还没亏完…………
    pggcharles
        142
    pggcharles   2020-03-29 09:47:47 +08:00
    我觉得像楼主一样的人肯定大有人在,只是是赚了钱还是亏了就不好说了
    crella
        143
    crella   2020-03-29 10:14:17 +08:00 via Android
    不是说股市预测是数学深渊吗?

    楼主搞这个之前,见到深海了没?(狗头
    xcold
        144
    xcold   2020-03-29 10:21:53 +08:00
    自从学会了理财,让原本并不富裕的家庭,雪上加霜~
    memorybox
        145
    memorybox   2020-03-29 10:34:44 +08:00
    哈,同道中人啊;

    虽然我一点也不相信将来 AI 投资会比长期拿者低估指数得到更高的收益;

    但是我们喜欢玩啊,Maybe 找到一个短期有效的策略呢;

    不过小赌怡情,不要下大注;

    楼主的思路非常 Nice,这个乐观好玩的投资心态值得赞一个;

    最后自推我自己开发的一个非常简陋、没有任何高科技含量的开源策略,这个策略目前正在经受市场上的狂风大浪,但还能稳稳的行船,欢迎大家来关注:

    https://github.com/brain-zhang/xianglong
    bruce2000
        146
    bruce2000   2020-03-29 11:41:46 +08:00
    正准备玩一下这个,看看
    meetcx
        147
    meetcx   2020-03-29 14:29:57 +08:00
    分析数据是有用的,但是前提是”真实且有效的数据”。
    你分析的随机变量全是”公开和无效的“所有股民都知道的信息。你发的那张参数表真的看笑了。
    甚至如果一个市场不公平,交易涉及了”内幕交易“你用什么办法预测都是徒劳。

    我的公司股票上市了,每股真实价值只值 1 美元。但是发行价为每股 5 美元,一群想暴富憨 P 股民争相买入又不能卖出(即使考虑卖出)把我公司股价涨涨跌跌的一路哄抬到每股 100 美元,此时我身家已经翻了 100 倍,我该怎么做呢?现在立马走不合时宜,有非法集资的嫌疑,是犯法的,要坐牢。安全的做法把护照办好,把这个只有我知道的破烂公司维持一段时间,维持到股价相对平稳,然后剩下的就是缓慢抛售股票换成美元,以免震荡市场,直到公司宣布破产。

    此时我在马尔代夫享受阳光,沙滩,美女。
    此时一个被套牢的斑秃程序员还在为我公司股价破产而黯然忧伤,觉得自己是不是哪里技术不过关,我下次要努力了。

    我笑笑,不说话。
    分析这些数据不如问一个你买入股票所在公司一个内部员工对公司的看法。
    qwertqwert12345
        148
    qwertqwert12345   2020-03-29 15:29:51 +08:00
    我猜你们这群评论的人 99%既没详细看楼主的帖子,也没看楼主的代码

    首先回复深度学习 orLSTM 等几个名词的时候就已经是弟弟了,因为楼主用的是传统 RL

    其次说楼主代码有问题的人,显然也没看过楼主的代码

    楼主的代码核心就是一句话调库,这显然只是一个练手的调包小项目,楼主的主要贡献是数据输入处理和结果展示

    把这个游戏项目映射到实际情况去发挥想象的人,也是弟弟,因为别人根本没想用到实际情况里,只是个自娱自乐的项目

    因此我之前评价这个项目是:楼主的结果可视化做的还行
    qing4587
        149
    qing4587   2020-03-29 18:21:20 +08:00
    你可以去外汇市场赚钱的,真的
    外汇市场很多自动交易软件,你会编程,把你的想法实现下很容易
    shiguiyou
        150
    shiguiyou   2020-03-29 19:27:20 +08:00
    根据我三四个月的炒股经验,这个标题一看就...股市没那么简单,太年轻
    cjh1095358798
        151
    cjh1095358798   2020-03-29 23:39:08 +08:00
    本来想说 too naive,很傻很天真的,看代码写出来了,精神可嘉。只是千万别出去宣传害人,最好你自己也不要用。先多看几本经典的书籍把,比如聪明的投资者,投资中最重要的事。看一看投资大佬们,是怎么看待市场的。
    ericgui
        152
    ericgui   2020-03-30 06:32:58 +08:00
    自动炒股就是自动亏钱
    Desiree
        153
    Desiree   2020-03-30 09:09:00 +08:00
    只要不是在 A 股,你的算法或多或少都能起到作用
    Banxiaozhuan
        154
    Banxiaozhuan   2020-03-30 11:01:23 +08:00
    之前读研究生的老师是研究这个的。 但是我没发现他很有钱。。。。。。
    虽然我觉得有些意思, 但是玩玩还可以。
    0x11901
        155
    0x11901   2020-03-30 11:02:16 +08:00
    ……根据 2013 年诺贝尔经济学奖得主尤金·法玛的“有效市场假说”,你这个东西其实并没有任何*用……
    shiguiyou
        156
    shiguiyou   2020-03-30 11:31:16 +08:00
    这是在预测人心(性)嘛?
    zichen
        157
    zichen   2020-03-30 11:52:08 +08:00
    1,想在股市赚钱,只要有小学生的数学基础就够了,股神这句话说的没错。
    2,炒股更多的是人性,而不是技术层面的。
    3,好行业,好公司,好价格
    4,涨的时候拿的住,跌的时候跑的快
    玩了几年美股,暂时就这些经验吧。4w 多的本,目前 11w 。
    jon
        158
    jon   2020-03-30 13:45:17 +08:00
    支持楼主,比那些装逼的强多了
    tzigone
        159
    tzigone   2020-03-30 13:53:07 +08:00
    济安线
    lyh404
        160
    lyh404   2020-03-30 14:14:48 +08:00
    我有一整套数据、模型、策略,从信号处理、形态识别、机器学习到深度学习各种模型,然而并没有什么卵用。
    1  2  
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2065 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:21 · PVG 23:21 · LAX 08:21 · JFK 11:21
    ♥ Do have faith in what you're doing.