首页 > 编程开发 > python数据分析 >
-
3D散点图展示股票相关性:板块联动分析
第16章 股票相关性分析实战
16.1 3D散点图展示股票相关性:板块联动分析
16.1.1 先讲个真实需求:老板要我分析白酒板块的联动性
上个月老板让我分析白酒板块的联动性,看看哪些股票的走势比较同步,哪些股票的走势比较独立。我之前只会用Excel做简单vb.net教程C#教程python教程SQL教程access 2010教程的相关性分析,完全不知道怎么用3D散点图展示股票相关性。后来发现Plotly可以轻松实现3D散点图,而且还能添加交互功能。今天我就把用3D散点图展示股票相关性的方法讲清楚,帮你快速做出专业的板块联动分析。
16.1.2 核心技术:股票相关性计算与3D可视化
-
股票相关性计算
股票相关性是指两只股票的价格走势之间的关联程度,通常用皮尔逊相关系数来衡量。相关系数的取值范围是[-1, 1],1表示完全正相关,-1表示完全负相关,0表示不相关。 -
3D可视化
Plotly的3D散点图可以将股票的相关性、涨跌幅、成交量等数据进行可视化展示,帮助我们更直观地分析股票之间的联动性。
16.1.3 实战:用3D散点图展示白酒板块股票相关性
-
实战代码:白酒板块股票相关性分析
python
# 1. 导入需要的库
import tushare as ts
import pandas as pd
import plotly.graph_objects as go
import numpy as np
from sklearn.decomposition import PCA
from datetime import datetime, timedelta
# 2. 获取白酒板块的股票列表
pro = ts.pro_api()
# 获取申万一级行业分类中的白酒板块股票
industry_list = pro.index_member(index_code='801120.SI', start_date='20250101', end_date='20250710')
# 获取股票的基本信息
stock_list = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,industry,list_date')
# 筛选出白酒板块的股票
white_wine_stocks = pd.merge(industry_list, stock_list, on='ts_code', how='inner')
# 只保留A股股票
white_wine_stocks = white_wine_stocks[white_wine_stocks['ts_code'].str.endswith(('.SH', '.SZ'))]
# 3. 获取白酒板块股票的日线数据
start_date = (datetime.now() - timedelta(days=365)).strftime('%Y%m%d')
end_date = datetime.now().strftime('%Y%m%d')
dfs = {}
for _, row in white_wine_stocks.iterrows():
ts_code = row['ts_code']
try:
df = pro.daily(ts_code=ts_code, start_date=start_date, end_date=end_date)
df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')
df.sort_values('trade_date', inplace=True)
df.set_index('trade_date', inplace=True)
# 计算涨跌幅
df['return'] = df['close'].pct_change()
dfs[ts_code] = df.dropna() # 去除缺失值
print(f'成功获取{row["name"]}({ts_code})的数据')
except Exception as e:
print(f'获取{row["name"]}({ts_code})的数据失败: {e}')
# 4. 计算股票之间的相关性
# 构建涨跌幅矩阵
return_matrix = pd.DataFrame()
for ts_code, df in dfs.items():
stock_name = white_wine_stocks[white_wine_stocks['ts_code'] == ts_code].iloc[0]['name']
return_matrix[stock_name] = df['return']
# 计算相关性矩阵
corr_matrix = return_matrix.corr()
print('相关性矩阵:')
print(corr_matrix)
# 5. 主成分分析(PCA)降维
# 对相关性矩阵进行主成分分析,将高维数据降维到3维
pca = PCA(n_components=3)
pca_result = pca.fit_transform(corr_matrix)
# 6. 计算股票的平均涨跌幅和成交量
stock_metrics = []
for ts_code, df in dfs.items():
stock_name = white_wine_stocks[white_wine_stocks['ts_code'] == ts_code].iloc[0]['name']
avg_return = df['return'].mean() * 252 # 年化平均涨跌幅
avg_vol = df['vol'].mean() / 10000 # 平均成交量(万手)
stock_metrics.append({
'name': stock_name,
'ts_code': ts_code,
'avg_return': avg_return,
'avg_vol': avg_vol
})
stock_metrics_df = pd.DataFrame(stock_metrics)
# 7. 绘制3D散点图
fig = go.Figure()
# 添加3D散点图
fig.add_trace(go.Scatter3d(
x=pca_result[:, 0],
y=pca_result[:, 1],
z=pca_result[:, 2],
text=stock_metrics_df['name'],
mode='markers+text',
marker=dict(
size=stock_metrics_df['avg_vol'] * 0.1, # 用平均成交量表示点的大小
color=stock_metrics_df['avg_return'], # 用年化平均涨跌幅表示点的颜色
colorscale='RdYlGn', # 颜色从红色(负涨跌幅)到黄色(零涨跌幅)到绿色(正涨跌幅)
colorbar=dict(title='年化平均涨跌幅'),
opacity=0.8
),
textposition='top center',
textfont=dict(size=10)
))
# 设置图表布局
fig.update_layout(
title={
'text': '白酒板块股票相关性3D散点图',
'y': 0.98,
'x': 0.5,
'xanchor': 'center',
'yanchor': 'top',
'font': dict(size=20, color='#333333')
},
scene=dict(
xaxis_title='主成分1',
yaxis_title='主成分2',
zaxis_title='主成分3',
xaxis=dict(showbackground=True, backgroundcolor='rgba(240, 240, 240, 0.5)'),
yaxis=dict(showbackground=True, backgroundcolor='rgba(240, 240, 240, 0.5)'),
zaxis=dict(showbackground=True, backgroundcolor='rgba(240, 240, 240, 0.5)'),
camera=dict(
eye=dict(x=1.5, y=1.5, z=0.5) # 设置相机视角
)
),
height=800,
width=1200,
template='plotly_white',
hovermode='closest'
)
# 保存网页
fig.write_html('白酒板块股票相关性3D散点图.html')
# 显示图表
fig.show()
逐行讲解:
pro.index_member(index_code='801120.SI', ...):获取申万一级行业分类中的白酒板块股票列表,801120.SI是白酒板块的指数代码
return_matrix = pd.DataFrame():构建涨跌幅矩阵,每一列代表一只股票的日涨跌幅
corr_matrix = return_matrix.corr():计算相关性矩阵,矩阵中的每个元素代表两只股票的相关系数
pca = PCA(n_components=3):创建主成分分析模型,将高维的相关性矩阵降维到3维
pca_result = pca.fit_transform(corr_matrix):对相关性矩阵进行主成分分析,得到3维的降维结果
size=stock_metrics_df['avg_vol'] * 0.1:用平均成交量表示点的大小,成交量越大,点越大
color=stock_metrics_df['avg_return']:用年化平均涨跌幅表示点的颜色,涨跌幅为正的股票显示为绿色,涨跌幅为负的股票显示为红色
运行结果:
会在浏览器中打开一个网页,显示白酒板块股票相关性的3D散点图,每个点代表一只股票,点的大小表示平均成交量,点的颜色表示年化平均涨跌幅,点的位置表示股票之间的相关性。可以通过鼠标拖动旋转3D视图,更直观地分析股票之间的联动性。
16.1.4 基础知识拓展:板块联动分析的方法
-
相关性分析
通过计算股票之间的相关系数,可以分析股票之间的联动性。相关系数越接近1,说明两只股票的走势越同步;相关系数越接近-1,说明两只股票的走势越相反;相关系数接近0,说明两只股票的走势不相关。 -
主成分分析(PCA)
主成分分析是一种降维技术,可以将高维数据降维到低维空间,同时保留数据的主要信息。在板块联动分析中,主成分分析可以将高维的相关性矩阵降维到3维空间,帮助我们更直观地分析股票之间的联动性。 -
聚类分析
聚类分析可以将股票分为不同的类别,同一类别的股票走势比较同步,不同类别的股票走势比较独立。常用的聚类算法有K-Means聚类、层次聚类等。
python
# 用K-Means聚类分析白酒板块股票
from sklearn.cluster import KMeans
# 对主成分分析的结果进行聚类
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(pca_result)
# 将聚类结果添加到股票指标数据框中
stock_metrics_df['cluster'] = clusters
# 绘制3D散点图,用不同颜色表示不同的聚类
fig = go.Figure()
colors = ['#ff0000', '#0000ff', '#00ff00']
for cluster in range(3):
mask = stock_metrics_df['cluster'] == cluster
fig.add_trace(go.Scatter3d(
x=pca_result[mask, 0],
y=pca_result[mask, 1],
z=pca_result[mask, 2],
text=stock_metrics_df[mask]['name'],
mode='markers+text',
marker=dict(
size=stock_metrics_df[mask]['avg_vol'] * 0.1,
color=colors[cluster],
opacity=0.8
),
textposition='top center',
textfont=dict(size=10),
name=f'聚类{cluster+1}'
))
fig.update_layout(
title='白酒板块股票相关性3D散点图(聚类分析)',
scene=dict(
xaxis_title='主成分1',
yaxis_title='主成分2',
zaxis_title='主成分3'
),
height=800,
width=1200,
template='plotly_white'
)
fig.write_html('白酒板块股票相关性3D散点图_聚类分析.html')
fig.show()
运行结果:
会在浏览器中打开一个网页,显示白酒板块股票相关性的3D散点图,不同颜色的点代表不同的聚类,同一聚类的股票走势比较同步,不同聚类的股票走势比较独立。
16.1.5 实战优化:添加板块指数对比
-
实战代码:添加白酒板块指数对比
python
# 获取白酒板块指数的日线数据
index_df = pro.index_daily(ts_code='801120.SI', start_date=start_date, end_date=end_date)
index_df['trade_date'] = pd.to_datetime(index_df['trade_date'], format='%Y%m%d')
index_df.sort_values('trade_date', inplace=True)
index_df.set_index('trade_date', inplace=True)
index_df['return'] = index_df['close'].pct_change()
# 计算股票与板块指数的相关性
stock_index_corr = []
for ts_code, df in dfs.items():
stock_name = white_wine_stocks[white_wine_stocks['ts_code'] == ts_code].iloc[0]['name']
# 对齐股票和板块指数的日期
merged_df = pd.merge(df['return'], index_df['return'], left_index=True, right_index=True, how='inner')
corr = merged_df.corr().iloc[0, 1]
stock_index_corr.append({
'name': stock_name,
'ts_code': ts_code,
'corr_with_index': corr
})
stock_index_corr_df = pd.DataFrame(stock_index_corr)
# 将股票与板块指数的相关性添加到股票指标数据框中
stock_metrics_df = pd.merge(stock_metrics_df, stock_index_corr_df, on=['name', 'ts_code'], how='inner')
# 绘制3D散点图,用点的颜色表示股票与板块指数的相关性
fig = go.Figure()
fig.add_trace(go.Scatter3d(
x=pca_result[:, 0],
y=pca_result[:, 1],
z=pca_result[:, 2],
text=stock_metrics_df['name'],
mode='markers+text',
marker=dict(
size=stock_metrics_df['avg_vol'] * 0.1,
color=stock_metrics_df['corr_with_index'],
colorscale='RdYlGn',
colorbar=dict(title='与板块指数的相关性'),
opacity=0.8
),
textposition='top center',
textfont=dict(size=10)
))
fig.update_layout(
title='白酒板块股票相关性3D散点图(与板块指数对比)',
scene=dict(
xaxis_title='主成分1',
yaxis_title='主成分2',
zaxis_title='主成分3'
),
height=800,
width=1200,
template='plotly_white'
)
fig.write_html('白酒板块股票相关性3D散点图_与板块指数对比.html')
fig.show()
运行结果:
会在浏览器中打开一个网页,显示白酒板块股票相关性的3D散点图,点的颜色表示股票与板块指数的相关性,相关性越高的股票颜色越绿,相关性越低的股票颜色越红。
16.1.6 总结:板块联动分析的应用场景
1.投资决策:通过板块联动分析,可以选择与板块指数相关性高的股票进行投资,享受板块上涨带来的收益;也可以选择与板块指数相关性低的股票进行投资,分散投资风险。
2.量化策略:在量化策略中,板块联动分析可以用于构建板块轮动策略,当某个板块的走势较强时,投资该板块的股票;当某个板块的走势较弱时,卖出该板块的股票。
3.风险控制:通过板块联动分析,可以识别出与板块走势相反的股票,在板块下跌时,投资这些股票可以对冲板块下跌的风险。
4.行业研究:通过板块联动分析,可以研究行业内不同股票的联动性,分析行业的竞争格局和发展趋势。
通过这个实战,你应该已经掌握了用3D散点图展示股票相关性的方法,包括相关性计算、主成分分析、3D可视化、聚类分析、板块指数对比等功能。接下来可以尝试用这些方法制作更专业的板块联动分析工具和投资决策系统。
下一节咱们就讲如何用Python做量化策略回测,帮你验证策略的有效性。
本站原创,转载请注明出处:https://www.xin3721.com/ArticlePrograme/csharp49712.html










