用AI筛选潜力股:基于量价异动与主力建仓的股票分析工具

在股票市场中,捕捉主力资金的动向和量价异动是投资者梦寐以求的能力。然而,面对海量的股票数据,如何快速、准确地筛选出潜在的机会?本文将介绍一个基于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的股票分析工具,它能够通过量价异动分析和主力建仓判断,快速筛选出潜力股,并通过交互式图表展示多维度的股票数据。无论是量化投资者还是普通股民,都可以利用这个工具提升自己的投资决策效率。

未来,我们可以进一步优化模型,引入更多的技术指标和机器学习算法,以提高预测的准确性。如果你对代码或工具有任何疑问,欢迎在评论区留言讨论!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值