选股:低成交金额选股,站在游资的肩膀上
事情是发生在昨天晚上的一个饭局里面。
饭局上,朋友说到其实A股上的游资套路很多,真正玩起来也不是那么难。
他说他认识当地好几个游资,其中一个游资就是买进之后啥也不动,往后只加仓,不减仓,到目前为止总共才做了3只票。 我随手打开了东方财富翻了翻,其中一只已经是做到了第二大股东,而且从18年就开始买进,持有到现在,持有市值27亿。
另外一个游资的玩法就更简单暴力,只看成交金额。 他说这个游资挑了一只40来亿的股票,但每天的成交金额才1000来万。 他给出的理由也很简单,成交金额非常低,很容易控盘。
但是呢,由于这个游资和我朋友还持有这只票,所以他也不肯透露具体名字,估计是怕我中途打劫。
实际上,对于第二个游资 只看成交金额 的玩法是可以量化的。 之前也写过一篇类似 “反向选股:妖股是如何割韭菜的 “。
- 比对个股每日成交金额数值(半年的日数据)
- 用
自回归综合移动平均线 (ARIMA)
看看最新一期成交金额数值是否远超平均值 - 最后以50亿以下作为标准筛选股票
计算思路
- 通过
tushare(或akshare)
的 A股日线行情接口`获取A股股票成交额数据 - 计算ARIMA
- 获取个股市值,筛选股票
一些看法
最后筛选出来的股票在国庆后的走势并不是很理想。
主要的涨幅还是贴近大盘的走势。 换句话说,只是随波逐流。
看来,这游资除了 只看成交金额, 应该还是结合了其他指标再去挑股的,并没有说得那么轻易。
但是这也并不奇怪,毕竟这是他的赚钱工具,不可能随随便便全部透露。
后面附上了代码,喜欢的可以玩玩。
代码
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')