从零开始,用Python创建AI炒股机器人-技术篇(建议收藏)

定量交易

随着新技术的出现,算法交易越来越受欢迎,使得更多的定量投资者可以使用它。我过去曾写过关于 Java 算法交易系统的开发的文章。然而, Python 具有难以置信的强大的分析库,易于理解文档和实现。本文将向您介绍用Python 开发算法交易系统以及部署经过训练的AI模型来执行实时交易的核心组件。本文中介绍的这个项目的代码可以在 GitHub 上找到。

本文将分为以下几个步骤:

  • I:连接到经纪公司
  • II:贸易制度发展
  • III:AI 贸易模式发展
  • IV:AI 交易模式部署
  • (奖励):云部署

连接到经纪公司

第一步是连接到经纪公司,这将使我们能够接收有关我们感兴趣的证券交易的实时数据。在本文中,我将使用 Alpaca ,这是最简单的自由方式开始算法交易,并为我们的目的, AI 交易。创建帐户并转到仪表板以生成 API 密钥。

一旦你生成了你的 API 密钥,你就可以直接使用 python 。我创建了一个 helper 类来管理 API 连接。

class AlpacaPaperSocket(REST): def __init__(self): super().__init__( key_id='YOUR_KEY_HERE', secret_key='YOUR_SECRET_KEY_HERE', base_url='https://paper-api.alpaca.markets' )

这就是经纪连接,我们可以使用 AlpapaperSocket 类的实例作为对 API 的引用。下面我们将请求库存数据给我们的 AI 模型,但是如果您对如何请求库存信息感兴趣,现在可以在这里找到文档订单。对我来说,这是一个很重要的问题,你可以使用任何你想要的经纪公司。(显然,它提供了一个 API 来满足数据和订单请求。)

交易系统开发

现在我们已经与经纪公司建立了联系,我们可以建立我们的交易系统。我已经创建了一个新的设计模式,能够容纳系统的任何安全与不同的时间框架和不同的 AI 模型。听起来很复杂吗?别担心,它实际上是一个非常简单的设计。

主要的思想是构造一个抽象的 TradingSystem 类,这样我们就可以为我们希望交易的每种类型的系统实现自定义规则集。代码是相当直接的,允许我们初始化系统和线程一个无限循环。

class TradingSystem(abc.ABC):    def __init__(self, api, symbol, time_frame, system_id, system_label):        # Connect to api        # Connect to BrokenPipeError        # Save fields to class        self.api = api        self.symbol = symbol        self.time_frame = time_frame        self.system_id = system_id        self.system_label = system_label        thread = threading.Thread(target=self.system_loop)        thread.start()    @abc.abstractmethod    def place_buy_order(self):        pass    @abc.abstractmethod    def place_sell_order(self):        pass    @abc.abstractmethod    def system_loop(self):        pass

TradingSystem 是一个抽象类,有几个抽象函数。允许函数是抽象的,让它们在保持类似类结构的同时,在实现和实现之间有所不同。例如,假设你有一个投资组合管理系统和一个日交易系统。投资组合管理系统的 system _ loop 将包含与日交易系统的 system _ loop 不同的 AI 模型。抽象类 TradingSystem 的实现是非常直接的。为了本文的目的,我将构建一个投资组合管理系统,稍后您将看到我训练一个 AI 模型来执行交易。现在,考虑以下实现…

class PortfolioManagementSystem(TradingSystem): def __init__(self): super().__init__(AlpacaPaperSocket(), 'IBM', 604800‬, 1, 'AI_PM') def place_buy_order(self): pass def place_sell_order(self): pass def system_loop(self): pass

这个投资组合管理系统将容纳执行交易的 AI 。在我们开发了 AI 交易模型之后,我们将返回到这个实现。

AI 交易模型开发

对于这个系统,我将构建和训练 AI 模型作为我的系统的投资组合经理。其想法是训练神经网络在一定的负变化阈值下买进,并在一定的正变化阈值下卖出股票价格。我们本质上是在教我们的人工智能去买底泥和卖掉底泥。[请注意,我不建议您在实时系统中实现此功能,我们将进一步讨论此主题]为了培训此神经网络,我将基于 IBM 的每周历史市场数据构建和注释数据集,并创建一个称为信号的功能,该功能将根据更改阈值在集{0,1,-1}中产生值。

现在让我们来考虑这个神经网络的架构。我们将在反向传播之后保存权重,以便在成功测试模型之后,我们可以部署它。

# Class to develop your AI portfolio managerclass AIPMDevelopment:    def __init__(self):        # Read your data in and split the dependent and independent        data = pd.read_csv('IBM.csv')        X = data['Delta Close']        y = data.drop(['Delta Close'], axis=1)        # Train test spit        X_train, X_test, y_train, y_test = train_test_split(X, y)        # Create the sequential        network = Sequential()        # Create the structure of the neural network        network.add(Dense(1, input_shape=(1,), activation='relu'))        network.add(Dense(3, activation='relu'))        network.add(Dense(3, activation='relu'))        network.add(Dense(3, activation='relu'))        network.add(Dense(1, activation='relu'))        # Compile the model        network.compile(                      optimizer='rmsprop',                      loss='binary_crossentropy',                      metrics=['accuracy']                      )        # Train the model        network.fit(X_train.values, y_train.values, epochs=100)        # Evaluate the predictions of the model        y_pred = network.predict(X_test.values)        y_pred = np.around(y_pred, 0)        print(classification_report(y_test, y_pred))        # Save structure to json        model = network.to_json()        with open('model.json', 'w') as json_file:            json_file.write(model)        # Save weights to HDF5        network.save_weights('weights.h5')AIPMDevelopment()

我们将使用序列模型,然而,重要的是要理解幕后的数学,否则我们不能期望人工智能做出我们想要的决定。在这种情况下,选择激活函数是至关重要的,如果我们关闭我们的眼睛,并选择 ReLU 与二值交叉熵损失函数,我们将得到一个混淆矩阵看起来类似于以下…

为什么这样?让我们可视化 ReLU 函数…

如果我们将负输入设置为零,或者使用损失函数期望二值输出,我们如何期望我们的模型识别短信号?双曲正切函数和铰链损失在这里帮助。

更新我们的神经网络,认识到我们出错的地方,我们有以下模型。

# Class to develop your AI portfolio managerclass AIPMDevelopment: def __init__(self): # Read your data in and split the dependent and independent data = pd.read_csv('IBM.csv') X = data['Delta Close'] y = data.drop(['Delta Close'], axis=1) # Train test spit X_train, X_test, y_train, y_test = train_test_split(X, y) # Create the sequential network = Sequential() # Create the structure of the neural network network.add(Dense(1, input_shape=(1,), activation='tanh')) network.add(Dense(3, activation='tanh')) network.add(Dense(3, activation='tanh')) network.add(Dense(3, activation='tanh')) network.add(Dense(1, activation='tanh')) # Compile the model network.compile( optimizer='rmsprop', loss='hinge', metrics=['accuracy'] ) # Train the model network.fit(X_train.values, y_train.values, epochs=100) # Evaluate the predictions of the model y_pred = network.predict(X_test.values) y_pred = np.around(y_pred, 0) print(classification_report(y_test, y_pred)) # Save structure to json model = network.to_json() with open('model.json', 'w') as json_file: json_file.write(model) # Save weights to HDF5 network.save_weights('weights.h5')AIPMDevelopment()

在训练之后,我们发现分类报告有了显著的改进。

现在我们已经成功地开发了我们的模型,它是保存模型并将其加载到专门托管它的类中了。

# AI Portfolio Managerclass PortfolioManagementModel:    def __init__(self):        # Data in to test that the saving of weights worked        data = pd.read_csv('IBM.csv')        X = data['Delta Close']        y = data.drop(['Delta Close'], axis=1)        # Read structure from json        json_file = open('model.json', 'r')        json = json_file.read()        json_file.close()        self.network = model_from_json(json)        # Read weights from HDF5        self.network.load_weights('weights.h5')        # Verify weights and structure are loaded        y_pred = self.network.predict(X.values)        y_pred = np.around(y_pred, 0)        print(classification_report(y, y_pred))PortfolioManagementModel()

我们通过查看整个数据集的分类报告来验证神经网络的结构和正确加载的权重。

太棒了!现在,我们已经建立了一个 AI 投资组合经理来根据股价的变化做出购买、出售和持有的决定。这通常是最受追捧的交易系统之一。回到大学时代,当我在 futures 年的市场运行算法交易系统时,年回报率超过20%,第一个问题总是“但是,它怎么知道什么时候交易?”'.这是一个最难回答的问题,但当你能回答它的时候,你有一个有利可图的交易系统。开发一个有利可图的 AI 交易模型超出了这个项目的范围。然而,如果这篇文章得到足够的支持,我会很乐意写出我用来开发有利可图的 AI 交易模型的量化技术。

将 AI 模型部署到交易系统

在重新考虑抽象 TradingSystem 类的实现时,我们有了 PortfolioManagementSystem 。我更新了抽象函数以实现它们各自的目的。

class PortfolioManagementSystem(TradingSystem): def __init__(self): super().__init__(AlpacaPaperSocket(), 'IBM', 86400, 1, 'AI_PM') self.AI = PortfolioManagementModel() def place_buy_order(self): self.api.submit_order( symbol='IBM', qty=1, side='buy', type='market', time_in_force='day', ) def place_sell_order(self): self.api.submit_order( symbol='IBM', qty=1, side='sell', type='market', time_in_force='day', ) def system_loop(self): # Variables for weekly close this_weeks_close = 0 last_weeks_close = 0 delta = 0 day_count = 0 while(True): # Wait a day to request more data time.sleep(1440) # Request EoD data for IBM data_req = self.api.get_barset('IBM', timeframe='1D', limit=1).df # Construct dataframe to predict x = pd.DataFrame( data=[[ data_req['IBM']['close'][0]]], columns='Close'.split() ) if(day_count == 7): day_count = 0 last_weeks_close = this_weeks_close this_weeks_close = x['Close'] delta = this_weeks_close - last_weeks_close # AI choosing to buy, sell, or hold if np.around(self.AI.network.predict([delta])) <= -.5: self.place_sell_order() elif np.around(self.AI.network.predict([delta]) >= .5): self.place_buy_order()PortfolioManagementSystem()

让我们来谈谈 system _ loop 。system _ loop 初始化本周关闭、上周关闭、当前增量和日数的变量。无限循环(并发系统的线程)负责每天收集一次数据,并确定我们是否已经达到每周拆分。在达到每周拆分后,变量会被更新,我们会咨询我们的 AI 是否买卖。

24/7全天候运行的云部署

自然会出现的一个问题是“你是否希望我在我的电脑上运行这个 Python脚本?如果电源关闭了,我就会失去互联网等等…”。答案是,不,我不希望你整个星期都运行这个 Python脚本,我希望你利用云部署来托管它。这将允许您的软件有24/7的时间,同时减少在您自己的机器上运行它的复杂性。如果你有兴趣将你的模型部署到云上,你可以从 Google Cloud 上的算法交易系统部署(步骤将是 AI 交易机器人的同义词)的奇妙教程中完成这一点。

结论

这篇文章是为了让你开始开发人工智能股票交易机器人。我们讨论了如何连接到经纪公司,特别是 Alpaca 的这个例子。然后,我们创建了 TradingSystem 类本身及其继承字段,并在专门用于投资组合管理的系统中实现了该类。之后,我们建立了一个人工智能模型来进行交易决策,并讨论了在幕后缺乏对数学理解的问题。最后,我们将模型部署到实现的系统中,使我们的 AI 具有购买、销售和持有的能力。你可以对这个机器人进行各种升级,优化速度, AI 架构, P / L 报告等…然而,这是你可以在 Python 建立一个免费的人工智能股票交易机器人。

本文由未艾信息(www.weainfo.net编译,

(0)

相关推荐

  • 推荐算法(8)评测指标

    推荐算法(8)评测指标

  • AI + Blockchain = ?

    往期mixlab的文章更多的是聊技术与设计之间的mix,但其实技术之间也有很多值得我们思考的mix点.所以今天抽空聊聊技术之间的mix. 本篇文章作者们: shadow-ML00.Hanz-ML14 ...

  • 如何做中文文本的情感分析?

    这是本学期在大数据哲学与社会科学实验室做的第三次分享了.第一次分享的是:如何利用"wordcloud+jieba"制作中文词云?第二次分享的是:如何爬取知乎中问题的回答以及评论的数 ...

  • 利用遗传算法优化GANs

    GANs是在训练阶段最需要计算的密集型模型之一,因为它相当于同时训练两个神经网络.对于我的普通电脑来说,把gan训练到收敛是非常困难的. 遗传算法是根据大自然中生物体进化规律而设计提出的,是根据大自然 ...

  • (2条消息) 一篇文章让你彻底搞懂神经网络:从原理到优化如此简单

    0. 文章介绍了什么 介绍了神经网络的基础单元--神经元neurons, 在神经元中使用了常见的激活函数: sigmoid  神经网络中的神经元是如何连接和交互的 创建了一个包含身高和体重(特征)作为 ...

  • 使用 Pytorch 进行多类图像分类

    重磅干货,第一时间送达 关于数据集 此数据包含大小为150x150.分布在6个类别下的约25k图像. {'建筑物':0,'森林':1,'冰川':2,'山':3,'海':4,'街道':5} 训练.测试和 ...

  • 如何训练AI玩飞机大战游戏

    虽然没有谷歌强大的集群和DeepMind变态的算法的团队,但基于深度强化学习(Deep Q Network DQN )的自制小游戏AI效果同样很赞.先上效果图: 下面分四个部分,具体给大家介绍. /1 ...

  • 用 Python 撸一个 Web 服务器-第7章:重构——更好的组织代码

    通过前几章的学习,我们完成了 Todo List 程序的 todo 管理部分,实现了对 todo 的增.删.改.查基本操作,这也是几乎所有 Web 程序都具备的功能.我们当然可以按照目前的思路继续来实 ...

  • ESP32 使用MicroPython 控制Gopro Hero Black4

    这个实现的代码比较简单,我们先看看这个硬件,就是这个样子,很精美哦~因为不和国内市场强份额的话,就会做的很不错,算了.不说了 就是这个样子了,小屏幕很好嗷. 还是彩色的 https://docs.m5 ...

  • 华为集团斥巨资最新打造的python!整整478集,建议收藏

    兄弟!毫无套路!! 1.本套视频一共400集,本套视频共分4季 第一季 Python基础. 第二季. Python深入和扩展 第三季 网络编程.多线程.扩展库 第四季算法.Python源码.函数式编程 ...

  • 60 个 Python 闯关小例子,建议收藏

    Python小二 91篇原创内容公众号来源:https://github.com/jackzhenguo/python-small-examples一. 数字1 求绝对值绝对值或复数的模In [1]: ...

  • 终于有人把“缠论”说得如此清晰透彻,堪称炒股教科书,建议收藏

    ​​在投机市场,有些人即使短期赚钱,志得意满表象下其内心世界是虚弱不安的,眼神是迷茫的,对未来是缺乏信心的:而有些人即使阶段性做得不好,其思路是清晰的,目标是明确的,说话是低调的,眼神是淡定的,内心是 ...

  • 华为鸿蒙集团斥巨资最新打造的python!整整478集,建议收藏

    华为将为员工大幅涨薪基层员工薪资上调30% 福利分享: 本套视频共分4季 第一季 Python基础. 第二季. Python深入和扩展 第三季 网络编程.多线程.扩展库 第四季算法.Python源码. ...

  • 【Python】如何用Python来操作PDF文件,建议收藏

    今天这篇文章,我们不谈热点,毕竟最近谈论的热点有点多了,也有点腻了,我们来讲一些Python运用实践当中的小技巧,用Python来操作和处理PDF文件,通过本篇文章,读者朋友大概会学会 1. 通过Py ...

  • 总结2020年最全的投资杠杆炒股工具(建议收藏)

    2020年了,如何跑赢通胀,如何财富保值,如何理财成为当代人最头痛的问题.当我们的资金不足以囤房待涨,不足以买茅台股,不足以放银行吃利息的时候,炒股,杠杆炒股似乎是我们中年人最后的机会. 本人作为小散 ...

  • 极智嘉:一个AI仓储机器人领先企业的创新和进阶之路

    (极智嘉为中国移动机器人(AGV)产业联盟副理事长单位) 文/新战略机器人全媒体 熙文 作为一家AI仓储机器人的领先企业,极智嘉从进入市场就备受资本青睐和市场关注,近几年来,极智嘉时刻保持一种警醒的心 ...

  • 【微笔记】houdini使用python创建城市教程笔记II

    --  微资讯 · 微课程  -- 利用零碎时间,走上超神之路! 今天继续学习第二部分,使用python处理block和创建属性,批量处理导入的建筑模型.最大的感受是使用程序去处理批量重复的东西真TM ...

  • 【微笔记】houdini使用python创建城市教程笔记I

    --  微资讯 · 微课程  -- 利用零碎时间,走上超神之路! 昨天小编分享了houdini使用python制作城市的教程,讲解得非常不错,不过个人建议大家至少有一些python基础和houdini ...