量化交易 (Quantitative trading) - 页 34

 

第八部分。强化学习交易策略。 DQN:QNetwork、QRNNNetwork


第八部分。强化学习交易策略。 DQN:QNetwork、QRNNNetwork

大家好,我是 Denis,您正在观看“Close to AlgoTrading”。在本视频中,我们将简要介绍强化学习代理之前的环境。我们还将简要介绍 Q-Learning 和 DQN 代理。然后,我们将继续为来自 tf-agents 库的 rDQN 代理实施主要学习步骤,并讨论测试结果。

首先,让我们回顾一下我们在上一个视频中创建的交易环境。在那个环境中,我们使用合成生成的数据。然而,在这个更新版本中,我们的环境将接收一个以历史数据作为输入参数的数据框。环境的 observation_spec 是一个有两个键的字典:“Price”和“Pos”。 “价格”键包含 20 个元素,包括开盘价、收盘价、最高价、最低价和交易量数据。 “Pos”键包含有关我们未平仓头寸的信息。

在每一集开始时,我们从数据中随机选择 20 个价格片段。这一变化使我们的强化学习代理能够从真实的历史数据中学习。

继续,让我们讨论 Q-Learning 和 Q-Table 的概念。 Q-Learning 涉及为每一对(状态,动作)分配一个 Q 值。该表称为 Q 表,代理使用它来选择当前状态下具有最大 Q 值的动作。智能体探索环境,接收奖励,并根据观察到的奖励更新 Q 值。

为了更新 Q 值,我们使用一个涉及旧 Q 值和未来 Q 值的公式。我们通过在 Q 表中查找下一个状态的最大 Q 值来计算未来的 Q 值。使用获得的未来 Q 值,我们更新与起始对(状态、动作)关联的 Q 值。

然而,在我们的例子中,金融市场有一个非常宽的状态空间,使得使用 Q-Table 是不切实际的。为了克服这一挑战,我们可以使用深度神经网络来预测给定状态的 Q 值。这种称为 DQN 代理(深度 Q 网络代理)的方法使用 Q 网络,其中通过反向传播最小化损失来更新 Q 值。 DQN 代理中使用的损失函数由特定方程给出。

现在我们对 Q-Learning 和 DQN 代理有了很好的了解,让我们继续使用 tf-agents 库为 rDQN 代理实现主要学习步骤。

整体训练算法遵循以下步骤:

  1. 创造环境。
  2. 创建代理。
  3. 使用一些策略从环境中收集数据。
  4. 使用收集的数据训练代理。
  5. 验证代理的性能。
  6. 从步骤 3 开始重复。

创建环境是一项简单的任务。我们将我们的交易环境包装到 TFPyEnvironment 中,它允许与 tf-agents 无缝集成。

接下来,我们为 DQN 代理创建一个 Q-Network。 tf-agents 库提供了一个 Q-Network 类,我们可以使用它来定义我们的 Q-network。我们定义了一个简单的 Q 网络,其中包含一个由 40 个神经元组成的隐藏全连接层。由于我们的观察是一个字典,我们还为它定义了一个简单的预处理层。

创建 Q-Network 后,我们继续创建 DQN 代理。我们实例化 tf_agents.agents.dqn.dqn_agent 类,将我们的 Q 网络作为参数传递。我们还定义了用于训练模型的优化器和损失函数。

为了训练代理,我们需要来自环境的数据。我们使用策略收集这些数据,对于这一步,我们可以随机选择操作。 DQN agent有两个策略:agent.policy,用于评估部署;agent.collect_policy,用于数据收集。

数据收集涉及获取当前状态、选择动作、接收下一个状态和奖励,以及将此信息存储在缓冲区中。我们收集多个步骤或情节,形成轨迹。 tf-agents 库提供了一个名为 DynamicEpisodeDriver 的驱动程序,它会收集步骤直到剧集结束。驱动程序更新观察者,包括回复缓冲区。

为了存储数据,我们可以使用 tf-agents 库中常用的 TFUniformReplayBuffer。我们定义缓冲区将存储的数据元素的规范、批处理大小以及每个批处理段的最大长度。

一旦数据收集步骤完成,我们就可以训练我们的代理。代理需要访问重播缓冲区。我们创建了一个 tf.data.Dataset 管道来将数据提供给代理。回放缓冲区的每一行都存储一条轨迹,但 DQN 代理需要当前和下一个观察值来计算损失。因此,我们将 num_steps 参数设置为 2,这允许数据集管道为批次中的每个项目采样两行。

至此,我们已准备就绪,可以在同一数据上训练两个 DQN 智能体并评估它们的性能。一个代理使用简单的 Q-Network,而另一个使用 QRNNNetwork。两个代理都使用 200 天的历史价格数据进行训练。

在 700 个训练步骤之后,我们观察到简单的 Q-Network 智能体并没有学到太多东西,而且大部分显示出负平均回报。然而,QRNNNetwork 代理大多显示正平均回报。这一结果符合预期,因为 RNN 代理可以捕获数据中的一些动态并更快地学习。

虽然这个简单的实验为使用强化学习构建盈利代理提供了一些希望,但仍然需要考虑其他指标来评估代理的性能。我们将在以后的视频中探讨这些内容。

感谢您的收看,我们下集再见。

Part VIII. Reinforcement Learning Trading Strategy. DQN: QNetwork, QRNNNetwork
Part VIII. Reinforcement Learning Trading Strategy. DQN: QNetwork, QRNNNetwork
  • 2020.10.31
  • www.youtube.com
This is the part VIII of the Deep Learning Trading Strategy from the beginning to the production series.In this video we are going to explore the training st...
 

第九部分强化学习交易策略。 DQN:基于代理策略测试交易策略


第九部分强化学习交易策略。 DQN:基于代理策略测试交易策略

我很高兴地宣布,我们已经达到了我们旅程中的一个重要里程碑:测试我们的战略。为此,我们将利用一个简单的回溯测试 Python 框架来进行我们的测试。首先,您可以通过执行命令“pip install”后跟框架名称来安装框架。

该框架的作者提供了一个简单的示例来演示如何有效地使用它。然而,在我们深入研究之前,我们需要实施我们自己的策略。让我们从初始化和定义策略所需的所有变量开始。

一个有趣的方面是我们可以使用 TensorFlow API 加载我们保存的策略。由于我们使用的是 QRNNNetwork,因此我们需要获取策略的初始状态。因此,我们已经实现了初始化函数。现在,是时候实现“next”功能了,每个新步骤都会调用该功能。一开始,我们需要收集前 10 天的数据,之后,我们可以提供我们的观察字典。在每一步中,我们都会更新观察结果并将其传递给策略。

一旦我们创建了观察字典,我们就需要创建一个时间步长对象,因为我们的策略模型需要它作为输入。为了促进这个过程,我创建了一个简单的函数,将我们的观察数据转换为 timestep 对象。这里的关键元素是观察数据和 step_type。获得我们的时间步长对象后,我们可以从策略中检索一个动作。如您所见,如果 step_type 等于 0,“runPolicy”函数会重置策略状态并返回操作和新的 policy_state。

接下来,我们需要更新我们的位置状态并执行操作。最后,在“下一个”函数的末尾,我们增加计数器并将所有内容重置为初始状态以模拟新剧集的开始。伟大的!我们成功地实施了我们的战略。现在,我们需要一些数据用于测试目的。我们可以使用 panda_datareader 库从雅虎财经检索每日数据。让我们首先使用一年的历史数据测试我们对英特尔股票的策略。

我们创建一个回测对象并开始测试。测试结果显示回报率为 106%,令人印象深刻。不过需要注意的是,回测框架是从100%开始计算的,也就是说我们的实际收益只有6%。尽管如此,考虑到我们的政策没有经过广泛培训,这并不是一个坏结果。为了提供更全面的评估,让我们也测试一下我们对 AMD 股票的策略。如您所见,AMD 的结果显示下降了大约 40%。因此,我们可以并排比较我们的策略在 AMD 和英特尔股票上的表现。

现在您知道如何将代理策略与回测框架一起使用了。同样,如果您在真实交易环境中使用 Python,则可以以相同的方式使用该策略。但是,对于使用其他语言的用户,您可以使用 Flask 框架部署策略并通过 REST API 访问它。

我希望您发现这些视频有趣且内容丰富。如果你这样做了,请考虑订阅,我们下一集见。

Part IX Reinforcement Learning Trading Strategy. DQN: Testing Trading Strategy based on Agent Policy
Part IX Reinforcement Learning Trading Strategy. DQN: Testing Trading Strategy based on Agent Policy
  • 2020.12.13
  • www.youtube.com
This is the final episode of the Deep Learning Trading Strategy from the beginning to the production series.In this video we are going to see how to use the ...
 

什么是量化交易系统?结构和描述。


什么是量化交易系统?结构和描述。

大家好!我希望你们一切都好。自从我上次发布视频以来已经有一段时间了,但我想向你保证,我没有忘记你。今天,我很高兴开始一个有趣的新话题:自动交易系统的软件架构。

在我们深入研究软件架构的细节之前,让我们先了解什么是交易系统以及它由什么组成。在本视频中,我们将探索自动交易系统的结构和元素。现在,俗话说,“太阳底下并无新鲜事”。当我开始我在这个领域的旅程时,我正在寻找一个结构良好的交易系统描述。我想要的东西可以让人们很容易理解要实施哪些块以及如何创建强大的软件解决方案。

我偶然看到 Rishi K. Narang 的一本书,名为“黑匣子内部”,他在书中描述了一个由五个常见模块组成的量化系统:阿尔法模型、风险模型、交易成本模型、投资组合构建模型和执行模型。此外,还有一个更重要的块:数据。

让我们仔细看看这个结构,从数据块开始。虽然数据块在技术上不是交易系统的一部分,但它作为系统所有组件所依赖的氧气起着至关重要的作用。数据块包含交易系统所需的各种类型的数据。这些数据可能来自不同的来源,例如交易所、监管机构、新闻机构,以及其他相关来源,例如微观经济数据、经纪人费用或投资组合信息。

现在我们了解了数据块,让我们探索交易系统的元素以及它们之间的关系。在图中,您可以看到代表信息流的箭头。阿尔法模型、风险模型和交易成本模型不做最终决定;相反,它们为投资组合构建模型提供信息,而后者又会触发执行模型。重要的是要注意,有些策略只存在这些元素的一个子集,并且元素之间的关系可能会有所不同。然而,这种结构使我们能够全面了解交易系统的主要元素。

此结构中的第一个元素是 alpha 模型。 alpha 模型代表旨在预测未来结果的交易理念或策略。通常,此模型的输出是回报或方向预测。有两种著名的交易模型类型:基于价格数据和技术分析的技术模型,以及利用财务数据和基本面分析的基本面模型。我们还可以拥有结合了两者方面的混合模型。不管复杂程度如何,alpha 模型的主要目的是以预测的形式提供建议。

接下来,我们有风险模型。风险模型旨在帮助减少或尽量减少可能导致损失的因素。风险模型可以分为两类。第一种类型侧重于调整头寸以降低风险,采用硬调整或复杂函数等策略。这种类型的风险模型的输出是头寸规模。第二种风险模型旨在减轻特定类型的风险,例如市场方向风险。在这种情况下,该模型可能会建议将对冲头寸作为输出。

第三个要素是交易成本模型。该模型提供有关与执行交易相关的成本的信息。主要有三个成本:佣金和费用、滑点和市场影响。交易成本模型的范围从返回固定成本值的简单模型到更复杂的模型,如旨在尽可能准确地预测实际成本的二次成本函数。下图展示了不同成本函数的工作原理。

一旦我们拥有了提供信息的所有元素,我们就可以继续构建投资组合模型。该模型从 alpha 模型、风险模型和交易成本模型中获取输入,并决定如何在不同资产之间分配资金。它旨在根据某些目标函数构建投资组合。有两种主要类型的投资组合构建模型:基于规则的模型(例如,等权重、等风险、决策树方法)和投资组合优化器。后者涉及优化目标函数以实现投资组合中更优化的资产配置。

最后,我们有执行模型,它从投资组合构建模型中接收信息,并专注于以尽可能最好的价格执行订单。有多种类型的执行模型,从简单的市场或限价单到分析市场微观结构和利用机器学习算法的更复杂的模型。

对量化交易系统的主要元素的简要描述到此结束。我希望本概述能让您更好地了解交易系统结构及其总体运作方式。

在接下来的视频中,我将尝试根据这个描述创建一个软件系统架构。如果您觉得这个话题很有趣,请考虑订阅该频道以获取未来的更新。感谢您的收看,我们下个视频再见。
What is a Quantitative Trading System? Structure and description.
What is a Quantitative Trading System? Structure and description.
  • 2019.10.14
  • www.youtube.com
This video briefly describes the common structure of a Quantitative Trading System. Also, it provides the information about the relationships between the ele...
 

本土交易环境的高级设计!


本土交易环境的高级设计!

大家好!我叫 Denis,您正在观看“Close to AlgoTrading”。

在上一个视频中,我们讨论了算法交易系统的通用结构。今天,我想为本土交易环境创建一个简单的高级设计。

让我们首先确定我们对环境的期望。我们希望将来能够添加新的策略和数据源。可扩展性很重要,因为我们目前专注于股票市场,但将来可能会冒险交易加密货币。因此,我们需要支持新市场。此外,我们希望能够灵活地轻松更改系统内的组件。

现在,让我们看一下交易环境的整体结构。

两个主要组成部分是数据和交易系统。我们还希望包括一个用户界面来有效地控制环境。作为附加块,让我们考虑合并一个模拟系统。

数据组件驱动整个系统。最初,我们计划使用来自经纪人的数据和硬盘上的文件。但是,我们稍后可能会决定访问不同的数据库和新闻机构。由于我们要支持多个数据源,因此我们需要适应不同的驱动程序。

驱动程序提供简单的功能,例如读取和写入数据、打开或关闭连接等。然而,我们不希望我们的交易系统直接与司机的 API 交互。为了解决这个问题,我们引入了一层数据处理程序。

数据处理程序直接与驱动程序一起工作并实现逻辑功能,例如数据序列化、反序列化和转换为特殊格式。虽然我们有一组数据处理程序,但我们的应用程序层仍然需要一个统一的接口。

为了提供这些接口,我们引入了数据管理器和订单管理器。数据管理器为处理数据源提供了一个通用接口,而订单管理器为订单执行提供了一个通用接口。通过利用这两个接口,系统可以访问各种数据源和代理服务。

这是一个重要的方面。我们定义提供通用接口来访问数据源的组件。这意味着如果我们的交易系统想要检索新闻,例如,它将使用相同的接口,无论源是我们的经纪人还是数据库。这种设计保证了当我们切换数据提供者时接口保持不变。因此,我们可以在不中断应用程序功能的情况下添加新的数据源或更改代理。

现在我们已经设计了数据处理部分,让我们关注数据的主要用户——交易系统。如果您看过我之前的视频,您就会熟悉交易系统的五个模块:Alpha 模型、风险模型、交易成本模型、投资组合构建模型和执行模型。这些块利用数据管理器和订单管理器来访问数据和代理服务。

我们已经描述了数据和交易系统组件,但现在我们需要定义谁将控制这一切。我们需要一个负责整个系统的组件——一个基础应用程序。该应用程序将处理启动顺序、驱动程序和组件初始化,并实现主状态机。

在定义了主应用程序之后,我们需要考虑用户界面。它可以是 PC 界面或 Web 界面,但通常最好将前端与后端分开。为此,我们在 GUI 和核心应用程序之间创建了一个通信层。

此外,我们需要包含一个记录器组件。该组件实现记录器接口并将日志存储在数据库或日志文件中。我们还可以利用基于网络的监控系统来跟踪我们的环境,它可以直接访问数据库服务器并从那里读取数据。前端应用程序可以使用数据管理器访问数据,使用订单管理器与代理服务交互。

最后,我们不要忘记手动执行订单的可能性。我们也可以将该功能集成到系统中。

虽然我们没有深入研究本视频中的模拟环境,但它可以类似于附加代理服务的方式实现,而无需对现有系统进行任何更改。

看看我们交易环境的设计,我们可以自信地说它使我们能够实现我们的目标。我们将我们的应用程序划分为单独的域,并通过接口层将它们连接起来。数据和订单管理器提供通用接口,简化了对资源的访问。通过这种设计,我们可以很容易地改变数据供应商或经纪人,并使用不同的用户界面。我们还可以对系统的特定部分进行更改,而无需更新整个应用程序。

今天就到此为止。如果我遗漏了什么或者您对此设计有任何想法,请留下您的评论并且不要忘记订阅此频道。下个视频见!

High-Level Design of a Homegrown Trading Environment!
High-Level Design of a Homegrown Trading Environment!
  • 2019.11.01
  • www.youtube.com
In this video I tried to create a high-level software design of a homegrown trading environment.You will see how we can split the system into different domai...
 

交易环境 IB API - QT C++ - Flask - RL 模型。完整的工作示例。


交易环境 IB API - QT C++ - Flask - RL 模型。完整的工作示例。

我叫 Denis,欢迎来到 Close to Algo Trading。今天,我有一个特别的视频,我将在其中演示我们在前几集中讨论的所有组件如何在真实交易中协同工作。您可以在 GitHub 上找到所有源代码并亲自试用。

对于此演示,我将使用 Interactive Brokers API 和我名为 IBTrader 的旧项目。我多年前就开始使用 IBTrader,但一直没有时间完成它。但是,我现在正在考虑更新该项目。如果您对这个特殊项目感兴趣,请在本视频的评论部分告诉我。那么,让我们深入了解我们将在本视频中做什么。我们将从简要更新和概述我们的强化学习环境和代理开始。然后,我将简要介绍如何使用 Flask 部署模型。

由于我们将使用 Qt 应用程序连接到代理,因此我们需要使用 REST API 与我们的模型进行交互。在视频快结束时,我们将看到所有这些部分如何无缝地协同工作。

在我们开始之前,我建议您观看我之前的视频以更好地理解此处讨论的概念。如果您已经看过这些视频,您可能还记得如何使用 TF-Agent 库创建 RL 代理。我已针对此演示对代理和环境进行了一些更改。代理仍然是DQN,就像我们之前使用的一样,但是现在我们将使用QNetwork而不是QRnnNetwork。同样,我简化了环境。我们现在没有使用多天的历史数据,而是只有当天的价格观察。

然而,仅仅依靠目前的观察并不理想。为了解决这个问题,我们将把我们的观察从一天转变为包括三个历史日。我们可以通过使用 tf-agent 环境包中的 history 包装器并将 history_length 参数设置为 3 来实现这一点。现在,如果我们检查环境的观察结果,我们会发现我们将三个正常观察结果组合在一起。每个观察值都包含 OHLC 数据(开盘价、最高价、最低价、收盘价)以及交易量。

为了确保范围一致,我进行了一些转换,现在我们的输入数据应该代表对数价格百分比变化。最后,我们需要为我们的模型提供三个观察值:当前日期和两个历史日期。我们还需要记住过去几天的位置状态。代理经过培训后,我们将拥有一个可以预测诸如买入、卖出、跳过或平仓等操作的策略。该策略是使用神经网络实现的,我们可以使用直接 API 来使用它。

但是,如果我们不想将我们的应用程序与推荐模型紧密耦合怎么办?或者如果我们的模型是用 Python 实现的并且我们想在不同的应用程序中使用它怎么办?为了解决这个问题,我们可以使用 Flask 将我们的模型部署为小型 Web 服务。 Flask 是一个用 Python 编写的微型 Web 框架。我为这个视频选择了 Flask,因为它很简单,不需要太多设置时间。它还允许我们使用 JSON 在我们的应用程序和模型之间传输数据。

要调试和部署我们的 Flask 应用程序,我们可以使用 Dockerfile。 Microsoft 有一个关于如何创建 Dockerfile 的很好的教程,因此请查看描述中的链接以获取更多详细信息。我们的 Flask 应用程序将有一个名为“predict”的路由,它将处理包含 JSON 格式输入数据的 POST 请求。响应也将采用 JSON 格式。我们将编写代码来转换 JSON 数据并将其传递给策略模型进行预测。

现在,让我们转到连接到代理、接收数据并向服务器发送订单的应用程序。虽然我们可以直接在应用程序中实施我们的策略,但对于本示例,我们不会这样做。相反,我们将使用 QtIBTrade 应用程序,它连接到经纪人并使用 REST API 与我们的策略和操作选择模型进行通信。 QtIBTrade 是我不久前创建的一个基于 Qt 的应用程序,用于使用 C++ 探索算法交易。它是跨平台的,并且有据可查。

但是,请注意 QtIBTrade 仍在开发中,因为我没有足够的时间来处理它。如果有人有兴趣在这个项目上合作,请告诉我或查看 GitHub 上的代码(描述中提供的链接)。

现在,让我们看看所有这些组件如何协同工作。首先,我们需要启动我们的 Flask 应用程序。我已经在调试模式下启动它,所以我们需要记住端口号并在我们的 Qt 应用程序中更新它。接下来,我们需要连接到 IB 应用程序或网关。在单击“连接”按钮之前,让我们检查 API 是否已激活以及我们是否配置了正确的端口。

一旦一切都设置好了,我们就可以启动我们的测试应用程序,它使用我们的模型。如您所见,我们每五秒钟向服务器发送一个包含不同价格数据的请求。每次我们从经纪人那里收到价格数据时,我们都会触发我们的模型并收到相应的操作。

我希望您觉得这个演示很有趣。如果你这样做了,请订阅该频道以获取更多视频。感谢您的收看,我们下个视频再见!

Trading environment IB API - QT C++ - Flask - RL Model. Complete working example.
Trading environment IB API - QT C++ - Flask - RL Model. Complete working example.
  • 2021.02.21
  • www.youtube.com
This video contains example of the trading environment wich uses Interactive Brokers API (TWS or IB Gateway), QT C++ client and reinforcement learning agent ...
 

如何轻松简单地回测股票投资组合


如何轻松简单地回测股票投资组合

大家好!欢迎来到“接近 AlgoTrading”。我是 Denis,今天我想与大家分享一个非常有用且简单的框架,它是我为回测不同的投资组合而开发的。它基于我在之前的一个视频中讨论过的一个早期想法。

虽然有更强大的实现可用,例如 quantconnect 提供的实现,但我相信拥有一个本地的、简单的解决方案总是好的,它允许我们在不依赖额外服务的情况下测试想法。

这个框架的核心是 Backtrader,一个用于回测和交易的 Python 框架。我已经实施了一个我们将要使用的通用再平衡策略,但该框架的设计方式允许测试不同的想法,而无需深入研究 Backtrader 的细节。

让我们仔细看看这个框架的结构和组件。再平衡策略是关键组成部分,它遵循特定的结构。首先,我们需要选择我们将使用的资产集。为此,我们有一个模型可以根据我们的 Universe 实施选择过程,称为选择模型。一旦我们有了选定的资产,它们就会被传递到 alpha 模型。 alpha 模型是我们算法的核心并生成交易信号。然后使用这些信号来构建我们的投资组合。

投资组合构建模型采用 alpha 模型生成的信号并生成资产配置。这个分配是一个字典,其中键是资产代码,值是权重。构建初始投资组合后,我们进入再平衡步骤。在这里,我们可以根据定义的权重移除旧资产、添加新资产或调整投资组合中的资产数量。

接下来,我们可能想要使用风险模型检查一些风险条件。该模型接收重新平衡步骤的输出,进行任何必要的更改,然后将其传递给执行模型。默认情况下,执行模型下订单购买或出售所请求数量的资产。

如果你看一下再平衡策略的代码,你会看到每个步骤的实现。在选择模型之前,我调用了一个返回仅包含收盘价的数据框的函数。这是因为,对于此策略,我们只需要收盘价。

现在,让我们简要回顾一下框架内模型的实现。选择模型很简单。它的主要目的是丢弃价格缺失或为零的资产,以确保我们使用的所有数据都是有效的。 alpha 模型是一种简单的通用动量策略。在这种情况下,我们购买动量最大的资产。对于分配模型,我们实现了一个为所有资产分配相同权重的模型。

最后,再平衡模型根据分配的权重执行简单的再平衡。一旦我们实现了所有模型,让我们看看如何使用它们。

首先,我们需要一些数据。对于这个例子,我将使用标准普尔 500 指数的当前列表作为我们的范围。我们将从 2007 年 1 月开始下载所有这些股票的历史价格数据。接下来,我们填写我们的配置。我们定义数据源的结构,指定我们将仅使用开盘价和收盘价。开盘价是必要的,因为我们要根据第二天的开盘价开仓和平仓。

我们还定义了我们的资产列表、基准代码、起始现金、开盘期权交易,并为我们的算法设置了一个预热期,以根据去年计算动量。然后,我们创建我们的策略配置。在此配置中,我们将 rebalanceDay 选项设置为 22,这意味着我们将每月重新平衡一次我们的投资组合。我们还有一个 reserve cash 参数来避免因为资金不足导致的执行错误。

接下来,我们定义所有模型及其参数。在开始回测之前,我们需要为我们的配置分配两个数据集:一个包含我们所有资产的数据,另一个包含基准数据。最后,我们可以调用回测函数,等待报告生成。该报告是使用 quantstats 包生成的,并提供了大量有用的信息。

您可以在我的 GitHub 页面上找到完整的代码。该链接在说明中提供。

今天就到此为止。感谢您的收看,如果您有任何问题或意见,请在下方留言。不要忘记订阅我的频道以获取更多精彩内容。

How Easily And Simply to Backtest a Stock Portfolio
How Easily And Simply to Backtest a Stock Portfolio
  • 2022.06.20
  • www.youtube.com
The video describes the simple, but powerful, framework for backtesting the portfolio ideas. It is based on Backtrader, but to use it you don't need to know ...
 

如何打败市场。势头和投资组合优化


如何打败市场。势头和投资组合优化

大家好!我叫 Denis,您正在观看“Close to AlgoTrading”。

在这个简短的视频中,我们将探讨两种基本的投资组合投资策略:回报动量和作为价格与趋势之间差异的动量。我们还将了解投资组合优化方法如何帮助我们改善投资结果。

动量本质上是固定时间间隔内两个价格之间的差异。它代表变化的速度或速率。在股票市场的背景下,动量可以表示为每日回报。动量策略背后的想法很简单:如果价格过去一直在上涨,那么未来很可能会继续上涨。用相同的符号表示所有市场以方便比较是很方便的。

对于股票市场,动量通常被定义为今天的价格与相应的移动平均值之间的差异。当动量变大时,价格远离移动平均线。反之,当动量变小时,价格变化速度变慢,价格相对于均线向负方向靠拢甚至负方向移动。

为了实现这两种动量,我已经创建了一个 alpha 模型。它允许我们用不同的参数测试它们。

让我们计算一年期间的动量,并选择动量最高的前 10 只股票。我们将每月重新平衡一次我们的投资组合,所有资产将得到平等的分配。现在,让我们复制我们的配置并设置另一种动量。我们可以将这些配置添加到我们的测试中,并在 2005 年至 2015 年期间对其进行回测。

您可以看到这两种策略都表现出相似的波动性和回撤,并且它们的表现优于指数投资。但是,请务必注意,与持有该指数相比,我们接受的风险略高。为了将风险降低到指数水平,我们可以尝试使用一些投资组合优化方法。我们将使用一个模型来代替均等分配模型,该模型实现了 pyportfolioopt 包中的几种优化方法,我在之前的投资组合优化视频中已经讨论过。

在这里,我将向您展示如何更改我们的配置以使用投资组合优化分配模型。我们将测试两种众所周知的方法,CLA 和 HRP,以及两种更具体的方法:Efficient CVaR(Conditional Value at Risk)和 Efficient CDaR(Conditional Drawdown at Risk)。有关这些方法的更多详细信息,请参阅官方文档。请记住,这些优化方法可能需要一些时间才能运行,因为它们不是很快。让我们耐心等待,直到回测完成。

您可以观察到所有方法都改善了我们的结果。我们的初始回报策略使用基于条件风险价值优化器的分配,减少了近 12% 的回撤。同样的策略,加上有条件的风险回撤优化器,我们的回报提高了 3%。我们已经看到,简单地改变分配模型可以显着改善我们的结果。还有许多其他方法可以增强此初始策略。更重要的是,使用动量的简单想法行得通并且跑赢了市场,我们只需几个简单的步骤就可以实现它。

今天就到此为止。下个视频见!

How to beat the Market. Momentum and Portfolio Optimization
How to beat the Market. Momentum and Portfolio Optimization
  • 2022.07.06
  • www.youtube.com
This video is a quick demonstration how to get a good investment result using the simple strategy. With few portfolio optimization methods we can achieve hig...
 

超越夏普比率:揭示有效的交易策略评估


超越夏普比率:揭示有效的交易策略评估

大家好!欢迎来到“接近 AlgoTrading”。今天,我们正在深入研究令人兴奋的交易策略评估世界。我们将揭示为什么夏普比率虽然很受欢迎,但可能并不总是完成这项工作的最佳工具。

在本视频中,我们将介绍四个主要领域。首先,我们将定义夏普比率并解释其公式。然后,我们将讨论夏普比率的局限性。第三,我们将引入 Sortino 和 Calmar 比率作为替代指标。最后,我们将使用所有这些指标比较两种假设的交易策略。那么,什么是夏普比率?它以诺贝尔奖获得者威廉·夏普 (William F. Sharpe) 的名字命名,衡量一项投资在调整风险后与无风险资产相比的表现。换句话说,夏普比率旨在描述资产回报对投资者所承担风险的补偿程度。

夏普比率的公式如下:夏普比率=(预期收益-无风险利率)/标准差。

让我们考虑一个预期回报率为 8%、无风险利率为 2%、标准差为 15% 的策略。夏普比率为 (8 - 2) / 15,大约为 0.4。然而,夏普比率有几个我们应该考虑的局限性。首先,它假设回报服从正态分布,而对于许多表现出偏斜或肥尾回报的非正态分布的交易策略而言,情况通常并非如此。使用夏普比率时,这可能会导致误导性结果。

其次,夏普比率有利于产生小额、频繁利润的策略,并假设这些利润可以按比例扩大。这种假设可能不适用于所有类型的策略,尤其是高频交易策略。因此,使用夏普比率评估时,高频交易策略可能会显得更成功。第三,夏普比率没有明确说明尾部风险,尾部风险是指发生极端事件或重大损失的可能性。尾部风险较高的策略可能无法充分反映在夏普比率中,可能会低估与此类策略相关的风险。

鉴于这些限制,交易者通常转向替代指标,例如 Sortino 比率和 Calmar 比率。这些指标提供了额外的见解,可以帮助克服夏普比率的一些局限性。 Sortino 比率通过仅考虑下行波动来衡量投资的风险调整后回报。它侧重于收益低于指定阈值的偏差,通常是无风险利率。该比率提供了更具体的风险评估,并符合投资者对下行风险的普遍关注。

另一方面,卡尔玛比率通过比较平均年回报率与最大回撤来评估风险调整后的回报。该比率对于最大回撤是关键因素的策略特别有用。它强调了与遭受重大损失的风险相关的回报。通过考虑这些替代指标,交易者可以更全面地了解其交易策略的风险和回报特征。 Sortino 比率关注下行波动,而 Calmar 比率衡量相对于最大回撤的回报。

现在,让我们使用这些指标比较两个假设的策略。我们称它们为策略 A 和策略 B。策略 A 的年回报率为 15%,标准偏差为 10%,下行偏差为 7%,最大回撤为 -20%。这为我们提供了 1.3 的夏普比率、1.86 的索提诺比率和 0.8 的卡尔玛比率。另一方面,策略 B 的年回报率为 12%,标准偏差为 8%,下行偏差为 5%,最大回撤为 -15%。策略 B 的夏普比率为 1.25,索提诺比率为 2.0,卡尔玛比率为 0.8。

正如我们所见,尽管策略 A 具有更高的回报,但当我们考虑下行偏差和最大回撤时,策略 B 的表现优于它,表明回报风险较低。因此,策略 B 为您提供每单位风险的更多回报,这是任何投资决策中的重要考虑因素。夏普比率和替代指标之间的选择取决于您交易策略的具体特征和目标。以下是一些建议,可帮助您决定何时关注夏普比率以及何时考虑其他指标:

何时更多地关注夏普比率:在评估属于某些类别的策略时,夏普比率可能是一个有价值的工具。例如,如果您拥有专注于股票和债券等传统资产的多元化长期投资组合,则夏普比率可提供适当的风险调整后业绩衡量标准。它尤其适用于回报相对稳定、风险适中并注重整体风险调整后回报的策略。

何时考虑替代指标:另一方面,对于可能不符合夏普比率假设的策略,替代指标(如 Sortino 比率和 Calmar 比率)开始发挥作用。例如,如果您从事高风险交易策略,例如期权交易、基于杠杆的策略或集中头寸的策略,替代指标将变得更有价值。这些策略通常表现出非正态的回报分布、较高的尾部风险,并且可能需要关注下行风险管理。 Sortino 比率和 Calmar 比率对风险调整后的业绩、尾部风险和回撤提供了更具体的见解,从而更好地评估了该策略在这些情况下的可行性。

请记住,没有任何单一指标可以完全捕捉交易策略的复杂性和细微差别。必须考虑多种指标的组合,以全面了解风险和回报。通过使用 Sharpe 比率、Sortino 比率和 Calmar 比率等多个指标,您可以从不同的角度评估您的策略的优势和劣势,从而实现更稳健的评估和明智的决策。

这就是今天教程的全部内容。感谢您加入我们,我们希望您发现该视频对您有所帮助。

Beyond the Sharpe Ratio: Unveiling Effective Trading Strategy Assessment
Beyond the Sharpe Ratio: Unveiling Effective Trading Strategy Assessment
  • 2023.05.24
  • www.youtube.com
Welcome to our insightful tutorial on trading strategy assessment! In this video, we delve into the popular Sharpe Ratio and explore its limitations when eva...
 

用于估计最大预期亏损的快速蒙特卡罗模拟(运行 python 代码的速度提高了 2000 倍)


用于估计最大预期亏损的快速蒙特卡罗模拟(运行 python 代码的速度提高了 2000 倍)

欢迎大家!我是 Denis,您正在观看 CloseToalgotrading。

在本视频中,我们将深入研究显着提高 Python 代码执行性能的过程,性能可能提高一千倍以上。我们的目标不仅是让它变得有趣,而且非常有用。为实现这一目标,我们将使用蒙特卡罗模拟示例来计算预期的最大回撤。

首先,让我们解决最大回撤意味着什么以及如何计算的基本问题。最大回撤可作为特定时期内下行风险的指标。通常以百分比表示,使用以下公式确定。

尽管该公式看起来很有希望,但我们可以通过将其应用于实际数据来获得更高的准确性。我们以 SPY 为例,将时间段设置为 100 天。该图显示了这 100 天内 SPY 的收盘价。两次回撤是显而易见的,第二次回撤似乎是最大的。要计算回撤,我们可以进行一个简单的计算。最高价达到212.1附近,最低价为204.4。利用前面提到的公式,我们可以估计最大回撤约为 3.6%。

然而,由于对价格水平的假设,这一结果缺乏准确性。为了获得更准确的计算,我们将使用专门为此目的设计的 Python 函数。一种可能的实现方式如下:

【计算最大回撤的Python代码】

此函数计算最大回撤,结果值为 3.5%。该函数的执行时间约为 16.3 微秒,这是可观的。但是,我们是否可以在不诉诸复杂而复杂的技术的情况下进一步增强这种时机?答案是肯定的,提高执行力的最简单方法是使用 Numba。

Numba 是一种开源 JIT(即时)编译器,可将 Python 和 NumPy 代码的子集转换为高效的机器代码。通过将我们的 Python 代码转换为 Numba,我们可以显着提高其性能。但是,我们函数的初始实现不适用于 Numba,因为它不识别“累加最大值”函数。尽管如此,我们可以设计一种替代方法来计算最大回撤而不使用此函数。修改后的回撤计算可以按如下方式实施:

[使用 Numba 修改回撤计算的 Python 代码]

如您所见,我们在函数定义上方添加了一个 Numba 装饰器。通过此实施,Numba 没有任何抱怨,执行时间减少到仅 4.8 微秒。这表示速度提高了三倍多。这很简单,不是吗?就我个人而言,我更喜欢这种实现方式,因为它以直截了当的方式描述了算法。

因此,我们可以准确计算出最大回撤,即 3.5%。我们将其称为“历史最大回撤”。基于这个风险指标,我们可以假设如果市场条件保持不变,我们的最大风险将仅为 3.5%。然而,它提出了一个问题,即我们是否可以完全信任从单个特定观察中得出的值。类似情况多观察几次不是更好吗?事实上,这将是有益的,这就是蒙特卡罗方法发挥作用的地方。

让我们花点时间来阐明蒙特卡罗方法的含义。它涉及通过使用随机变量生成器的数学模型来描述过程。然后重复计算该模型,并根据获取的数据推导出过程的概率特征。

在我们的案例中,该过程需要一系列股票收益,我们使用几何布朗运动 (GBM) 模型对其进行模拟。 GBM 模型假设股票收益遵循连续时间随机过程,广泛应用于金融建模。通过使用 GBM 模拟股票收益,我们可以生成多个场景并计算每个场景的最大回撤。这将为我们提供最大回撤的分布,从而提供更可靠的下行风险估计。

为了实现蒙特卡洛模拟,我们需要为 GBM 模型定义参数。这些参数包括漂移率 (μ)、波动率 (σ) 和时间范围 (T)。我们还将指定模拟运行次数 (N) 和每次运行中的时间步数 (M)。设置好这些参数后,我们就可以进行仿真了。

下面是使用 Python 计算预期最大回撤的蒙特卡罗模拟的示例实现:

import numpy as np

def monte_carlo_max_drawdown(S0, mu, sigma, T, N, M):
    dt = T / M

    S = np.zeros((N, M+ 1 ))
    S[:, 0 ] = S0

     for i in range( 1 , M+ 1 ):
        epsilon = np.random.normal( 0 , 1 , N)
        S[:, i] = S[:, i- 1 ] * np. exp ((mu - 0.5 * sigma** 2 ) * dt + sigma * np. sqrt (dt) * epsilon)

    drawdowns = np.zeros(N)

     for i in range(N):
        peak = np.maximum.accumulate(S[i])
        drawdowns[i] = np.max((peak - S[i]) / peak)

    expected_max_drawdown = np.mean(drawdowns)

     return expected_max_drawdown

# Example usage
S0 = 100.0    # Initial stock price
mu = 0.05    # Drift rate
sigma = 0.2    # Volatility
T = 1.0    # Time horizon in years
N = 10000    # Number of simulation runs
M = 252    # Number of time steps (assuming 252 trading days in a year)

expected_max_drawdown = monte_carlo_max_drawdown(S0, mu, sigma, T, N, M)
print( "Expected Maximum Drawdown:" , expected_max_drawdown)

在这个例子中,我们使用 NumPy 来高效地处理数组操作。我们初始化一个数组 S 来存储每个运行和时间步长的模拟股票价格。我们迭代时间步长并使用 GBM 公式模拟股价变化。模拟所有运行后,我们通过找到峰值并从当前价格中减去它来计算每次运行的回撤。最后,我们通过取所有回撤的平均值来计算预期的最大回撤。

通过运行此蒙特卡罗模拟,我们可以根据多个模拟场景估算预期的最大回撤。与历史数据的单一观察相比,这可以更全面地了解下行风险。

总之,我们探讨了最大回撤的概念、其使用历史数据的计算以及蒙特卡罗方法在估计预期最大回撤中的应用。我们还讨论了如何使用 Numba 提高回撤计算的性能。结合这些技术可以大大提高财务计算的效率和准确性,为交易者和投资者提供有价值的风险指标以进行决策。

感谢您收看 CloseToalgotrading!我希望你发现这个视频提供了信息和帮助。如果您有任何问题或意见,请随时在下方分享。请继续关注算法交易和量化金融方面的更多精彩话题。

Fast Monte Carlo Simulation For Estimation Maximum Expected Drawdown (run python code x2000 faster)
Fast Monte Carlo Simulation For Estimation Maximum Expected Drawdown (run python code x2000 faster)
  • 2022.02.27
  • www.youtube.com
In this video we will see how with a few simple steps we can improve execution performance of a python code more than in x1000 time. And in order for us to b...
 

使用 R Studio (CRAN) 最大化夏普比率的投资组合优化


使用 R Studio (CRAN) 最大化夏普比率的投资组合优化

朋友们好,欢迎来到 Macro Sapiens。在今天的教程中,我们将学习如何优化投资组合以最大化夏普比率。夏普比率衡量投资组合承担的每单位风险的回报。为此,我们将使用 quantmod、PortfolioAnalytics、PerformanceAnalytics 和 NSE2R 库。 quantmod 库将帮助我们从 Yahoo Finance 获取数据,PortfolioAnalytics 将提供优化功能,PerformanceAnalytics 将协助可视化,NSE2R 是印度国家证券交易所的专用库。

首先,我们定义一个名为“stock_names”的变量来存储股票的名称。我们使用 quantmod 库从 Yahoo Finance 获取印度 Nifty 50 指数的 50 个股票代码的数据。我们提取符号列并将其存储在一个名为“symbols”的新变量中。

接下来,我们需要为要检索的数据指定开始日期和结束日期。我们使用“since”变量定义开始日期为 2018 年 1 月 1 日,结束日期为当前日期。我们关注调整后的收盘价,因为它们可以更好地代表股票的表现,并将它们存储在一个名为“prices_data”的变量中。

为了计算投资组合的回报,我们使用每日回报公式:(第 2 天的收盘价 - 第 1 天的收盘价)/ 第 1 天的收盘价。我们修改函数以处理数据中的任何缺失值 (NA)。

接下来,我们将投资组合回报数据集的列名称定义为“funds”。这将在稍后的优化过程中使用。

现在,我们可以使用 PortfolioAnalytics 库开始优化过程。我们创建一个初始投资组合并添加约束。一个约束确保投资组合的总权重等于 1,另一个约束指定我们想要一个只做多头的投资组合,这意味着没有负权重。

我们添加目标函数,它是使用 prices_data 的投资组合的平均回报。我们将优化过程的最大迭代次数设置为 2000。

要计算夏普比率,我们需要定义无风险收益率。在这种情况下,我们将其视为 0%。我们使用 PerformanceAnalytics 库的函数来分析投资组合的回报并计算夏普比率。

我们创建一个表格来显示结果,包括通过随机优化实现的最大夏普比率回报和来自 ROI 优化器的回报。我们绘制有效边界以可视化优化的投资组合。

此外,我们将投资组合回报与投资 Nifty 50 指数的回报进行比较。我们计算每种方法的累积回报并绘制它们以分析性能。

根据结果,我们观察到与 ROI 优化器和 Nifty 50 指数相比,随机投资组合优化方法提供了更高的夏普比率和累积回报。

这些优化的权重可用于创建一篮子股票进行投资。通过跟踪一段时间内篮子的表现,投资者可以就投资所选股票做出明智的决定。

我们希望本教程对您有所帮助。如果您有任何问题,请随时提问。不要忘记喜欢、分享和订阅我们的频道。谢谢你!

Portfolio optimization for maximizing Sharpe Ratio using R Studio (CRAN)
Portfolio optimization for maximizing Sharpe Ratio using R Studio (CRAN)
  • 2021.08.28
  • www.youtube.com
Portfolio optimization for maximizing Sharpe Ratio using R Studio (CRAN)#SharpeRatio #Rstudio #CRAN #Portfolio #Optimization