最近我们被客户要求撰写关于量化交易的研究报告,包括一些图形和统计输出。

计算能力的指数级增长,以及量化社区(日益增长的兴趣使量化基金成为投资者蜂拥而至的最热门领域。

量化交易陷阱和R语言改进股票配对交易策略分析中国股市投资组合

量化交易涵盖了相当广泛的交易策略(从大数据分析到高频交易)。出于本文的目的,我们将重点关注量化分析数据科学,因为它们被不同类型的交易者广泛使用。

根据我们在量化交易方面的经验,在构建量化交易策略时有几个主要陷阱:

  1. 了解统计/概率。
  2. 模型实现。
  3. 策略回测/模拟。
  4. 风险管理。

理解统计和概率

统计分析是数据科学和量化交易的基础。当我们分析数据(尤其是时间序列)时,如果我们对统计/概率(和统计概念)没有很好的理解,我们很容易陷入各种陷阱。

正态分布

到目前为止,正态分布的假设是我们在金融资产动态建模方面所能做出的最弱假设。关于金融资产时间序列的正态性假设已经发表了许多论文,但是,由于缺乏更好的选择,我们使用高斯(正态)分布,因为它使我们能够很容易地分析数据。知道“正态性”的假设是弱的,我们应该以同样的方式对待正态分布的性质(即偏斜收益、肥尾)。假设收益的分布将落在钟形曲线之下,当收益出现 3+ 个标准差时,通常会导致巨大的意外。

正如我们所理解的,“正态性”有时可能是一个弱假设,我们可以使用已实现的分布(采用不同的时间框架)并查看它如何符合正态分布,因此我们可以评估资产的回报分布有多正常.

相关性

如果说大多数量化分析师和交易员喜欢一件事,那就是“相关性”。相关性可能是统计学中使用最多但最容易被误解的概念。我们大多数人使用的相关系数是“Pearson Correlation”(以 Karl Pearson 命名)。相关性,简而言之,描述了两个变量(X,Y)之间的线性关系。相关性在(-1,负线性关系)和(+1,正线性关系)之间振荡。

首先,我们需要了解什么不是相关性。它不是预测变量(即,它不表示因果关系,而是线性关系)。当我们使用相关函数时,我们需要确保我们不会犯以下错误:

  1. 分析价格而不是收益(对数收益或实际收益)—— 当我们处理时间序列时,我们通常处理资产价格。资产价格本质上是“非平稳的”。“非平稳”过程基本上意味着资产呈现趋势(或非均值回归过程)。如果我们以黄金现货价格与 10 年国债实际收益率为例,我们可以清楚地看到使用非平稳数据的效果。这是黄金/收益率价格的回归模型拟合结果:

黄金/ 10 年期实际收益率价格回归。R²=0.81 , R=-0.9

然而,这就是价格变化收益率的回归拟合结果(即平稳时间序列)的样子

黄金 (Log Rtn)/10 年实际收益率(价格变化)。R²=0.18, R=-0.43

2.没有过多考虑样本量/频率——当我们分析相关性时,就像我们分析波动率时一样,我们需要对我们的样本量/频率给予很多考虑。大小和频率都对​​我们的相关性估计有很大影响。如果我们使用的频率太短,我们可能会将短期行为与持续相关性混淆。这个问题的另一面是使用的样本量太长(假设我们想要交易短期策略时的 1 年相关性)。如果我们查看下面的相关矩阵热图,我们可以清楚地看到使用 20 天窗口和 180 天窗口之间的区别

解决样本大小问题的一个好方法是对不同大小和不同时期(非重叠时期)进行采样,以测试相关性持久性。

3.假设长期相关性持续存在——相关性分析的主要缺陷之一是认为长期相关性不会失效。这种假设通常在金融压力和市场低迷时期被抛弃,因为相关性往往会破裂并走向极端。如果我们看看 2020 年 3 月,我们可以清楚地看到相关性的巨大变化

Z 分数 (%ile) 和均值回归

作为交易者,我们希望以良好的风险回报进入交易。我们用来确定风险回报的一种方法是使用 Z 分数。简而言之,Z-score 是一种衡量我们观察与分布均值的距离(以标准差计)的方法(该分数也可以很容易地转换为 %ile 项)。显然,作为交易者,我们的目标是寻找极端事件,因为它们提供了最好的风险回报(因为我们假设某种回归/趋同于均值)。Z-score 的棘手之处在于,与统计中的其他所有内容一样,它高度依赖于我们的样本量和频率。使用 z 分数作为信号的陷阱的一个很好的例子是 2020 年 3 月/4 月黄金期货场外交易基础上的走势。

所以我们看到使用 z 分数是时间序列极端性的一个很好的指标,但它不能是唯一的指标。

解决这个陷阱的一个很好的方法是将我们当前的观察结果与历史上不同的回顾窗口(时期)进行比较,以解释不同的市场制度。

模型实现

在我们了解了统计分析中可能存在的陷阱之后,我们转向交易的核心——我们的模型。虽然在实施我们的模型/策略时有很多方法可能会失败,但我们将专注于我们可能犯的最常见(也是最关键)的错误。避免这些陷阱将大大有助于确保我们模型的适应性和稳健性。

过拟合/欠拟合

模型拟合既是一门艺术,也是一门科学。在拟合我们的模型时,我们需要在模型过拟合和模型欠拟合之间找到一条细线。这两种偏差最有可能导致我们模型的性能不佳。

过拟合——当我们的模型在捕捉动态时非常精确时会导致过拟合。通常过拟合模型会涉及到相对大量的解释变量。

拟合-欠拟合是过拟合的镜像问题。当模型太简单(变量太少)时会导致欠拟合,这使得它在捕捉动态时不灵活。

USDJPY 1 周 RVol 与 UDSJPY 1 个月 RVol 回归。

在拟合模型时,我们的目标是使用最少的变量,但具有最大的预测能力。其背后的想法是,我们希望将模型校准到最低限度,同时拥有一个能够产生稳健结果的模型。我们添加的变量越多,我们需要进行的校准就越多,它能够快速应对不断变化的市场的能力就越差。

异常值处理

无论我们喜欢与否,异常值观察都是我们数据系列的一部分。我们不能忽略这些异常值,但是,我们需要知道如何处理它们,这样我们的模型才不会因极端观察而出现偏差。显然,我们需要区分异常值的类型——如果我们发现观察明显是错误的(数据错误),我们可以删除它,但是,如果它是有效的观察,我们应该接受它并让我们的模型处理它。

模型模拟

现在我们已经有了一个基于稳健统计/数据分析的健全模型,我们希望对历史(或生成的)数据进行回测(或模拟)。这是我们模型开发的关键部分,因为这是我们可以看到(和分析)我们的模型在受控环境中如何表现的关键。尽管在这个阶段犯错误的方法更少(与之前的阶段相比),但这些错误可能会付出高昂的代价,因为我们将无法发现模型的弱点(或问题)。

测试不同的市场区制状态

当我们构建模型时,我们希望它在 100% 的时间内表现良好。不幸的是,这几乎是不可能的,因为不同的策略将在不同的市场区制中表现良好(想想波动市场中的趋势跟踪策略)。我们可以确定模型表现不佳的点。为了让我们识别这些弱点,我们应该在不同的市场区制下测试我们的策略(区制转换模型是识别这些区制的好方法)

R语言改进的股票配对交易策略分析SPY-TLT组合和中国股市投资组合

相信大家都听说过股票和债券的多元化投资组合。改进的股票配对交易策略基本上使用了一种前进的方法(参考文章中的概念),即最大化夏普比率,偏向于波动率而不是收益率。也就是说,它使用72天的移动窗口来最大化投资组合的不同权重配置之间的总收益,标准差提高到52的幂。说得通俗一点,在1的幂数下,这是基本的夏普比率,在0的幂数下,只是一个动量最大化的算法。

这个策略的过程很简单:每个月重新平衡SPY和TLT之间5%的倍数,之前最大化了以下数量(在72天窗口中返回波动率^2.5)。

SPY和TLT组合

以下是获取数据和计算必要数据的代码:

require(quantmod)getSymbols(c("SPY", "TLT"), from="1990-01-01")for(i in 1:21) weightSPY <- (i-1)*.05config <- Return.portfolio(R = returns, weights=c(weightSPY, weightTLT)period <- 72

接下来,建立权重的代码:


weights <- t(apply(monthlyModSharpe, 1, findMax))weights[is.na(weights)] <- 0

也就是说,在每个重新平衡的日期(每月的月末),简单地采用使每月修改的夏普比率计算最大化的设置。接下来是收益表现:

Performance(stratRets)

结果如下:

具有以下股票曲线:

并不完美,但相比之下,它的成分如何呢,我们来看看。


apply.yearly(Components, Return.cumulative)

以下是一些常见的统计数据:

简而言之,这一策略的表现似乎远远好于上述两种成分。我们来看看股票曲线的比较是否反映了这一点。

事实上,虽然它确实在危机中出现了下跌,但当时这两个工具都在下跌,所以看起来这个策略在糟糕的情况下取得了最好的效果.以下是年度收益。

yearly(Return.cumulative)

然而,从2002年整体上看,虽然该策略很少会像两个中更好的表现一样,但它总是比两个中更差的表现出色--不仅如此,即使在一个表现差的时候,该策略在回测的每一年中都取得了积极的表现,例如2008年的SPY,以及2009年和2013年的TLT。以下是SPY在策略中的权重。


weightSPY <- do.call(rbind, weightSPY)TimeSeries(alig, date.format="%Y", ylab="SPY权重", main="SPY-TLT配对中SPY的权重")

贵州茅台和民生银行组合

股票数据获取及整理

## [1] "GZMT" "MSYH"

组合收益表现结果如下:

加入比较项-非组合下的单只表现

年化收益率比较

 

通过累积收益率、日收益率和最大回撤率,以及年化收益率比较,可以发现采用优化方法的投资组合明显优于传统的投资策略。

现在,虽然这对某些人来说可能是一个独立的策略,但在我看来,动态地重新加权两个具有负相关性的收益流,与它们形成的成分相比,可能会产生一些较好的结果。此外,模拟实际组合收益率所采用的方法很有趣,不是简单地依靠一个数字来总结两种工具之间的关系,毫无疑问,这种方法作为一种一般的前进方法,有着广泛的应用。


量化交易陷阱和R语言改进股票配对交易策略分析中国股市投资组合相关推荐

  1. R 语言实现股票数据的预处理及分析

    基于 R 语言的股票数据分析 一.实验介绍 1.1 实验内容 本实验是以股票数据作为分析背景,股票数据如何从雅虎财经板块上获取,观察股票每日价格和成交量数据开始,接着计算某一支股票数据中比较重要的日度 ...

  2. python 量化交易_Quantsrat让R语言像Python一样进行策略回测和量化交易

    使用Quantsrat包 Quantsrat用来建立策略.添加指标.生成信号.生成买卖规则等进行回测.效果类似优矿.万矿.米筐那样的Python量化平台一样.因为不能CRAN在线安装,安装过程中还有一 ...

  3. r语言 python 股票_股票交易历史数据库_r语言炒股

    Python获取股票历史.实时数据与更新到数据库 db_stocks_create()#如果没有表,您需要创建#print(stocks).db_stocks_update())根据当前的情况#hda ...

  4. 用R语言玩玩股票(二)

    声明:本人不炒股,贴子纯为娱乐! 为何要学编程? 1. 训练逻辑思维(预防痴呆) 2. 减少重复劳动(过程不轻松) 3. 提高分析效率(需反复摸索) 在上一篇的博文1里,用R语言简单示范了茅台股票的一 ...

  5. @使用R语言进行股票分析

    @使用R语言进行股票分析 为什么用计算机分析股票数据 希望从历史数据中获取一些股票信息 如何分析呢 主要借助于统计描述信息:均值.中位数.众数以及各阶矩的结果 分析完有什么用 可以根据分析结果解释一些 ...

  6. 股票配对交易策略-最小距离法

    策略 配对交易( Pairs Trading)为这种困境提供了一种既能避险又盈利的策略,其又被称之为价差交易或者统计套利交易,是一种风险小.收益较稳定的市场中性策略.一般的做法,是在市场中寻找两只历史 ...

  7. R语言使用Rtsne包进行TSNE分析:通过数据类型筛选数值数据、scale函数进行数据标准化缩放、提取TSNE分析结果合并到原dataframe中(tSNE with Rtsne package)

    R语言使用Rtsne包进行TSNE分析:通过数据类型筛选数值数据.scale函数进行数据标准化缩放.提取TSNE分析结果合并到原dataframe中(tSNE with Rtsne package) ...

  8. R语言使用Rtsne包进行TSNE分析:提取TSNE分析结果合并到原dataframe中、可视化tsne降维的结果、并圈定降维后不匹配的数据簇(tSNE identifying mismatch)

    R语言使用Rtsne包进行TSNE分析:提取TSNE分析结果合并到原dataframe中.可视化tsne降维的结果.并使用两个分类变量从颜色.形状两个角度来可视化tsne降维的效果.并圈定降维后不匹配 ...

  9. R语言诊断试验数据处理与ROC分析实战案例2

    R语言诊断试验数据处理与ROC分析实战案例2 目录 R语言诊断试验数据处理与ROC分析实战案例2 #ROC指标 #样例数据

最新文章

  1. Android studio 导入jar 文件
  2. 修改Ubuntu的启动logo
  3. ​GEB:焦硕等发表生态位的系统发育保守性决定土壤古菌地理格局
  4. Unity 好消息,中文版Unity来啦!!!
  5. Web 高效开发必备的 PHP 框架
  6. 算法导论 pdf_学习数据结构和算法最好的书是什么?
  7. [计数排序]统计三个数和的[最大概率](洛谷P2911题题解,Java语言描述)
  8. P1099 树网的核
  9. 聚焦BCS|吴云坤产业峰会演讲:用内生安全框架提升网络安全产值
  10. -32767转化为二进制_谁说前端不需要懂二进制
  11. android重写view和viewgroup的区别
  12. 关于eclipse反编译插件不起作用问题的解决
  13. 通达2017OA数据字典
  14. 第八章《Unity游戏优化》内存管理
  15. Scala中fold()操作和reduce()操作的区别
  16. sox处理mp3_sox :音频文件转换命令
  17. IPsec+预共享密钥的IKE野蛮模式
  18. gpg 的加密与解密
  19. 个人项目记录 -- VChat
  20. Keil5 MDK社区版本免费安装教程---手把手安装

热门文章

  1. UE Gameplay入门47(骨架网格体的动画片段)
  2. 计算机保研陶瓷老师记录(1)
  3. 跟我学flutter:细细品Widget(一)WidgetElement初识
  4. Pytest框架详解(二)
  5. python 均方误差_python如何实现均方误差和均方根误差?
  6. 2020最新的新浪短网址(T.CN短链接)API接口分享
  7. 聚观早报 | 国美电器被申请破产清算;首款太阳能汽车投入生产
  8. 服务器获取用户信息失败是什么原因,花粉俱乐部获取用户信息失败怎么解决?花粉俱乐部登录失败是什么原因?...
  9. phpcms模板分解
  10. 怎么才能做一个成功的微商!