第七章 时间序列可视化课堂练习

Author

kaka

1 案例数据

1.1 all_stock_2024:工商银行、招商应用、中信证券和贵州茅台四个股票2024各天交易数据

  • data为为日期变量,但该日期变量不规则(不连续),周末和公众假期没有交易数据;

  • 编码名称用于识别不同股票,注意不同股票有交易数据日期不一定一致,但本例种各股票均有242个交易日数据;

  • 开盘价到换手率 均为数值变量,开盘价到成交量与每股资产有关,不同股票间不可比;

  • 交易量的单位为手(百股)、成交额的单位为元,振幅等四个变量均为相对指标。

2 折线图和面积图

2.1 合并折线图

  • 将四只股票的涨跌幅 做作折线图,将四条折线在同一个图形输出;

  • 日期截取2024-9-12024-10-31

  • 添加一条纵轴为0的参考线,采用twodash 的线型;

  • 将图标题改为“合并涨跌幅折线图”。

2.2 分面折线图

  • 将四只股票的收盘 价格做作折线图,将四条折线图分面输出;

  • 日期截取一整年;

  • 并使用ggpol::geom_tshighlight2024-9-12024-10-31 时间段高亮显示

2.3 面积图

  • 将四只股票的收盘 价格做作面积图,将四个面积图分面输出;

  • 将成交量的单位改为万手

2.4 图形观察和代码编写的心得体会

2.4.0.1 折线图(涨跌幅趋势分析)

代码特点:

  • 数据筛选:使用 dplyr 进行日期范围筛选,确保数据集中在 2024-09-01 至 2024-10-31 之间。

  • 主题优化mytheme 调整图例位置 (legend.position) 并移除背景 (legend.background),使图表更简洁。

  • 基准线geom_hline(yintercept = 0) 添加水平线,帮助观察涨跌幅的正负变化。

图形观察:

  • 可以直观对比不同股票/基金的涨跌幅趋势。

  • 如果某条线长期低于 0,说明该资产在该时间段表现不佳;反之则表现较好。

  • 适合用于多资产对比分析。

    2.4.0.2 分面折线图(收盘价趋势分析)

    代码特点:

    • 分面绘图facet_wrap(~名称, ncol=2, scale="free") 按资产名称分面,并允许各子图 y 轴独立缩放。

    • x 轴优化

      • scale_x_date 调整日期显示格式(如 %b 只显示月份缩写)。

      • axis.text.x 旋转 90°,避免标签重叠。

    • 高亮区间geom_tshighlight(需 ggpol 包)对特定时间段(2024-09-01 至 2024-10-31)进行背景高亮,突出关键区间。

    图形观察:

    • 分面图适合比较多个资产的独立趋势,避免线条重叠导致混乱。

    • 高亮区间能快速识别特定时间段的价格波动(如政策发布期、财报季)。

    • 如果某些资产收盘价波动剧烈,可能需要进一步分析异常原因。

      2.4.0.3 面积图(成交量/成交额分析)

      代码特点:

      • 单位转换y=成交量/10000 将原始数据转换为“万手”,提高可读性。

      • 面积图geom_area() 展示成交量的累积趋势,适合观察市场活跃度。

      • 分面+自由刻度facet_wrap 让不同资产的成交量独立显示,避免量纲差异影响观察。

      图形观察:

      • 面积图能直观反映市场交易活跃度,高峰区间可能对应重要事件(如财报、政策发布)。

      • 如果某资产成交量长期低迷,可能流动性较差,需谨慎投资。

      • 结合涨跌幅折线图,可分析“量价关系”(如放量上涨 vs. 缩量下跌)。

        2.4.1 代码编写心得总结

        1. 数据清洗是关键

          • 使用 dplyr 筛选、转换数据(如日期范围、单位换算)能让后续绘图更流畅。

          • 确保日期列是 Date 类型,否则 scale_x_date 会报错。

        2. 分面图 (facet_wrap) 的适用场景

          • 当需要对比多个变量的趋势且 y 轴量纲差异大时,scale="free" 非常有用。

          • 但需注意分面过多可能导致图形拥挤,可调整 ncol 或改用交互式绘图(如 plotly)。

        3. 主题 (theme) 优化技巧

          • 移除网格线 (panel.grid.minor=element_blank()) 让图表更简洁。

          • 旋转 x 轴标签 (angle=90) 避免重叠,但需配合 hjust/vjust 微调位置。

        4. 扩展包的选择

          • ggpolgeom_tshighlight 能快速高亮时间区间,但需额外安装。

          • 类似效果也可用 annotate("rect", ...) 实现,但代码稍复杂。

        5. 图形逻辑要清晰

          • 涨跌幅适合折线图 + 水平基准线(y=0)。

          • 成交量/成交额适合面积图(强调累积效应)。

          • 多资产对比优先分面,单资产分析可叠加图层。

3 流线图和地平线图

3.1 流线图

  • 将四只股票的交易额 做作流线图,将四个面积图分面输出;

  • 将交易额的单位改为亿元

3.2 地平线图

  • 采用ggHoriPlot::geom_horizon函数,对四只股票的交易额 做作地平线图
  • 设置原点为均值origin='mean',输出配色图例

3.3 图形观察和代码编写的心得体会

3.3.0.1 流线图(ggstream 成交额分析)

代码特点:

  • 流线图 (geom_stream):展示多资产成交额的流动趋势,适合观察资金流向的强弱变化。

  • 带宽调整 (bw = 0.3):控制曲线的平滑度,值越小曲线越尖锐,值越大越平滑。

  • 图例优化

    • legend.position="bottom" 将图例置于底部,避免遮挡数据。

    • guides(fill=guide_legend(nrow=2, title=NULL)) 让图例分两行显示,并移除标题,节省空间。

图形观察:

  • 流线图能直观反映不同资产的成交额占比变化,适合观察市场资金的轮动效应。

  • 如果某资产的流线宽度在某段时间显著增大,说明资金涌入(如政策利好或市场热点)。

  • 适合对比多个资产的相对活跃度,但需注意 Y 轴为堆积比例,而非绝对值。

3.3.0.2 2. 地平线图(ggHoriPlot 成交额分析)

代码特点:

  • 地平线图 (geom_horizon):将时间序列数据压缩为横向色块,适合高密度数据可视化。

    • origin='mean':以均值为基准线,高于均值的显示在上方,低于的显示在下方。

    • horizonscale=10:将数据分成 10 个区间,颜色深浅代表幅度差异。

  • 分面优化facet_grid(名称~.) 垂直排列各资产,便于纵向对比。

  • 配色方案scale_fill_hcl(palette='RdYlBu') 使用红-黄-蓝渐变,突出正负变化。

图形观察:

  • 地平线图通过颜色和高度快速识别异常波动(如深色块代表成交额大幅偏离均值)。

  • 适合长期趋势分析,能压缩大量数据到有限空间(如监控多资产全年表现)。

  • 如果某资产颜色分布均匀,说明成交额稳定;若出现集中深色区,需结合事件分析原因。

3.3.1 代码编写心得总结

  1. 流线图 vs. 面积图

    • 流线图 (ggstream) 强调流动感和比例变化,适合多资产对比。

    • 面积图 (geom_area) 更侧重累积量,适合单一资产的绝对趋势分析。

  2. 地平线图的适用场景

    • 当时间序列数据过长时,地平线图能避免折线图的拥挤问题。

    • 通过 horizonscale 调整灵敏度,值越小对波动越敏感。

  3. 配色与主题优化

    • 流线图的填充色 (fill=名称) 需避免颜色相近导致混淆。

    • 地平线图的 RdYlBu 调色板能自然区分正负值(红=高,蓝=低)。

  4. 分面策略选择

    • facet_wrap 适合多资产横向排列,facet_grid 适合纵向对比。

    • 分面时建议 scale="free"(流线图除外,因其本身已标准化)。

  5. 常见问题与解决

    • 流线图 Y 轴误导性:Y 轴为比例而非真实值,需在标题或注释中说明。

    • 地平图色块不清晰:调整 horizonscale 或改用 origin='median' 减少异常值影响。

4 不规则时间序列图

4.1 数据准备

  • 通过zoo::rollmean 时间收盘价的5天、10天和20天的移动平均

  • 将日期变量转化为id变量

4.2 平滑曲线图

  • 将四只股票收盘价和3种移动平均的折线图分面输出;

  • 横轴的每隔30天一个刻度,只显示月/日;

4.3 K线图

  • 选择工商银行数据作出,2024年的K线图

  • scale_x_continuous 将横轴坐标刻度转化回日期型

4.4 图形观察和代码编写的心得体会

4.4.1

代码特点:

  • 数据转换

    • 使用 zoo::rollmean() 计算 5/10/20 日均线(MA),align="right" 确保当前点包含在均值计算中。

    • gather() 将收盘价和均线转为长格式,便于用 color=指标 区分线条。

  • 分面优化

    • facet_wrap(~名称, ncol=2, scale="free") 独立显示各资产,避免量纲差异干扰。

    • scale_x_continuous 自定义 X 轴标签,显示日期(如 "05-01"),避免默认数值索引不直观。

图形观察:

  • 均线交叉策略:MA5 上穿 MA20 可能预示上涨趋势(金叉),反之(死叉)可能下跌。

  • 趋势强弱:若收盘价持续高于均线,说明处于上升通道;若频繁穿越均线,则震荡明显。

  • 分面对比:可快速识别哪些资产趋势稳定(如均线平行排列),哪些波动剧烈(如均线频繁交叉)。

改进建议

  • 添加 geom_vline(xintercept=关键事件日期) 标记财报、政策等时间点,增强解释性。

  • 对震荡型资产,可叠加 geom_ribbon(aes(ymin=ma10, ymax=ma20), alpha=0.2) 显示均线通道。

4.4.2 2. 单资产K线图(df2 工商银行)

代码特点:

  • K线绘制

    • geom_segment 画上下影线(最低价到最高价)。

    • geom_rect 画实体部分(开盘价到收盘价),用红/绿色填充区分涨跌(fill = 收盘 > 开盘)。

  • 均线叠加

    • 通过 color 参数区分 MA5/10/20,并手动指定颜色(蓝/橙/紫)。
  • 主题优化

    • theme_minimal() 保持简洁,legend.position="top" 防止图例遮挡数据。

图形观察:

  • 价格行为:长上影线(红色实体+长上影)可能预示抛压,长下影线(绿色实体+长下影)可能反映支撑。

  • 均线支撑/阻力:若价格多次在 MA20 处反弹,该均线可能成为关键支撑位。

  • 量价关系(若叠加成交量):放量突破均线时,信号更可靠。