选股:低成交金额选股,站在游资的肩膀上

事情是发生在昨天晚上的一个饭局里面。

饭局上,朋友说到其实A股上的游资套路很多,真正玩起来也不是那么难。

他说他认识当地好几个游资,其中一个游资就是买进之后啥也不动,往后只加仓,不减仓,到目前为止总共才做了3只票。 我随手打开了东方财富翻了翻,其中一只已经是做到了第二大股东,而且从18年就开始买进,持有到现在,持有市值27亿。

另外一个游资的玩法就更简单暴力,只看成交金额。 他说这个游资挑了一只40来亿的股票,但每天的成交金额才1000来万。 他给出的理由也很简单,成交金额非常低,很容易控盘。

但是呢,由于这个游资和我朋友还持有这只票,所以他也不肯透露具体名字,估计是怕我中途打劫。

实际上,对于第二个游资 只看成交金额 的玩法是可以量化的。 之前也写过一篇类似 “反向选股:妖股是如何割韭菜的 “。

  • 比对个股每日成交金额数值(半年的日数据)
  • 自回归综合移动平均线 (ARIMA)看看最新一期成交金额数值是否远超平均值
  • 最后以50亿以下作为标准筛选股票

计算思路

  1. 通过tushare(或akshare)A股日线行情接口`获取A股股票成交额数据
  2. 计算ARIMA
  3. 获取个股市值,筛选股票

一些看法

最后筛选出来的股票在国庆后的走势并不是很理想。

主要的涨幅还是贴近大盘的走势。 换句话说,只是随波逐流

看来,这游资除了 只看成交金额, 应该还是结合了其他指标再去挑股的,并没有说得那么轻易。

但是这也并不奇怪,毕竟这是他的赚钱工具,不可能随随便便全部透露。

后面附上了代码,喜欢的可以玩玩。


image


代码

import tushare as ts
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA

pro = ts.pro_api("TUSHARE_TOKEN_API")
ts.set_token("TUSHARE_TOKEN_API")

# 获取24年3月23日至今的交易日
trade_cal = pro.trade_cal(exchange='', start_date='20240323', end_date='20241205')
is_open = trade_cal[trade_cal['is_open']==1]

data = pd.DataFrame()
for trade_date in is_open['cal_date']:
    df = pro.daily(trade_date = trade_date)
    data = data.append(df)

# 股票列表
stocks = data['ts_code'].unique().tolist()

# 筛选交易日数据,数据截至至2024年09月23日; 将交易金额转为亿为单位
data = data[data['trade_date']<=20240923]
data['amount'] = data['amount'] / 100000

# ARIMA的计算函数
def ARIMA_func(latest_value, previous_values):
    if previous_values:  # Check if the list is not empty
        try:
            # ts = pd.Series(previous_values, index=pd.date_range(start='2024-01-01', periods=len(previous_values), freq='D'))
            ts = previous_values

            # Fit an ARIMA model
            model = ARIMA(ts, order=(1, 1, 1))
            model_fit = model.fit()
    
            # Predict the next value
            predicted_value = model_fit.forecast()[0]
    
            # Determine if the latest value is significantly lower
            is_lowest = latest_value < predicted_value
            return predicted_value,latest_value,is_lowest
        except Exception as e:
            return 0,0,0
    else:
        return 0,0,0

# 输出最终数据
result_list = []
for stock in stocks:
    print(stock)
    result_dict = {}
    stock_data = data[data['ts_code']==stock]
    stock_data = stock_data.sort_values(by='trade_date', ascending=True)
    stock_data.set_index('trade_date', inplace=True)
    previous_values = stock_data['amount'][:-1].tolist()
    latest_value = stock_data['amount'].iloc[-1]
    result = ARIMA_func(latest_value,previous_values)

    result_dict['ts_code'] = stock
    result_dict['predicted_value'] = result[0]
    result_dict['latest_value'] = result[1]
    result_dict['is_lowest'] = result[2]
    result_list.append(result_dict)
    
df = pd.DataFrame(result_list)

# 获取20240923当日市值数据,合并
ms_data = pro.daily_basic(trade_date='20240923', fields='ts_code,pb,pe,pe_ttm,total_mv')
ms_data['total_mv'] = ms_data['total_mv'] / 10000
df = df.merge(ms_data, on=['ts_code'])

# 按市值、成交金额筛选股票
filtered_df = df[(df['total_mv'] <= 50.0) & (df['is_lowest'] == True) & (df['latest_value'] <= 0.2)]
filtered_df.to_excel('027_is_lowest.xlsx')