在股票市场中,捕捉主力资金的动向和量价异动是投资者梦寐以求的能力。然而,面对海量的股票数据,如何快速、准确地筛选出潜在的机会?本文将介绍一个基于Python和Dash的股票分析工具,它结合了量价异动分析、主力建仓判断以及实时数据可视化,帮助你轻松发现市场中的潜力股。
文章亮点:
-
量价异动分析:通过动态阈值判断股票价格和成交量的异常波动。
-
主力建仓判断:利用MFI、ADL等技术指标识别主力资金的动向。
-
数据缓存与并发处理:优化数据获取效率,避免Tushare API的限频问题。
-
Dash可视化:交互式图表展示股票价格、成交量、MACD、RSI等多维度数据。
-
实战代码:完整代码解析,手把手教你构建自己的股票分析工具。
1. 工具的核心功能
1.1 量价异动分析
量价异动是股票市场中常见的现象,通常伴随着价格的快速上涨或下跌以及成交量的显著放大。我们的工具通过以下步骤判断量价异动:
-
价格变化:计算最近N天的价格变化率。
-
成交量变化:计算最近N天的成交量变化率。
-
动态阈值:根据历史波动性调整阈值,避免误判。
def is_price_volume_abnormal(df, price_threshold=0.05, volume_threshold=0.5, window=5):
# 计算价格和成交量的变化率
df['price_change'] = (df['close'] - df['close'].shift(window)) / df['close'].shift(window)
df['vol_change'] = (df['vol'] - df['vol'].shift(window)) / df['vol'].shift(window)
# 动态调整阈值
price_std = df['price_change'].std()
vol_std = df['vol_change'].std()
dynamic_price_threshold = price_threshold * price_std if price_std else price_threshold
dynamic_volume_threshold = volume_threshold * vol_std if vol_std else volume_threshold
# 判断是否符合条件
latest_price_change = df['price_change'].iloc[-1]
latest_vol_change = df['vol_change'].iloc[-1]
if latest_price_change > dynamic_price_threshold and latest_vol_change > dynamic_volume_threshold:
return True, latest_price_change, latest_vol_change
else:
return False, latest_price_change, latest_vol_change
1.2 主力建仓判断
主力资金的动向往往预示着未来的价格走势。我们通过以下指标判断是否存在主力建仓或试盘拉升的迹象:
-
MFI(资金流量指数):反映资金流入流出的强度。
-
ADL(累积分布线):衡量资金流向的累积效应。
-
成交量变化:主力建仓通常伴随着成交量的显著放大。
def is_main_force_building(df, mfi_threshold=50, adl_slope_threshold=0.01, vol_change_threshold=0.5, window=5):
# 计算 MFI 和 ADL 的斜率
mfi_avg = df['MFI_14'].iloc[-window:].mean()
adl_recent = df['AD'].iloc[-window:]
slope = (adl_recent.iloc[-1] - adl_recent.iloc[0]) / window
# 计算成交量变化率
vol_shift = df['vol'].shift(window).iloc[-1]
vol_change = (df['vol'].iloc[-1] - vol_shift) / vol_shift if vol_shift else 0
# 判断综合条件
if mfi_avg > mfi_threshold and slope > adl_slope_threshold and vol_change > vol_change_threshold:
return True
else:
return False
2. 数据获取与缓存
为了优化数据获取效率,我们引入了本地缓存机制。如果缓存文件存在且未过期,则直接读取本地数据;否则,从Tushare API获取最新数据并保存到本地。
def get_cached_daily_data(ts_code, start_date, end_date, cache_dir='data', max_age_hours=24):
cache_file = os.path.join(cache_dir, f"daily_{ts_code}_{start_date}_{end_date}.csv")
if os.path.isfile(cache_file):
file_mtime = os.path.getmtime(cache_file)
file_age_hours = (time.time() - file_mtime) / 3600.0
if file_age_hours < max_age_hours:
return pd.read_csv(cache_file)
# 从 Tushare 获取数据
df = pro.daily(ts_code=ts_code, start_date=start_date, end_date=end_date)
if not df.empty:
df.to_csv(cache_file, index=False)
return df
3. Dash可视化
我们使用Dash构建了一个交互式可视化工具,用户可以通过表格选择股票,查看其价格走势、成交量、MACD、RSI等技术指标。
3.1 表格展示筛选结果
dash_table.DataTable(
id='stock-table',
columns=[{"name": i, "id": i} for i in result_df.columns],
data=result_df.to_dict('records'),
filter_action="native",
sort_action="native",
row_selectable="single"
)
3.2 图表展示股票数据
@app.callback(
Output('stock-graph', 'figure'),
[Input('stock-table', 'selected_rows')],
[State('stock-table', 'data')]
)
def display_graph(selected_rows, rows):
if selected_rows is None or len(selected_rows) == 0:
return go.Figure()
selected_index = selected_rows[0]
selected_stock = rows[selected_index]
ts_code = selected_stock['ts_code']
stock_name = selected_stock['name']
# 获取股票数据并绘制图表
stock_data = next((item['data'] for item in results if item['ts_code'] == ts_code), None)
if stock_data is None or stock_data.empty:
return go.Figure()
fig = go.Figure()
fig.add_trace(go.Scatter(x=stock_data['trade_date'], y=stock_data['close'], mode='lines', name='收盘价'))
fig.add_trace(go.Bar(x=stock_data['trade_date'], y=stock_data['vol'], name='成交量', yaxis='y2'))
# 更新布局
fig.update_layout(
title=f"{ts_code} {stock_name} 近期交易数据",
xaxis=dict(title='日期'),
yaxis=dict(title='价格', side='left'),
yaxis2=dict(title='成交量', overlaying='y', side='right', showgrid=False)
)
return fig
4. 总结
本文介绍了一个基于Python和Dash的股票分析工具,它能够通过量价异动分析和主力建仓判断,快速筛选出潜力股,并通过交互式图表展示多维度的股票数据。无论是量化投资者还是普通股民,都可以利用这个工具提升自己的投资决策效率。
未来,我们可以进一步优化模型,引入更多的技术指标和机器学习算法,以提高预测的准确性。如果你对代码或工具有任何疑问,欢迎在评论区留言讨论!