第1章:数据可视化——Matplotlib与Plotly基础
各位同学,欢迎来到《REITs量化投资从零到实战》的第一章。我是你们的老朋友,一个在量化圈摸爬滚打多年的工程师。今天咱们不聊虚的,直接上手数据可视化。
说实话,我见过太多人把时间花在复杂的数学模型上,结果连一张像样的走势图都画不出来。这就像你有一把好枪,却不会瞄准——白搭。数据可视化,说白了就是让数字开口说话。你想想看,一堆枯燥的收益率数据摆在那,谁能一眼看出规律?但一张图,三秒钟就能告诉你答案。
本章核心目标:掌握Matplotlib和Plotly两大可视化工具,能独立绘制REITs价格走势图、分红收益率分布图、相关性热力图。
1.1 为什么数据可视化对REITs量化如此重要?
我个人习惯,做任何量化策略之前,先画图。为什么?因为REITs市场有个特点——它的价格波动和分红收益往往不同步。你光看价格,可能觉得这只REITs要完蛋了,但一看分红收益率,嘿,还挺稳。这种信息,只有可视化才能直观呈现。
我在项目中遇到过一位基金经理,他花了三个月跑回测,结果因为没画相关性热力图,没发现持仓的几只REITs高度同质化。市场一波动,整个组合一起崩。嗯,这就是典型的「数据盲人」悲剧。
1.2 Matplotlib基础:从零开始画REITs价格走势图
Matplotlib是Python可视化的老大哥。虽然它长得有点「复古」,但胜在稳定、可控。咱们先来画一张最简单的REITs价格走势图。
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 模拟REITs价格数据(实际项目中从API获取)
dates = pd.date_range('2023-01-01', periods=100, freq='D')
prices = 100 + np.cumsum(np.random.randn(100) * 0.5)
plt.figure(figsize=(12, 6))
plt.plot(dates, prices, color='#2E86AB', linewidth=2)
plt.title('REITs价格走势图(模拟数据)', fontsize=16)
plt.xlabel('日期', fontsize=12)
plt.ylabel('价格(元)', fontsize=12)
plt.grid(True, alpha=0.3)
plt.show()
避坑指南:我曾经犯过一个低级错误——直接用原始数据画图,没做日期排序。结果走势图像一团乱麻。记住,画图前先 df.sort_index() 一下。
这里有个小技巧:figsize 参数我习惯设为 (12, 6),这个比例在大多数屏幕上显示效果最好。太窄了看不清趋势,太宽了又显得松散。
1.3 Plotly进阶:交互式分红收益率分布图
Matplotlib的图是静态的,但有时候我们需要交互——比如鼠标悬停看具体数值、缩放查看细节。这时候Plotly就派上用场了。
分红收益率(Dividend Yield)是REITs投资的核心指标。我一般会画一张分布图,看看市场上大部分REITs的收益率集中在什么区间。
import plotly.express as px
import pandas as pd
import numpy as np
# 模拟20只REITs的分红收益率数据
reits = ['REIT_' + str(i) for i in range(1, 21)]
yields = np.random.uniform(3.0, 8.0, 20)
df_yield = pd.DataFrame({'REITs': reits, '分红收益率(%)': yields})
fig = px.histogram(df_yield, x='分红收益率(%)', nbins=10,
title='REITs分红收益率分布图',
color_discrete_sequence=['#FF6B6B'])
fig.update_layout(xaxis_title='分红收益率(%)', yaxis_title='数量')
fig.show()
你想想看,如果大部分REITs的收益率集中在4%-6%,而你持有的那只只有2.5%,是不是该反思一下?这种洞察,光看表格是得不到的。
注意:Plotly生成的图是HTML格式,可以直接嵌入网页。但如果你在Jupyter Notebook里用,记得先运行 import plotly.io as pio; pio.renderers.default = 'notebook',否则可能不显示。
1.4 相关性热力图:一眼看穿REITs之间的「暧昧关系」
做组合投资最怕什么?怕你自以为分散了风险,结果持仓的REITs全是「一伙的」。相关性热力图就是用来揪出这种问题的。
我记得有一次帮朋友诊断他的REITs组合,他买了5只,我画了热力图一看,好家伙,其中3只的相关性超过0.85。这哪是分散投资?分明是把鸡蛋放在同一个篮子里,只不过篮子换了个颜色。
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 模拟10只REITs的收益率数据
np.random.seed(42)
returns = pd.DataFrame(np.random.randn(100, 10),
columns=['REIT_A', 'REIT_B', 'REIT_C', 'REIT_D', 'REIT_E',
'REIT_F', 'REIT_G', 'REIT_H', 'REIT_I', 'REIT_J'])
# 计算相关系数矩阵
corr_matrix = returns.corr()
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0,
square=True, linewidths=0.5, cbar_kws={'shrink': 0.8})
plt.title('REITs收益率相关性热力图', fontsize=16)
plt.show()
这张图怎么看?颜色越红,正相关性越强(同涨同跌);颜色越蓝,负相关性越强(一个涨一个跌)。理想情况下,你希望组合里的REITs之间相关性越低越好,最好是蓝色区域多一些。
实战经验:我一般设定一个阈值——相关性超过0.7的REITs,最多只保留一只。这个规则帮我躲过了好几次市场回调。
1.5 本章知识体系总览
为了让你对本章内容有个整体把握,我画了一张结构图。你可以把它当作学习地图,随时回来对照。
1.6 本章小结
好了,第一章的内容就到这里。咱们回顾一下:
- Matplotlib:画静态走势图,适合做报告、论文插图。记住先排序,再画图。
- Plotly:画交互式分布图,适合做数据探索。鼠标悬停看数值,这个功能很实用。
- 相关性热力图:用Seaborn配合Matplotlib,一眼识别REITs之间的「抱团」现象。
说实话,这三张图是我做REITs量化分析时最常用的。不管策略多复杂,我第一步永远是画这三张图。为什么?因为它们能快速告诉我:数据有没有问题?市场结构是什么样的?组合风险在哪里?
下一章,咱们会深入REITs的财务数据,用Python抓取真实的REITs数据,然后画更高级的图表。但今天这三张图,足够你应付80%的日常分析场景了。
记住:好的量化分析师,一定是个好的「画图匠」。别急着跑模型,先把图画明白。