股票暗盘资金-暗流蓄力指标选股方法

这篇文章主要向股民分享了通达信中可免费实现类似付费软件“暗盘资金”功能的“暗流蓄力指标”,具体内容如下:

### 核心逻辑与条件
- **量价暗语**:成交量达20日均量的1.5-3倍,股价却不涨,体现主力压价吸筹。
- **资金暗流**:OBV能量潮指标突破5日均线且持续创新高,表明大资金流入。
- **成本控制**:股价被压制在20日布林通道中轨附近,主力控盘明显。
- **其他条件**:股票连续20天被60日均线压制,制造弱势假象;当日换手率高于前一日,验证资金进场。

### 指标优势
- **零成本高价值**:通达信免费,与某付费软件逻辑、信号相同,可省上千费用。
- **无未来函数**:数据为实时价格和成交量,无滞后参数,盘中可验证信号,避免“信号闪烁”。
- **操作极简**:副图直接显示信号,盘中预警可自动跳出符合条件股票,比付费软件高效。

### 模型价值
- 提前提示主力吸筹结束、股价将涨的信号,避免踏空。
- 通过量能、OBV、通道指标验证主力动作,助散户不被洗盘震下车。
- 要求股价在中长期低位,避开高位主力出货陷阱,杜绝接盘风险。

### 操作提醒
- 信号出现后观察1-3天,放量突破60日线则确定性增加,跌破20日布林下轨需谨慎。
- 强调免费工具需结合严格纪律,同时提醒指标仅为技术分析工具,不保证盈利,股市有风险。

此代码已经在win11+python313 跑通了
# ### 暗资金选股法
# ### 说明:
# 1. **数据来源**:使用tushare获取股票数据,需先注册并获取token(免费版有调用限制)。
# 2. **指标实现**:
#    - 严格按照文中逻辑计算成交量、OBV、布林通道、60日均线压制、换手率等条件。
#    - 部分指标做了简化处理(如用成交量代替换手率,实际可使用`turnover`字段)。
import warnings

# Suppress specific FutureWarning from tushare
warnings.filterwarnings("ignore", message="Series.fillna with 'method' is deprecated", category=FutureWarning, module="tushare.pro.data_pro")

# 3. **使用方法**:替换`tushare_token`后运行,会输出符合条件的股票代码及日期。
# 4. **风险提示**:文中提到“指标仅为分析工具,不保证盈利”,实际使用需结合自身判断,股市有风险。

# 如果需要更精准的指标计算(如通达信原版公式),可根据通达信的指标源码进一步调整参数。
import akshare as ak
import pandas as pd
import numpy as np
import datetime

# 获取当前日期及历史日期
today = datetime.datetime.now().strftime('%Y%m%d')
start_date = (datetime.datetime.now() - datetime.timedelta(days=120)).strftime('%Y%m%d')

# 获取所有A股股票代码
stock_info_sh_name_code_df = ak.stock_info_sh_name_code(symbol="主板A股")
stock_info_sz_name_code_df = ak.stock_info_sz_name_code(symbol="A股列表")
sh_codes = stock_info_sh_name_code_df['证券代码'].apply(lambda x: f"{x}.SH").tolist()
sz_codes = stock_info_sz_name_code_df['A股代码'].apply(lambda x: f"{x}.SZ").tolist()
ts_codes = sh_codes + sz_codes
print(ts_codes)

# 存储符合条件的股票
selected_stocks = []

# 遍历股票池(可根据需要限制数量,避免请求过多)
for ts_code in ts_codes[:500]:  # 测试时取前500只,实际可去掉[:500]
    
    try:
        print(f"正在获取 {ts_code} 的数据...")
        # 获取日线数据
        df = ak.stock_zh_a_hist(symbol=ts_code[:-3], period="daily", start_date=start_date, end_date=today, adjust="qfq")
        if df is None:
            print(f"{ts_code} 数据获取失败,跳过")
            continue
        if len(df) < 60:
            print(f"{ts_code} 数据量不足,跳过")
            continue

        # 按日期升序排列
        df = df.sort_values('日期').reset_index(drop=True)
        df['日期'] = pd.to_datetime(df['日期'])
        
        # 计算指标
        # 1. 20日均量
        df['vol_20'] = df['成交量'].rolling(window=20).mean()
        print(f"{ts_code} 的 20 日均量:{df['vol_20'].tail()}")
        # 2. 当日成交量是否为20日均量的1.5 - 3倍
        df['vol_condition'] = (df['成交量'] >= 1.5 * df['vol_20']) & (df['成交量'] <= 3 * df['vol_20'])
        print(f"{ts_code} 的成交量条件:{df['vol_condition'].tail()}")
        
        # 3. OBV能量潮指标
        df['obv'] = np.where(df['收盘'] > df['收盘'].shift(1), df['成交量'], 
                           np.where(df['收盘'] < df['收盘'].shift(1), -df['成交量'], 0)).cumsum()
        df['obv_5'] = df['obv'].rolling(window=5).mean()
        # OBV突破5日均线且创新高
        df['obv_condition'] = (df['obv'] > df['obv_5']) & (df['obv'] == df['obv'].rolling(window=20).max())
        
        # 4. 20日布林通道(中轨为20日均线,上轨=中轨+1.5倍标准差,下轨=中轨-1.5倍标准差)
        df['ma20'] = df['收盘'].rolling(window=20).mean()
        df['std20'] = df['收盘'].rolling(window=20).std()
        df['boll_mid'] = df['ma20']
        # 股价在中轨附近(这里简化为中轨上下1.5倍标准差范围内,即布林带内)
        df['boll_condition'] = (df['收盘'] >= df['boll_mid'] - 1.5 * df['std20']) & (df['收盘'] <= df['boll_mid'] + 1.5 * df['std20'])
        
        # 5. 连续20天被60日均线压制
        df['ma60'] = df['收盘'].rolling(window=60).mean()
        # 最近20天收盘价均低于60日均线
        df['ma60_condition'] = df['收盘'].rolling(window=20).apply(lambda x: all(x < df['ma60'].iloc[-1]))
        
        # 6. 当日换手率高于前一日
        df['turnover_condition'] = df['换手率'] > df['换手率'].shift(1)
        
        # 筛选最后一天符合所有条件的股票
        last_day = df.iloc[-1]
        # 先只检查部分条件,例如只检查成交量条件
        if last_day['vol_condition']:
            selected_stocks.append({
                'ts_code': ts_code,
                'trade_date': last_day['日期'].strftime('%Y-%m-%d')
            })
            print(f"符合条件的股票:{ts_code}")
    
    except Exception as e:
        print(f"处理股票{ts_code}时出错:{e}")


print("\n选股结果:")
result_df = pd.DataFrame(selected_stocks)
print(result_df)

# 将选股结果保存为 CSV 文件
csv_file_path = 'selected_stocks.csv'
result_df.to_csv(csv_file_path, index=False)
print(f"选股结果已保存至 {csv_file_path}")

# 将选股结果保存为 Excel 文件
try:
    import openpyxl
    excel_file_path = 'selected_stocks.xlsx'
    result_df.to_excel(excel_file_path, index=False)
    print(f"选股结果已保存至 {excel_file_path}")
except ImportError:
    print("未安装 openpyxl 库,无法保存为 Excel 文件。请使用 'pip install openpyxl' 进行安装。")


选股结果:
ts_code trade_date
0 600025.SH 2025-07-22
1 600037.SH 2025-07-22
2 600039.SH 2025-07-22
3 600080.SH 2025-07-22
4 600169.SH 2025-07-22
5 600172.SH 2025-07-22
6 600221.SH 2025-07-22
7 600248.SH 2025-07-22
8 600283.SH 2025-07-22
9 600288.SH 2025-07-22
10 600309.SH 2025-07-22
11 600312.SH 2025-07-22
12 600346.SH 2025-07-22

13 600380.SH 2025-07-22
14 600392.SH 2025-07-22
15 600406.SH 2025-07-22
16 600436.SH 2025-07-22
17 600449.SH 2025-07-22
18 600515.SH 2025-07-22
19 600537.SH 2025-07-22
20 600539.SH 2025-07-22
21 600549.SH 2025-07-22
22 600580.SH 2025-07-22
23 600587.SH 2025-07-22
24 600593.SH 2025-07-21
25 600596.SH 2025-07-22
26 600611.SH 2025-07-22
27 600620.SH 2025-07-22
28 600637.SH 2025-07-22

以下代码收到访问次数限制

# ### 暗资金选股法
# ### 说明:
# 1. **数据来源**:使用tushare获取股票数据,需先注册并获取token(免费版有调用限制)。
# 2. **指标实现**:
#    - 严格按照文中逻辑计算成交量、OBV、布林通道、60日均线压制、换手率等条件。
#    - 部分指标做了简化处理(如用成交量代替换手率,实际可使用`turnover`字段)。
# 3. **使用方法**:替换`tushare_token`后运行,会输出符合条件的股票代码及日期。
# 4. **风险提示**:文中提到“指标仅为分析工具,不保证盈利”,实际使用需结合自身判断,股市有风险。

# 如果需要更精准的指标计算(如通达信原版公式),可根据通达信的指标源码进一步调整参数。
import tushare as ts
import pandas as pd
import numpy as np
import datetime

# 设置tushare token(需替换为自己的token)
ts.set_token('你的tushare_token')
pro = ts.pro_api()

# 获取当前日期及历史日期
today = datetime.datetime.now().strftime('%Y%m%d')
# 计算60天前的日期(用于获取足够数据)
start_date = (datetime.datetime.now() - datetime.timedelta(days=120)).strftime('%Y%m%d')

# 获取所有A股股票代码
stock_basic = pro.stock_basic(exchange='', list_status='L', fields='ts_code')
ts_codes = stock_basic['ts_code'].tolist()

# 存储符合条件的股票
selected_stocks = []

# 遍历股票池(可根据需要限制数量,避免请求过多)
for ts_code in ts_codes[:500]:  # 测试时取前500只,实际可去掉[:500]
    try:
        # 获取日线数据
        df = ts.pro_bar(ts_code=ts_code, adj='qfq', start_date=start_date, end_date=today)
        if df is None or len(df) < 60:
            continue  # 数据不足跳过
        
        # 按日期升序排列
        df = df.sort_values('trade_date').reset_index(drop=True)
        df['trade_date'] = pd.to_datetime(df['trade_date'])
        
        # 计算指标
        # 1. 20日均量
        df['vol_20'] = df['vol'].rolling(window=20).mean()
        # 2. 当日成交量是否为20日均量的1.5-3倍
        df['vol_condition'] = (df['vol'] >= 1.5 * df['vol_20']) & (df['vol'] <= 3 * df['vol_20'])
        
        # 3. OBV能量潮指标
        df['obv'] = np.where(df['close'] > df['close'].shift(1), df['vol'], 
                           np.where(df['close'] < df['close'].shift(1), -df['vol'], 0)).cumsum()
        df['obv_5'] = df['obv'].rolling(window=5).mean()
        # OBV突破5日均线且创新高
        df['obv_condition'] = (df['obv'] > df['obv_5']) & (df['obv'] == df['obv'].rolling(window=20).max())
        
        # 4. 20日布林通道(中轨为20日均线,上轨=中轨+1.5倍标准差,下轨=中轨-1.5倍标准差)
        df['ma20'] = df['close'].rolling(window=20).mean()
        df['std20'] = df['close'].rolling(window=20).std()
        df['boll_mid'] = df['ma20']
        # 股价在中轨附近(这里简化为中轨上下1.5倍标准差范围内,即布林带内)
        df['boll_condition'] = (df['close'] >= df['boll_mid'] - 1.5 * df['std20']) & (df['close'] <= df['boll_mid'] + 1.5 * df['std20'])
        
        # 5. 连续20天被60日均线压制
        df['ma60'] = df['close'].rolling(window=60).mean()
        # 最近20天收盘价均低于60日均线
        df['ma60_condition'] = df['close'].rolling(window=20).apply(lambda x: all(x < df['ma60'].iloc[-1]))
        
        # 6. 当日换手率高于前一日(使用vol代替换手率简化,实际可用turnover字段)
        df['turnover_condition'] = df['vol'] > df['vol'].shift(1)
        
        # 筛选最后一天符合所有条件的股票
        last_day = df.iloc[-1]
        if (last_day['vol_condition'] 
            and last_day['obv_condition'] 
            and last_day['boll_condition'] 
            and last_day['ma60_condition'] 
            and last_day['turnover_condition']):
            selected_stocks.append({
                'ts_code': ts_code,
                'trade_date': last_day['trade_date'].strftime('%Y-%m-%d')
            })
            print(f"符合条件的股票:{ts_code}")
    
    except Exception as e:
        print(f"处理股票{ts_code}时出错:{e}")

print("\n选股结果:")
print(pd.DataFrame(selected_stocks))