需要帮助?

试试AI小助手吧

(supermind量化策略)task17/a/换手率3%-12%、饮料酒进出口、前25天

用户头像神盾局量子研究部
2023-08-30 发布

问财量化选股策略逻辑

选股逻辑为:选择换手率在3%-12%、饮料酒进出口、前25天有涨停。

选股逻辑分析

该选股策略主要依据了股票的交易量、行业分类和历史涨停情况,涨停情况可以反映股票的市场热度和资金关注度。同时,选择换手率在3%-12%和饮料酒进出口的股票,可以更准确地锁定目标行业的龙头股票。

有何风险?

该选股策略忽略了其他技术指标和基本面因素的影响。同时,过度依赖历史涨停情况容易导致选出一些股价波动较大的个股,有一定的风险。

如何优化?

应该结合其他技术指标,如MACD、RSI、均线等指标,以及基本面因素,如PE、PB、ROE等指标,制定更为综合准确的选股策略,从而提高选股的准确性和投资收益率。

最终的选股逻辑

选择换手率在3%-12%、饮料酒进出口、前25天有涨停的股票。

同花顺指标公式代码参考

换手率在3%-12%:SELECT(TURN<N>=AVG(TURN, N) AND TURN<N+1>AVG(TURN, N+1) AND TURN<N>3 AND TURN<N<12)
饮料酒进出口:SELECT(SECTOR('K40')=1)
前25天有涨停:SELECT(MAX(HIGH, 25)/REF(CLOSE, 1)-1=1)
选股:SELECT(CODE AND 换手率3%-12% AND 饮料酒进出口 AND 前25天有涨停)

python代码参考

import pandas as pd
import tushare as ts
from pyecharts import options as opts
from pyecharts.charts import Kline

def select_stocks():
    pro = ts.pro_api()
    df1 = pro.stock_basic(exchange='SZSE', list_status='L', fields='ts_code,industry,name')
    df1 = df1[(df1['industry'].str.contains('饮料') & df1['industry'].str.contains('酒'))]
    df2 = pro.daily(trade_date='20220114', fields='ts_code,open,close,low,high')
    df2 = df2[df2['ts_code'].isin(df1['ts_code'].tolist())]
    for code in df2['ts_code']:
        df2.loc[df2['ts_code'] == code, 'kdj'] = kdj(df2[df2['ts_code'] == code])
    df2 = df2[df2['kdj'] == 'J金叉']
    df2 = df2[(df2['high'] != df2['low']) & (df2['open'] != df2['close'])]
    df3 = pro.trade_cal(exchange='', start_date='20220101', end_date='20221014', fields='cal_date,is_open')
    df3 = df3[df3['is_open'] == 1]
    cal_date = df3.iloc[-2]['cal_date']  # 获取昨日交易日
    df4 = pro.top_list(trade_date=cal_date, fields='ts_code,buy_amount,sell_amount,net_amount,turnover_rate,buy_reason,sell_reason')  # 获取昨日龙虎榜
    df4 = df4[(df4['buy_reason'] > 0) & (df4['turnover_rate'] > 3) & (df4['net_amount'] > 0)]
    df4['zdf'] = (df4['buy_amount'] - df4['sell_amount']) / df4['buy_amount'] * 100
    df5 = pro.daily(trade_date=cal_date, fields='ts_code,turnover_rate')
    df5 = df5[(df5['turnover_rate'] >= 3) & (df5['turnover_rate'] <= 12)]
    df6 = get_increase_code(pro, cal_date, 25)
    df = pd.merge(df2, df1, on='ts_code')
    df = pd.merge(df, df4, on='ts_code')
    df = pd.merge(df, df5, on='ts_code')
    df = pd.merge(df, df6, on='ts_code')
    df = df[df['name'].str.contains('ST') == False]
    return df['ts_code']

# 获取近N天内涨停过的股票代码
def get_increase_code(pro, end_date, n):
    start_date = (pd.Timestamp(end_date) - pd.Timedelta(days=60)).strftime('%Y%m%d')
    df = pro.stk_limit(trade_date=end_date, fields='ts_code,up_limit')
    code_list = df[df['up_limit'] > 0]['ts_code'].tolist()
    result = pd.DataFrame(columns=['ts_code'])
    for code in code_list:
        data = pro.daily(ts_code=code, start_date=start_date, end_date=end_date, fields='close')
        data['pct_chg'] = data['close'].pct_change()
        if len(data) >= n and len(data.loc[data['pct_chg'] > 0]) >= 1:
            result = result.append({'ts_code': code}, ignore_index=True)
    return result

def kdj(df):
    a = df['low'].rolling(window=9).min()
    b = df['high'].rolling(window=9).max()
    rsv = (df['close'] - a) / (b - a) * 100
    df['k'] = rsv.ewm(com=2).mean()
    df['d'] = df['k'].ewm(com=2).mean()
    df['j'] = 3 * df['k'] - 2 * df['d']
    if df.iloc[-1]['j'] > df.iloc[-1]['k'] and df.iloc[-2]['j'] < df.iloc[-2]['k']:
        return 'J金叉'
    else:
        return ''

# 以K线图形式展示选股股票价格走势和KDJ指标变化
def plot_kdj(df, code):
    title = f'{code} K线图及KDJ指标变化'
    kline = Kline(title)
    kline.add_xaxis(df.index.format())
    kline.add_yaxis("", df[['open', 'close', 'low', 'high']].values.tolist(),
                    itemstyle_opts=opts.ItemStyleOpts(color="#ef232a",
                                                      color0="#14b143",
                                                      border_color="#ef232a",
                                                      border_color0="#14b143",
                                                      )),
    kline.set_global_opts(title_opts=opts.TitleOpts(title=title),
                          yaxis_opts=opts.AxisOpts(is_scale=True),
                          xaxis_opts=opts.AxisOpts(is_scale=True,
                                                  is_show=False,
                                                  is_clip=True,
                                                  ),
                          # 隐藏上方时间轴
                          brush_opts=opts.BrushOpts(x_axis_index=[0, 1],
                                                    brush_link="all",
                                                    out_of_brush={"colorAlpha": 0.1},
                                                    ),
                          legend_opts=opts.LegendOpts(is_show=False),
                          )
    # 绘制KDJ线
    line_k = [i for i in zip(df.index.format(), df['k'].tolist())]
    kline.add_yaxis('K', line_k,
                    markline_opts=opts.MarkLineOpts(
                        data=[opts.MarkLineItem(type_="average", name="MA_line")]
                    ))
    line_d = [i for i in zip(df.index.format(), df['d'].tolist())]
    kline.add_yaxis('D', line_d,
                    markline_opts=opts.MarkLineOpts(
                        data=[opts.MarkLineItem(type_="average", name="MA_line")]
                    ))
    line_j = [i for i in zip(df.index.format(), df['j'].tolist())]
    kline.add_yaxis('J', line_j,
                    markline_opts=opts.MarkLineOpts(
                        data=[opts.MarkLineItem(type_="average", name="MA_line")]
                    ))
    kline.render(f'{title}.html')
    ## 如何进行量化策略实盘?
    请把您优化好的选股语句放入文章最下面模板的选股语句中即可。

    select_sentence = '市值小于100亿' #选股语句。

    模板如何使用?

    点击图标右上方的复制按钮,复制到自己的账户即可使用模板进行回测。


    ## 如果有任何问题请添加 下方的二维码进群提问。
    ![94c5cde12014f99e262a302741275d05.png](http://u.thsi.cn/imgsrc/pefile/94c5cde12014f99e262a302741275d05.png)
收益&风险
源码

评论