首页 > 编程开发 > python数据分析 >
-
多股对比:在同一画布中展示多只股票走势
第13章 多股对比实战
13.1 多股对比:在同一画布中展示多只股票走势
13.1.1 先讲个真实需求:老板要我对比茅台和五粮液的走势
上个月老板让我对比贵州茅台和五粮液的走势,看看哪只股票更值得投资。我之前只会画单只股票的K线图,完全不知道怎么在同一画布中展示多只股票的走势。后来发现Plotly可以轻松实现多股对比,而且还能添加技术指标和交互功能。今天我vb.net教程C#教程python教程SQL教程access 2010教程就把多股对比的实现方法讲清楚,帮你快速做出专业的多股对比分析。
13.1.2 核心技术:Plotly的多trace布局与数据标准化
-
多trace布局
Plotly支持在同一画布中添加多个trace(比如多个K线图、多个均线),可以通过fig.add_trace()方法添加多个trace,每个trace对应一只股票的数据。 -
数据标准化
由于不同股票的价格差异较大(比如茅台股价1800元,五粮液股价200元),直接在同一画布中展示会导致五粮液的K线图几乎看不到。因此需要对数据进行标准化处理,比如计算涨跌幅或归一化处理,使不同股票的走势在同一画布中更直观。
13.1.3 实战1:用Plotly实现多股价格对比
-
实战代码:多股价格对比
python
# 1. 导入需要的库
import tushare as ts
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import numpy as np
# 2. 获取多只股票的日线数据
pro = ts.pro_api()
# 获取贵州茅台的日线数据
df_maotai = pro.daily(ts_code='600519.SH', start_date='20250101', end_date='20250710')
# 获取五粮液的日线数据
df_wuliangye = pro.daily(ts_code='000858.SZ', start_date='20250101', end_date='20250710')
# 获取泸州老窖的日线数据
df_luzhou = pro.daily(ts_code='000568.SZ', start_date='20250101', end_date='20250710')
# 3. 数据预处理
# 处理贵州茅台的数据
df_maotai['trade_date'] = pd.to_datetime(df_maotai['trade_date'], format='%Y%m%d')
df_maotai.sort_values('trade_date', inplace=True)
df_maotai.set_index('trade_date', inplace=True)
df_maotai['ma5'] = df_maotai['close'].rolling(window=5).mean()
df_maotai['ma20'] = df_maotai['close'].rolling(window=20).mean()
# 处理五粮液的数据
df_wuliangye['trade_date'] = pd.to_datetime(df_wuliangye['trade_date'], format='%Y%m%d')
df_wuliangye.sort_values('trade_date', inplace=True)
df_wuliangye.set_index('trade_date', inplace=True)
df_wuliangye['ma5'] = df_wuliangye['close'].rolling(window=5).mean()
df_wuliangye['ma20'] = df_wuliangye['close'].rolling(window=20).mean()
# 处理泸州老窖的数据
df_luzhou['trade_date'] = pd.to_datetime(df_luzhou['trade_date'], format='%Y%m%d')
df_luzhou.sort_values('trade_date', inplace=True)
df_luzhou.set_index('trade_date', inplace=True)
df_luzhou['ma5'] = df_luzhou['close'].rolling(window=5).mean()
df_luzhou['ma20'] = df_luzhou['close'].rolling(window=20).mean()
# 4. 创建子图
fig = make_subplots(
rows=2, cols=1,
shared_xaxes=True,
vertical_spacing=0.05,
row_heights=[0.7, 0.3],
subplot_titles=('多股价格对比', '成交量对比') # 子图标题
)
# 5. 添加贵州茅台的K线图和均线到第一个子图
fig.add_trace(
go.Candlestick(
x=df_maotai.index,
open=df_maotai['open'],
high=df_maotai['high'],
low=df_maotai['low'],
close=df_maotai['close'],
name='贵州茅台',
increasing_line_color='red',
decreasing_line_color='green',
increasing_fillcolor='rgba(255, 0, 0, 0.3)',
decreasing_fillcolor='rgba(0, 255, 0, 0.3)',
hovertemplate='<b>日期: %{x}</b><br>'
'贵州茅台<br>'
'开盘价: %{open:.2f}元<br>'
'最高价: %{high:.2f}元<br>'
'最低价: %{low:.2f}元<br>'
'收盘价: %{close:.2f}元<br>'
'<extra></extra>'
),
row=1, col=1
)
fig.add_trace(
go.Scatter(
x=df_maotai.index,
y=df_maotai['ma5'],
name='贵州茅台5日均线',
line=dict(color='#1f77b4', width=2),
opacity=0.8,
hovertemplate='贵州茅台5日均线: %{y:.2f}元<br><extra></extra>'
),
row=1, col=1
)
fig.add_trace(
go.Scatter(
x=df_maotai.index,
y=df_maotai['ma20'],
name='贵州茅台20日均线',
line=dict(color='#ff7f0e', width=2),
opacity=0.8,
hovertemplate='贵州茅台20日均线: %{y:.2f}元<br><extra></extra>'
),
row=1, col=1
)
# 6. 添加五粮液的K线图和均线到第一个子图
fig.add_trace(
go.Candlestick(
x=df_wuliangye.index,
open=df_wuliangye['open'],
high=df_wuliangye['high'],
low=df_wuliangye['low'],
close=df_wuliangye['close'],
name='五粮液',
increasing_line_color='blue',
decreasing_line_color='orange',
increasing_fillcolor='rgba(0, 0, 255, 0.3)',
decreasing_fillcolor='rgba(255, 165, 0, 0.3)',
hovertemplate='<b>日期: %{x}</b><br>'
'五粮液<br>'
'开盘价: %{open:.2f}元<br>'
'最高价: %{high:.2f}元<br>'
'最低价: %{low:.2f}元<br>'
'收盘价: %{close:.2f}元<br>'
'<extra></extra>'
),
row=1, col=1
)
fig.add_trace(
go.Scatter(
x=df_wuliangye.index,
y=df_wuliangye['ma5'],
name='五粮液5日均线',
line=dict(color='#9400d3', width=2),
opacity=0.8,
hovertemplate='五粮液5日均线: %{y:.2f}元<br><extra></extra>'
),
row=1, col=1
)
fig.add_trace(
go.Scatter(
x=df_wuliangye.index,
y=df_wuliangye['ma20'],
name='五粮液20日均线',
line=dict(color='#4b0082', width=2),
opacity=0.8,
hovertemplate='五粮液20日均线: %{y:.2f}元<br><extra></extra>'
),
row=1, col=1
)
# 7. 添加泸州老窖的K线图和均线到第一个子图
fig.add_trace(
go.Candlestick(
x=df_luzhou.index,
open=df_luzhou['open'],
high=df_luzhou['high'],
low=df_luzhou['low'],
close=df_luzhou['close'],
name='泸州老窖',
increasing_line_color='purple',
decreasing_line_color='pink',
increasing_fillcolor='rgba(128, 0, 128, 0.3)',
decreasing_fillcolor='rgba(255, 192, 203, 0.3)',
hovertemplate='<b>日期: %{x}</b><br>'
'泸州老窖<br>'
'开盘价: %{open:.2f}元<br>'
'最高价: %{high:.2f}元<br>'
'最低价: %{low:.2f}元<br>'
'收盘价: %{close:.2f}元<br>'
'<extra></extra>'
),
row=1, col=1
)
fig.add_trace(
go.Scatter(
x=df_luzhou.index,
y=df_luzhou['ma5'],
name='泸州老窖5日均线',
line=dict(color='#00ff00', width=2),
opacity=0.8,
hovertemplate='泸州老窖5日均线: %{y:.2f}元<br><extra></extra>'
),
row=1, col=1
)
fig.add_trace(
go.Scatter(
x=df_luzhou.index,
y=df_luzhou['ma20'],
name='泸州老窖20日均线',
line=dict(color='#008000', width=2),
opacity=0.8,
hovertemplate='泸州老窖20日均线: %{y:.2f}元<br><extra></extra>'
),
row=1, col=1
)
# 8. 添加成交量对比到第二个子图
fig.add_trace(
go.Bar(
x=df_maotai.index,
y=df_maotai['vol'],
name='贵州茅台成交量',
marker_color='rgba(255, 0, 0, 0.7)',
opacity=0.7,
hovertemplate='贵州茅台成交量: %{y:.0f}手<br><extra></extra>'
),
row=2, col=1
)
fig.add_trace(
go.Bar(
x=df_wuliangye.index,
y=df_wuliangye['vol'],
name='五粮液成交量',
marker_color='rgba(0, 0, 255, 0.7)',
opacity=0.7,
hovertemplate='五粮液成交量: %{y:.0f}手<br><extra></extra>'
),
row=2, col=1
)
fig.add_trace(
go.Bar(
x=df_luzhou.index,
y=df_luzhou['vol'],
name='泸州老窖成交量',
marker_color='rgba(128, 0, 128, 0.7)',
opacity=0.7,
hovertemplate='泸州老窖成交量: %{y:.0f}手<br><extra></extra>'
),
row=2, col=1
)
# 9. 设置图表布局
fig.update_layout(
title={
'text': '贵州茅台、五粮液、泸州老窖多股对比分析',
'y': 0.98,
'x': 0.5,
'xanchor': 'center',
'yanchor': 'top',
'font': dict(size=20, color='#333333')
},
yaxis_title='价格(元)',
yaxis2_title='成交量(手)',
xaxis_title='日期',
height=1000,
width=1200,
template='plotly_white',
hovermode='x unified',
legend={
'x': 0.02,
'y': 0.98,
'bgcolor': 'rgba(255, 255, 255, 0.8)',
'bordercolor': '#333333',
'borderwidth': 1,
'font': dict(size=10)
},
margin=dict(l=50, r=50, t=80, b=50),
barmode='group' # 成交量柱形图分组显示
)
# 10. 设置X轴和Y轴的样式
fig.update_xaxes(
rangeslider_visible=False,
tickformat='%Y-%m-%d',
tickangle=45
)
fig.update_yaxes(
gridcolor='#cccccc',
gridwidth=1,
griddash='--'
)
# 11. 保存网页
fig.write_html('多股对比分析_价格对比.html')
# 12. 显示图表
fig.show()
逐行讲解:
subplot_titles=('多股价格对比', '成交量对比'):设置子图的标题
go.Candlestick(..., name='贵州茅台'):为每个K线图设置名称,方便在图例中区分
barmode='group':设置成交量柱形图的显示模式为分组显示,这样不同股票的成交量柱形图会并排显示,更直观
运行结果:
会在浏览器中打开一个网页,显示贵州茅台、五粮液、泸州老窖的多股价格对比和成交量对比,鼠标悬停时会显示每只股票的详细数据。
13.1.4 实战2:用Plotly实现多股涨跌幅对比
-
实战代码:多股涨跌幅对比
python
# 1. 导入需要的库
import tushare as ts
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import numpy as np
# 2. 获取多只股票的日线数据
pro = ts.pro_api()
# 获取贵州茅台的日线数据
df_maotai = pro.daily(ts_code='600519.SH', start_date='20250101', end_date='20250710')
# 获取五粮液的日线数据
df_wuliangye = pro.daily(ts_code='000858.SZ', start_date='20250101', end_date='20250710')
# 获取泸州老窖的日线数据
df_luzhou = pro.daily(ts_code='000568.SZ', start_date='20250101', end_date='20250710')
# 获取上证指数的日线数据
df_sh = pro.index_daily(ts_code='000001.SH', start_date='20250101', end_date='20250710')
# 3. 数据预处理
# 处理贵州茅台的数据
df_maotai['trade_date'] = pd.to_datetime(df_maotai['trade_date'], format='%Y%m%d')
df_maotai.sort_values('trade_date', inplace=True)
df_maotai.set_index('trade_date', inplace=True)
# 计算涨跌幅(相对于第一个交易日的收盘价)
df_maotai['return'] = (df_maotai['close'] / df_maotai['close'].iloc[0] - 1) * 100
# 处理五粮液的数据
df_wuliangye['trade_date'] = pd.to_datetime(df_wuliangye['trade_date'], format='%Y%m%d')
df_wuliangye.sort_values('trade_date', inplace=True)
df_wuliangye.set_index('trade_date', inplace=True)
df_wuliangye['return'] = (df_wuliangye['close'] / df_wuliangye['close'].iloc[0] - 1) * 100
# 处理泸州老窖的数据
df_luzhou['trade_date'] = pd.to_datetime(df_luzhou['trade_date'], format='%Y%m%d')
df_luzhou.sort_values('trade_date', inplace=True)
df_luzhou.set_index('trade_date', inplace=True)
df_luzhou['return'] = (df_luzhou['close'] / df_luzhou['close'].iloc[0] - 1) * 100
# 处理上证指数的数据
df_sh['trade_date'] = pd.to_datetime(df_sh['trade_date'], format='%Y%m%d')
df_sh.sort_values('trade_date', inplace=True)
df_sh.set_index('trade_date', inplace=True)
df_sh['return'] = (df_sh['close'] / df_sh['close'].iloc[0] - 1) * 100
# 4. 创建子图
fig = make_subplots(
rows=1, cols=1,
subplot_titles=('多股涨跌幅对比(相对于2025年1月1日)',)
)
# 5. 添加多只股票的涨跌幅曲线到子图
fig.add_trace(
go.Scatter(
x=df_maotai.index,
y=df_maotai['return'],
name='贵州茅台',
line=dict(color='#ff0000', width=3),
opacity=0.8,
hovertemplate='<b>日期: %{x}</b><br>'
'贵州茅台涨跌幅: %{y:.2f}%<br>'
'收盘价: %{customdata:.2f}元<br>'
'<extra></extra>',
customdata=df_maotai['close']
)
)
fig.add_trace(
go.Scatter(
x=df_wuliangye.index,
y=df_wuliangye['return'],
name='五粮液',
line=dict(color='#0000ff', width=3),
opacity=0.8,
hovertemplate='<b>日期: %{x}</b><br>'
'五粮液涨跌幅: %{y:.2f}%<br>'
'收盘价: %{customdata:.2f}元<br>'
'<extra></extra>',
customdata=df_wuliangye['close']
)
)
fig.add_trace(
go.Scatter(
x=df_luzhou.index,
y=df_luzhou['return'],
name='泸州老窖',
line=dict(color='#800080', width=3),
opacity=0.8,
hovertemplate='<b>日期: %{x}</b><br>'
'泸州老窖涨跌幅: %{y:.2f}%<br>'
'收盘价: %{customdata:.2f}元<br>'
'<extra></extra>',
customdata=df_luzhou['close']
)
)
fig.add_trace(
go.Scatter(
x=df_sh.index,
y=df_sh['return'],
name='上证指数',
line=dict(color='#000000', width=3, dash='dash'),
opacity=0.8,
hovertemplate='<b>日期: %{x}</b><br>'
'上证指数涨跌幅: %{y:.2f}%<br>'
'收盘价: %{customdata:.2f}点<br>'
'<extra></extra>',
customdata=df_sh['close']
)
)
# 6. 添加基准线(涨跌幅为0)
fig.add_hline(
y=0,
line=dict(color='#cccccc', width=2, dash='dash'),
name='基准线'
)
# 7. 设置图表布局
fig.update_layout(
title={
'text': '贵州茅台、五粮液、泸州老窖与上证指数涨跌幅对比分析',
'y': 0.98,
'x': 0.5,
'xanchor': 'center',
'yanchor': 'top',
'font': dict(size=20, color='#333333')
},
yaxis_title='涨跌幅(%)',
xaxis_title='日期',
height=800,
width=1200,
template='plotly_white',
hovermode='x unified',
legend={
'x': 0.02,
'y': 0.98,
'bgcolor': 'rgba(255, 255, 255, 0.8)',
'bordercolor': '#333333',
'borderwidth': 1,
'font': dict(size=10)
},
margin=dict(l=50, r=50, t=80, b=50)
)
# 8. 设置X轴和Y轴的样式
fig.update_xaxes(
rangeslider_visible=False,
tickformat='%Y-%m-%d',
tickangle=45
)
fig.update_yaxes(
gridcolor='#cccccc',
gridwidth=1,
griddash='--',
tickformat='.2f%' # Y轴标签格式为百分比,保留两位小数
)
# 9. 保存网页
fig.write_html('多股对比分析_涨跌幅对比.html')
# 10. 显示图表
fig.show()
逐行讲解:
df_maotai['return'] = (df_maotai['close'] / df_maotai['close'].iloc[0] - 1) * 100:计算涨跌幅,相对于第一个交易日的收盘价,乘以100转换为百分比
go.Scatter(..., line=dict(color='#ff0000', width=3)):为每个涨跌幅曲线设置不同的颜色和宽度,方便区分
fig.add_hline(y=0, ...):添加基准线,涨跌幅为0表示和第一个交易日的收盘价相同
tickformat='.2f%':设置Y轴标签的格式为百分比,保留两位小数
运行结果:
会在浏览器中打开一个网页,显示贵州茅台、五粮液、泸州老窖与上证指数的涨跌幅对比,鼠标悬停时会显示每只股票的涨跌幅和收盘价。
13.1.5 基础知识拓展:多股对比的分析方法
-
相对强弱分析
通过比较不同股票的涨跌幅,可以分析哪只股票的走势更强。比如在2025年1月1日到2025年7月10日期间,贵州茅台的涨跌幅为20%,五粮液的涨跌幅为15%,说明贵州茅台的走势更强。 -
相关性分析
可以通过计算不同股票的相关性,分析它们的走势是否同步。比如贵州茅台和五粮液的相关性为0.9,说明它们的走势非常同步,可能受到相同的行业因素影响。
python
# 计算贵州茅台和五粮液的相关性
corr = df_maotai['close'].corr(df_wuliangye['close'])
print(f'贵州茅台和五粮液的相关性: {corr:.2f}')
-
行业对比
可以将个股的走势与行业指数或大盘指数进行对比,分析个股是否跑赢行业或大盘。比如贵州茅台的涨跌幅为20%,上证指数的涨跌幅为5%,说明贵州茅台跑赢了大盘。
13.1.6 实战3:用Plotly实现多股技术指标对比
-
实战代码:多股MACD对比
python
# 1. 导入需要的库
import tushare as ts
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import numpy as np
# 2. 获取多只股票的日线数据
pro = ts.pro_api()
# 获取贵州茅台的日线数据
df_maotai = pro.daily(ts_code='600519.SH', start_date='20250101', end_date='20250710')
# 获取五粮液的日线数据
df_wuliangye = pro.daily(ts_code='000858.SZ', start_date='20250101', end_date='20250710')
# 3. 数据预处理
# 处理贵州茅台的数据
df_maotai['trade_date'] = pd.to_datetime(df_maotai['trade_date'], format='%Y%m%d')
df_maotai.sort_values('trade_date', inplace=True)
df_maotai.set_index('trade_date', inplace=True)
# 计算MACD
ema12 = df_maotai['close'].ewm(span=12, adjust=False).mean()
ema26 = df_maotai['close'].ewm(span=26, adjust=False).mean()
df_maotai['dif'] = ema12 - ema26
df_maotai['dea'] = df_maotai['dif'].ewm(span=9, adjust=False).mean()
df_maotai['macd'] = 2 * (df_maotai['dif'] - df_maotai['dea'])
# 处理五粮液的数据
df_wuliangye['trade_date'] = pd.to_datetime(df_wuliangye['trade_date'], format='%Y%m%d')
df_wuliangye.sort_values('trade_date', inplace=True)
df_wuliangye.set_index('trade_date', inplace=True)
# 计算MACD
ema12 = df_wuliangye['close'].ewm(span=12, adjust=False).mean()
ema26 = df_wuliangye['close'].ewm(span=26, adjust=False).mean()
df_wuliangye['dif'] = ema12 - ema26
df_wuliangye['dea'] = df_wuliangye['dif'].ewm(span=9, adjust=False).mean()
df_wuliangye['macd'] = 2 * (df_wuliangye['dif'] - df_wuliangye['dea'])
# 4. 创建子图
fig = make_subplots(
rows=2, cols=1,
shared_xaxes=True,
vertical_spacing=0.05,
row_heights=[0.5, 0.5],
subplot_titles=('贵州茅台MACD指标', '五粮液MACD指标')
)
# 5. 添加贵州茅台的MACD指标到第一个子图
fig.add_trace(
go.Scatter(
x=df_maotai.index,
y=df_maotai['dif'],
name='贵州茅台DIF(快线)',
line=dict(color='#1f77b4', width=2),
opacity=0.8,
hovertemplate='<b>日期: %{x}</b><br>'
'贵州茅台DIF: %{y:.2f}<br>'
'<extra></extra>'
),
row=1, col=1
)
fig.add_trace(
go.Scatter(
x=df_maotai.index,
y=df_maotai['dea'],
name='贵州茅台DEA(慢线)',
line=dict(color='#ff7f0e', width=2),
opacity=0.8,
hovertemplate='<b>日期: %{x}</b><br>'
'贵州茅台DEA: %{y:.2f}<br>'
'<extra></extra>'
),
row=1, col=1
)
fig.add_trace(
go.Bar(
x=df_maotai.index,
y=df_maotai['macd'],
name='贵州茅台MACD柱状图',
marker_color=np.where(df_maotai['macd'] > 0, '#1f77b4', '#d62728'),
opacity=0.5,
hovertemplate='<b>日期: %{x}</b><br>'
'贵州茅台MACD: %{y:.2f}<br>'
'<extra></extra>'
),
row=1, col=1
)
# 6. 添加五粮液的MACD指标到第二个子图
fig.add_trace(
go.Scatter(
x=df_wuliangye.index,
y=df_wuliangye['dif'],
name='五粮液DIF(快线)',
line=dict(color='#1f77b4', width=2),
opacity=0.8,
hovertemplate='<b>日期: %{x}</b><br>'
'五粮液DIF: %{y:.2f}<br>'
'<extra></extra>'
),
row=2, col=1
)
fig.add_trace(
go.Scatter(
x=df_wuliangye.index,
y=df_wuliangye['dea'],
name='五粮液DEA(慢线)',
line=dict(color='#ff7f0e', width=2),
opacity=0.8,
hovertemplate='<b>日期: %{x}</b><br>'
'五粮液DEA: %{y:.2f}<br>'
'<extra></extra>'
),
row=2, col=1
)
fig.add_trace(
go.Bar(
x=df_wuliangye.index,
y=df_wuliangye['macd'],
name='五粮液MACD柱状图',
marker_color=np.where(df_wuliangye['macd'] > 0, '#1f77b4', '#d62728'),
opacity=0.5,
hovertemplate='<b>日期: %{x}</b><br>'
'五粮液MACD: %{y:.2f}<br>'
'<extra></extra>'
),
row=2, col=1
)
# 7. 设置图表布局
fig.update_layout(
title={
'text': '贵州茅台与五粮液MACD指标对比分析',
'y': 0.98,
'x': 0.5,
'xanchor': 'center',
'yanchor': 'top',
'font': dict(size=20, color='#333333')
},
yaxis_title='MACD',
yaxis2_title='MACD',
xaxis_title='日期',
height=1000,
width=1200,
template='plotly_white',
hovermode='x unified',
legend={
'x': 0.02,
'y': 0.98,
'bgcolor': 'rgba(255, 255, 255, 0.8)',
'bordercolor': '#333333',
'borderwidth': 1,
'font': dict(size=10)
},
margin=dict(l=50, r=50, t=80, b=50)
)
# 8. 设置X轴和Y轴的样式
fig.update_xaxes(
rangeslider_visible=False,
tickformat='%Y-%m-%d',
tickangle=45
)
fig.update_yaxes(
gridcolor='#cccccc',
gridwidth=1,
griddash='--'
)
# 9. 保存网页
fig.write_html('多股对比分析_MACD对比.html')
# 10. 显示图表
fig.show()
运行结果:
会在浏览器中打开一个网页,显示贵州茅台和五粮液的MACD指标对比,鼠标悬停时会显示每只股票的MACD详细数据。
13.1.7 总结:多股对比的应用场景
1.投资决策:通过多股对比,选择走势更强、跑赢行业或大盘的股票进行投资
2.行业分析:通过对比同行业的多只股票,分析行业的整体走势和龙头股
3.量化策略:在量化策略中,通过多股对比选择符合策略条件的股票进行交易
4.风险控制:通过多股对比,分散投资不同行业或相关性较低的股票,降低投资风险
通过这个实战,你应该已经掌握了用Plotly实现多股对比的方法,包括价格对比、涨跌幅对比、技术指标对比等。接下来可以尝试用这些方法制作更专业的多股对比分析工具和投资决策系统。
下一节咱们就讲如何用Python做量化策略回测,帮你验证策略的有效性。
转载请注明出处:https://www.xin3721.com/ArticlePrograme/csharp49709.html










