散点图的含义
散点图是一种用于观察两个变量之间关系的图表类型。它通过在坐标轴上绘制数据点来展示变量之间的关联程度。每个数据点代表一个观测值,其中横轴表示一个变量的值,纵轴表示另一个变量的值。
散点图的绘制方法
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)
参数解释:
x:表示x轴的数据,可以是一个列表或数组。
y:表示y轴的数据,可以是一个列表或数组。
s:点的大小,默认 20,也可以是个数组,数组每个参数为对应点的大小。
c:点的颜色,默认蓝色 ‘b’,也可以是个 RGB 或 RGBA 二维行数组。
marker:点的样式,默认为 ‘o’,即圆形。其他常用的标记样式有’s’(正方形)、‘^’(三角形)等。。
cmap:Colormap,默认 None,标量或者是一个 colormap 的名字,只有 c 是一个浮点数数组的时才使用。如果没有申明就是 image.cmap。
norm:Normalize,默认 None,数据亮度在 0-1 之间,只有 c 是一个浮点数的数组的时才使用。
vmin,vmax::亮度设置,在 norm 参数存在时会忽略。
alpha::透明度设置,0-1 之间,默认 None,即不透明。
linewidths::标记点的长度。
edgecolors::颜色或颜色序列,默认为 ‘face’,可选值有 ‘face’, ‘none’, None。
plotnonfinite::布尔值,设置是否使用非限定的 c ( inf, -inf 或 nan) 绘制点。
**kwargs::其他参数。
s:表示散点的大小,默认为20。可以设置为一个标量值或与x、y相同大小的数组,用于指定每个散点的大小。
c:表示散点的颜色,默认为’blue’。可以使用颜色的名称(如’red’、‘green’等)或十六进制颜色码(如’#FF0000’表示红色)。
marker:表示散点的标记样式,默认为’o’,alpha:表示散点的透明度,默认为1.0,完全不透明。取值范围为[0, 1],其中0表示完全透明,1表示完全不透明。
散点图在量化交易中的应用
散点图在量化交易中有多种应用,以下是其中一些常见的应用:
- 相关性分析:散点图可以用于分析不同证券或指数之间的相关性。通过绘制两个或多个证券的收益率或价格的散点图,可以直观地观察它们之间的关系。相关性分析对于构建投资组合、评估对冲策略等都很重要。
- 风险与收益关系:散点图可以用于展示不同投资组合的风险与收益之间的关系。通过绘制不同投资组合的预期收益率与风险(如标准差)的散点图,可以帮助投资者比较不同投资组合的风险收益特征,从而做出更明智的投资决策。
- 套利机会识别:散点图可以用于识别套利机会。通过绘制两个或多个相关证券之间的价格差或价差变化的散点图,可以发现价格偏离正常范围的情况,从而识别出套利机会。
- 交易信号生成:散点图可以用于生成交易信号。例如,通过绘制某种技术指标(如移动平均线)与证券价格之间的散点图,可以观察到价格与指标之间的交叉点,从而生成买入或卖出信号。
- 市场情绪分析:散点图可以用于分析市场情绪。通过绘制市场指数与投资者情绪指标之间的散点图,可以观察到市场情绪与指数之间的关系,帮助投资者判断市场的热度和情绪波动。
- 量化策略评估:散点图可以用于评估量化交易策略的表现。通过绘制策略的收益率与某个基准指数之间的散点图,可以观察到策略与基准之间的相对表现,评估策略的优劣和稳定性。
总而言之,散点图在量化交易中是一种直观、可视化的工具,可以帮助投资者分析数据、发现模式、识别机会,从而做出更好的交易决策。
散点图在量化交易中的应用案例
在下面的案例中,通过观察股价与交易额的分布情况,判断股票的大致类型。
数据准备:[2023年一季度A股日线行情.xlsx]
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# 设置为默认字体
plt.rcParams['font.family'] = 'SimHei'
# 显示负数
plt.rcParams['axes.unicode_minus'] = False
# 导入数据
df = pd.read_excel("2023年一季度A股日线行情.xlsx")
# 将日期列转化为日期格式
df["trade_date"] = df["trade_date"].astype("str").apply(lambda x:x[:4]+"-"+x[4:6]+"-"+x[6:])
# 将日期列转换为日期类型,并设置为索引列
df['trade_date'] = pd.to_datetime(df['trade_date'])
df.set_index('trade_date', inplace=True)
# 从股票池中选择几只股票
# 筛选出股票代码是"000001.SZ"的股票
stock_1 = df[df['ts_code'] == '000001.SZ']
# 筛选出股票代码是"000002.SZ"的股票
stock_2 = df[df['ts_code'] == '000002.SZ']
# 汇总各个股票的收盘价与当日成交额,探索价格与成交额的分布关系
price_1 = stock_1['close']
amount_1 = stock_1['amount']
price_2 = stock_2['close']
amount_2 = stock_2['amount']
# 绘制散点图,试图通过成交价格与成交额的分布关系区分股票的类型
plt.scatter(price_1, amount_1, c='red', label = '平安银行')
plt.scatter(price_2, amount_2, c='blue', label = '万科A')
# 添加标题和坐标轴标签
plt.title('Scatter Plot: Price vs Amount')
plt.xlabel('Price')
plt.ylabel('Amount')
plt.legend()
# 显示图形
plt.show()
最终效果图如下:
可以看出,平安银行的股价要低于万科,大部分日成交额在200万以下;而万科的股价虽然较高,但是日成交额反而在150万以下,说明该股票的交易活跃度小于平安银行,因此,交易机会也就小于上一支股票。