面向R语言用户的Highcharts

如果您喜欢使用 R 进行数据科学创建交互式数据可视化,那么请你收藏。

今天,我们将使用折线图、柱状图和散点图来可视化资产回报。

对于我们的数据,我们将使用以下 5 只 ETF 的 5 年月回报率。

+ SPY (S&P500 fund)
+ EFA (a non-US equities fund)
+ IJS (a small-cap value fund)
+ EEM (an emerging-mkts fund)
+ AGG (a bond fund)

我们将需要以下包。

library(tidyverse)
library(timetk)
library(kableExtra)
library(highcharter)

由于这不是一篇关于使用 R 处理和转换数据的文章,因此我不会详细介绍如何导入价格数据并转换为月度回报的逻辑,但完整的代码在这里。

symbols <- c("SPY","EFA", "IJS", "EEM","AGG")prices <- getSymbols(symbols, src = 'yahoo', from = "2013-01-01",to = "2017-12-31",auto.assign = TRUE, warnings = FALSE) %>% map(~Ad(get(.))) %>%reduce(merge) %>% `colnames<-`(symbols)prices_monthly <- to.monthly(prices, indexAt = "last", OHLC = FALSE)asset_returns_xts <- na.omit(Return.calculate(prices_monthly, method = "log"))asset_returns_xts <- asset_returns_xts * 100asset_returns_long <-  prices %>% to.monthly(indexAt = "last", OHLC = FALSE) %>% tk_tbl(preserve_index = TRUE, rename_index = "date") %>%gather(asset, returns, -date) %>% group_by(asset) %>%  mutate(returns = (log(returns) - log(lag(returns))) *100) %>% na.omit()

我们将使用保存每月资产收益的两个数据对象。第一个称为asset_returns_xts。查看前几行。

SPY       EFA        IJS       EEM         AGG
2013-02-28  1.267821 -1.296938  1.6175381 -2.310525  0.58911556
2013-03-28  3.726766  1.296938  4.0257940 -1.023505  0.09849772
2013-04-30  1.903006  4.896773  0.1222544  1.208504  0.96389678
2013-05-31  2.333571 -3.065563  4.1976371 -4.948359 -2.02136579
2013-06-28 -1.343432 -2.715331 -0.1402974 -5.473912 -1.57786534
2013-07-31  5.038578  5.186029  6.3541287  1.315986  0.26879677

我们的每只 ETF 月度回报都有一列,但请注意,日期位于无名列中。事实上,日期根本不在列中,它被视为此矩阵的基于时间的索引。

将其与 进行比较asset_returns_long

dateassetreturns
2013-02-28SPY1.267821
2013-03-28SPY3.726766
2013-04-30SPY1.903007
2013-05-31SPY2.333571
2013-06-28SPY-1.343432
2013-07-31SPY5.038578

此对象有一个名为 的列date,一个名为 的列asset和一个名为 的列returns。它被视为长数据对象,因为 ETF 堆叠成行,而asset_returns_xts被视为宽数据对象,因为每个 ETF 都有自己的列并使对象更宽。asset_returns_longasset_returns_xts保存完全相同的信息,但格式不同。我们将研究如何使用 highcharter 可视化这两者,因为两者都是金融界流行的数据格式。让我们开始asset_returns_xts使用 Highcharts 工具链的 Highstock 部分。要从 R 调用此功能,我们首先提供要绘制图表的数据。请注意,我们指定 type = “line”,但这不是必需的,因为默认是折线图。

 highchart(type = "stock")highchart(type = "stock") %>% hc_add_series(asset_returns_xts$SPY, type = "line")

两行简短的代码和一个非常漂亮的交互式时间序列!查看图表,注意底部有一个导航器,右上角有一个日期范围选择器。我们不必编写这些代码,默认情况下会创建它们,这对我们的最终用户来说是一个非常好的功能。highchart(type = "stock")

如果我们喜欢不同的颜色,我们可以用 来改变它。color = "green"

highchart (type = “stock” )%>% hc_add_series (asset_returns_xts $ SPY , type = “line” ,color = “green” )    

如果我们想要的是柱形图而不是折线图怎么办?代码流程相同,只是我们指定了。type = "column"

highchart(type = "stock") %>% hc_add_series(asset_returns_xts$SPY, type = "column")

将鼠标悬停在这两个图表上,注意工具提示如何自动从 x 轴拉出日期。

对于散点图,我们使用相同的代码流,更改为,但我们还要通过附加 来添加 EFA ETF 的回报。我们可以对所有 5 个 ETF 执行此操作,逐行添加它们,以将所有 5 个放在同一个散点图上。type = "scatter"hc_add_series(asset_returns_xts$EFA)

highchart(type = "stock") %>% hc_add_series(asset_returns_xts$SPY, type = "scatter") %>% hc_add_series(asset_returns_xts$EFA, type = "scatter"

该图表看起来符合我们的要求,但将鼠标悬停在某个点上时,会发现一些不太理想的外观特征。首先,工具提示显示的日期与 x 轴上显示的日期不一致。其次,它显示的完整 y 轴值超出了小数点后 10 位;第三,它将这两个 ETF 称为和,因为我们没有提供名称。让我们解决这三个问题。series 1series 2

首先,系列名称用和很容易添加。name = "SPY"name = "EFA"

highchart(type = "stock") %>% hc_add_series(asset_returns_xts$SPY, type = "scatter", name = "SPY") %>% hc_add_series(asset_returns_xts$EFA, type = "scatter", name = "EFA")

接下来,我们通过添加到流程并使用 更改 x 点显示的格式来修改工具提示格式。这是告诉工具提示使用日期格式。hc_tooltip(pointFormat = ){point.x:%Y-%m-%d}

然后,我们用 更改 y 点显示,这告诉工具提示四舍五入到小数点后四位,然后在其后放置 % 符号。尝试将其更改为并查看结果。{point.y:.4f}%{point.y:.8f}

highchart(type = "stock") %>% hc_add_series(asset_returns_xts$SPY, type = "scatter", name = "SPY") %>% hc_add_series(asset_returns_xts$EFA, type = "scatter", name = "EFA") %>% hc_tooltip(pointFormat = '{point.x: %Y-%m-%d}{point.y:.4f}%')

我喜欢 highcharter 选择的默认颜色,但我们可以使用参数自定义它们color

highchart(type = "stock") %>% hc_add_series(asset_returns_xts$SPY, type = "scatter", name = "SPY", color = "lightblue") %>% hc_add_series(asset_returns_xts$EFA, type = "scatter", name = "EFA", color = "pink") %>% hc_tooltip(pointFormat = '{point.x: %Y-%m-%d}{point.y:.4f}%  ')
这就是所保存的数据的全部内容asset_returns_xts,让我们探索如何从长格式的数据构建相同的可视化效果。

回想一下 的结构asset_returns_long

dateassetreturns
2013-02-28SPY1.267821
2013-03-28SPY3.726766
2013-04-30SPY1.903007
2013-05-31SPY2.333571
2013-06-28SPY-1.343432
2013-07-31SPY5.038578

如果我们希望创建 SPY 收益的折线图,我们无法选择该SPY列,因为没有名为 的列SPY。我们需要通过调用来筛选asset列是否等于。SPYfilter(asset == "SPY")

asset_returns_long %>% filter(asset == "SPY") %>% head()

图片

现在我们使用运算符将数据从一个函数传递到另一个函数。hchart()%>%

当我们运行 时,我们会过滤观察结果,然后将它们传递给。括号内的是使用过滤后的数据。这可能看起来有点冗长,但有了这个流程,我们可以快速过滤不同的条件,然后将结果传递给,如果我们想过滤类似的东西而不是(我们稍后会介绍),这会非常方便。asset_returns_long %>% filter(asset == "SPY")SPYhchart()hchart(.).hcharthchart()dateasset

但是,我们还没有完成,因为我们需要再次使用 type =“line” 指定图表类型,然后使用 映射我们的美学。为什么我们需要在这里调用,但之前我们不需要这样做?一切都回到数据结构。asset_returns_xts 没有日期列,日期在索引中,highcharter 默认使用该索引。有一个日期列,但 highcharter 无法知道我们想要那个日期列,除非我们明确告诉它。hcaes(x = date, y = returns)hcaesasset_returns_longx-axis

asset_returns_long %>% filter(asset == "SPY") %>% hchart(., type = "line", hcaes(x = date, y = returns))

请注意此图表与上一个折线图之间的一些差异。首先,这里没有导航器或日期选择器。当我们删除时,它们就消失了。此外,y 轴默认位于左侧。我更喜欢这样 - 也许你讨厌它!可以使用 hc_yAxis(opposite = TRUE) 将其改回右侧。为了更好,我们还通过调用 labels = list(format = “{value}%”) 向 y 轴添加一个 % 标签highchart(type = "stock")

asset_returns_long %>% filter(asset == "SPY") %>% hchart(., type = "line", hcaes(x = date, y = returns)) %>% hc_yAxis(opposite = TRUE,labels = list(format = "{value}%"))

我们可以使用完全相同的代码流来创建柱形图,只需更改为。我还希望数据的名称出现在工具提示中,这可以使用 来实现。type = "column"name = "SPY"

asset_returns_long %>% filter(asset == "SPY") %>% hchart(., type = "column", hcaes(x = date, y = returns),name = "SPY") %>% hc_yAxis(opposite = TRUE,labels = list(format = "{value}%"))

最后,让我们从整洁的长格式数据中创建一个散点图。我们更改为,并再次需要使用指定工具提示格式。type = "scatter"hc_tooltip(pointFormat = '{point.x:%Y-%m-%d}...)

asset_returns_long %>% filter(asset == "SPY") %>% hchart(., type = "scatter", hcaes(x = date, y = returns),name = "SPY") %>%hc_yAxis(opposite = TRUE,labels = list(format = "{value}%")) %>% hc_tooltip(pointFormat = '{point.x:%Y-%m-%d}{point.y: .4f}%')

好吧,两次构建相同的图表确实需要花费不少功夫。让我们做些不同的事情,看看如何利用我们整洁的长数据来高效地创建更有趣的图表。

假设我们希望将所有 ETF 数据分散到一张图表上,并按组着色。我们可以为每个 ETF返回原始数据,但这会有点繁琐。有了整洁的数据流,我们可以删除然后添加。这会告诉 highcharter 根据其组别为每个 ETF 涂上不同的颜色。请注意它还如何创建图例并在工具提示中包含 ETF 名称。flow and use hc_add_seriesfilter(asset == "SPY")hcaes(...group = asset)

asset_returns_long %>% hchart(., type = "scatter", hcaes(x = date, y = returns, group = asset)) %>% hc_yAxis(opposite = TRUE,labels = list(format = "{value}%")) %>% hc_tooltip(pointFormat = '{point.x:%Y-%m-%d}{point.y: .4f}%')          

我们可以很快看到,月回报率最低的是2015年8月的EEM。

创建柱状图可能不错,但只用于显示 2017 年的月度收益。这时,筛选的灵活性就派上用场了。我们可以调用 来隔离 2017 年的月份,然后构建柱状图。filter(date >= "2017-01-01" & date <= "2018-01-01")

asset_returns_long %>% 
filter(date >= "2017-01-01" & date < "2018-01-01") %>% 
hchart(., type = "column", hcaes(x = date, y = returns, group = asset)) %>% hc_yAxis(opposite = FALSE,labels = list(format = "{value}%")) %>% hc_tooltip(pointFormat = '{point.x: %Y-%m-%d}{point.y:.4f}% ')

请注意,收益如何按日期以列格式自然分组,这有助于按月比较每个 ETF。IJS 似乎是 2017 年波动性最大的,这似乎是 Shiny 应用程序的良好候选者,最终用户可以选择自定义日期期间和一组 ETF 来绘制图表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93737.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【测试工具】OnDo SIP Server--轻松搭建一个语音通话服务器

前言 Ondo SIP Server 是一款基于 SIP(Session Initiation Protocol)协议的服务器软件&#xff0c;主要用于实现 VoIP(Voice over IP)通信&#xff0c;支持语音通话、视频会议等多媒体会话管理&#xff0c;非常适合学习和测试VoIP的基本功能。本文介绍Ondo SIP Server的安装、…

疯狂星期四文案网第42天运营日记

网站运营第42天&#xff0c;点击观站&#xff1a; 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 今日访问量 今日搜索引擎收录情况 网站优化点 优化一些发现的seo错误 增加颜文字栏目 增加了一些tag

使用空模型实例调用辅助函数,确定在量化过程中哪些层会被跳过(43)

在Facebook的OPT-350M中,模型的头部(lm_head)与解码器的嵌入标记层(decoder.embed_tokens)共享其权重。 print(model.model.decoder.embed_tokens) print(model.lm_head)输出结果 Embedding(50272, 512

从0-1使用Fastmcp开发一个MCP服务,并部署到阿里云百炼 -持续更新中

目的&#xff1a; 在本地使用fastmcp开发一个mcp,然后注册到阿里云的百炼里面。实现在百炼里面创建智能体的时候直接引用自己开发的MCP 已完成&#xff1a;本地环境安装 待完成&#xff1a; 1.根据需求实现一个MCP中可以调用某应用的多个API即 mcp.tool()、mcp.prompt()、接入大…

设计模式之汇总

设计模式 零、设计原则 0.1 单一职责 0.2 接口隔离 0.3 开闭原则 0.4 依赖倒置0.5 迪米特法则&#xff0c;最小知道原则用户关机 只和朋友通信 朋友条件&#xff1a; 1&#xff09;当前对象本身&#xff08;this&#xff09; 2&#xff09;以参量形式传入到当前对象方法中的对象…

第6章 Decoder与Encoder核心组件

前言 Netty从底层Java通道读取ByteBuf二进制数据&#xff0c;传入Netty通道的流水线&#xff0c;随后开始入站处理。在入站处理过程中&#xff0c;需要将ByteBuf二进制类型解码成Java POJO对象。这个解码过程可以通过Netty的Decoder&#xff08;解码器&#xff09;去完成。 在…

[已解决]当启动 Spring Boot 应用时出现 Using generated security password xxx提示

当启动 Spring Boot 应用时出现 Using generated security password xxx提示当启动 Spring Boot 应用时出现 Using generated security password xxx提示&#xff0c;这是 Spring Security 自动配置的默认行为&#xff0c;通常发生在你​​未自定义安全配置​​但引入了 Spring…

自动分析需求,PRD 生成只需 SOLO 一步!

资料来源&#xff1a;火山引擎-开发者社区 写不清需求&#xff1f;PRD 难产&#xff1f;开发总跑偏&#xff1f;这些痛点&#xff0c;SOLO 来解决。 TRAE SOLO 是行业首个 Context Engineer。它不止协助编码&#xff0c;更能基于精准上下文理解和工具调用&#xff0c;从构思、…

物联网软件开发过程中,数据流图(DFD),用例图,类图,活动图,序列图,状态图,实体关系图(ERD),BPMN(业务流程建模)详解分析

概述软件开发过程中&#xff0c;特别是在物联网&#xff08;IoT&#xff09;场景中&#xff0c;数据流图&#xff08;DFD&#xff09;、UML图&#xff08;包括用例图、类图、活动图、序列图、状态图&#xff09;、实体关系图&#xff08;ERD&#xff09;和业务流程建模&#xf…

Mac(一)常用的快捷键整理

目录1、系统操作与窗口管理2、应用与窗口切换3、常规编辑操作4、文本导航与光标控制✏️5、文本格式与文档功能&#xff08;支持应用中&#xff09;6、截图快捷键7、Safari 浏览器快捷键8、Finder 快捷键&#xff08;文件管理&#xff09;9、Fn / Globe 功能键&#xff08;部分…

HAProxy使用方法以及和LVS区别

HAProxy简介HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的一个开源软件 是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器 支持基于cookie的持久性&#xff0c;自动故障切换&#xff0c;支持正则表达式及web状态统计LVS 与 HAProxy 的核心区别…

超越“小作文”:大模型指令设计的进阶之路——优化知识信噪比

文章摘要&#xff1a;你是否认为&#xff0c;给大模型的指令&#xff08;Prompt&#xff09;写得越详细越好&#xff1f;真的是信息越多&#xff0c;模型就越懂你吗&#xff1f;本文将深入探讨一个反直覺的觀點&#xff1a;初級的指令設計專注於資訊的堆砌&#xff0c;而高階的…

elasticsearch-集成prometheus监控(k8s)

一. 简介&#xff1a; 关于elasticsearch的简介和部署&#xff0c;可以参考单独的文章elasticsearch基础概念与集群部署-CSDN博客&#xff0c;这里就不细说了。这里只讲讲如何在k8s中部署export并基于prometheus做es的指标采集。 二. 实现方式&#xff1a; 首先我们需要先部署…

贪心算法(Greedy Algorithm)详解

一、什么是贪心算法&#xff1f; 贪心算法是一种算法设计范式&#xff0c;指在解决问题时&#xff0c;依赖于每次选择最优的局部解&#xff0c;以期最终得到全局最优解。贪心算法的关键特点是&#xff1a; 局部最优选择&#xff1a;每个阶段选择当前看起来最好的选择&#xff0…

电梯的构造|保养|维修视频全集_电梯安全与故障救援(课程下载)

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/91699586 电梯原理与维修视频教程 相关简介: 电梯现在运用的非常广泛,比如大型商场,建筑工地,特别是现在建造的很多高楼、商品房,基本都是安装了电梯。电梯维保不力是导致电梯运行中安全事故频发的主要原…

Traefik网关DNS解析超时问题优化

1、背景 在生产环境使用 Traefik 网关时出现了偶发的 DNS 解析超时导致网关与后端服务建立连接异常的情况。通过调用链埋点数据观察发现&#xff0c;该部署环境中 Traefik 的 DNS 解析性能较差&#xff0c;耗时通常在 4ms 以上&#xff08;正常应该是 1ms 以内&#xff09; 初…

从0到1掌握 Spring Security(第三篇):三种认证方式,按配置一键切换

> 本文是Spring Security系列第三篇,将带你实现内存、JDBC和自定义三种认证方式的无缝切换,只需修改配置文件即可完成认证策略变更! ## 一、为什么需要多种认证方式? 在软件开发的不同阶段,我们需要不同的认证策略: - **开发阶段**:使用内存认证,快速配置测试账号…

阿里云国际站云防火墙:如何利用阿里云云防火墙实现细粒度的访问控制?

利用阿里云云防火墙实现细粒度的访问控制&#xff0c;可以从分层策略、精确匹配、动态调整三个方面着手&#xff0c;让不同业务、用户和资源的访问权限清晰可控。一、明确控制目标业务隔离&#xff1a;不同业务系统、部门或环境&#xff08;生产/测试&#xff09;之间互不干扰。…

rom定制系列------小米cc9机型 原生安卓15系统 双版线刷root 定制修改功能项

小米 9 Lite/CC9 机型代码;pyxis.搭载骁龙710处理器.适用于以下型号的小米机型&#xff1a;M1904F3BG, M1904F3BC. 刷写前提; 需要当前机型已经解锁bl的状态下进入fast模式刷写。此机型可以正常官方解锁与强解bl锁。效果都是一样的。在fast模式下装好联机驱动。使用官方平台刷…

解读60页全面认识大数据基础知识培训【附全文阅读】

该培训课件适用于对大数据知识感兴趣的初学者、企业管理人员、相关技术从业者等。内容围绕大数据展开,先介绍其基本概念,包括定义、数据级别、来源、类型、价值挖掘等,还阐述了 5 个 “V” 特征及与传统数据的区别。接着讲述大数据的发展演进,涵盖国际国内发展历程、发展阶…