(supermind量化-)振幅大于1、下午大单净流入、非ST(10点之前选股票)五部涨停

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

问财量化选股策略逻辑

本选股策略选取振幅大于1、下午大单净流入和非ST及10点之前选股的股票,同时采用五部涨停战法作为选股指标,选取结果中的个股作为投资标的。

选股逻辑分析

本选股策略着重追踪股票的交易量,振幅和停牌等指标。选股时,振幅大于1的条件是挑选波动性较高的股票,下午大单净流入表明股票有资金流入的原因。同时,选取非ST或10点之前选股的股票,剔除风险较高的ST股票和可能已经有人抬头的股票,减小风险。五部涨停策略是指根据股票涨幅,每涨1%就加仓一次,最多五次,直到涨停。这个策略适用于较高的偏向大涨的市场。

有何风险?

本策略忽略了公司的基本面,未考虑股票的内在价值等方面,风险偏高。同时,五部涨停战法适用于剧烈的市场波动,不适用于稳健但变化较小的市场。

如何优化?

可以加入其他指标,例如市盈率或市净率等,以更全面的方式进行筛选。或者通过深入分析股票的基本面、行业背景和公司经营优劣来对选股策略进行更多改进。

最终的选股逻辑

本选股策略选取振幅大于1、下午大单净流入和非ST及10点之前选股的股票,同时采用五部涨停战法作为选股指标,选取结果中的个股作为投资标的。

同花顺指标公式代码参考

振幅大于1: ABS((HIGH-LOW)/PRE_CLOSE) > 0.01

下午大单净流入: C - O > (0.005 * V - MA(V, 3)) / 10000

非ST及10点之前选股: SELECTEDDAY(NDAY)>0 AND NOT ISST()

五部涨停战法: REF(BARS_HL, 1) < ATTR(BARS_HL, 1).LIMITDOWN AND CROSS(BARS_CLOSE, MA(21*(1+0.01^{0.5}), 1)) = 1

python代码参考

# 引入Tushare库、Numpy库、Pandas库
import tushare as ts
import numpy as np
import pandas as pd

# 连接Tushare库
pro = ts.pro_api()

def select_stocks(n):
    selected_stocks = []
    selected_scores = []
    
    # 全部股票
    all_stocks = pro.stock_basic(exchange='', list_status='L', fields='ts_code')
    
    for ts_code in all_stocks["ts_code"]:
        # 获取股票数据
        k_data = pro.klines(ts_code=ts_code, start_date='1 year ago', end_date='today', freq='D')
        quote_data = pro.query('daily', ts_code=ts_code, start_date='1 year ago', end_date='today')
        pub_data = pro.query('top10_holders', ts_code=ts_code, start_date='', end_date='')
        score = (ABS((k_data["high"] - k_data["low"]) / k_data["pre_close"]) > 0.01).all() and (quote_data["close"] - quote_data["open"] > (0.005 * quote_data["vol"] - MA(quote_data["vol"],3))/10000).all() and SELECTEDDAY(NDAY)>0 AND NOT ISST()
        if score:
            bars = HLCVBars(k_data)
            five_bar_score = FiveBarsRiseAndLimitDown(bars)
            if five_bar_score >= 5:
                selected_stocks.append(ts_code)
                selected_scores.append(five_bar_score)
        if len(selected_stocks) == n:
            break
    
    # 返回涨幅最高的n只股票
    sorted_stocks = [x for _, x in sorted(zip(selected_scores,selected_stocks),reverse=True)]
    return sorted_stocks

# 帮助函数: 把日K数据转为HLCV格式
def HLCVBars(k_data):
    return pd.DataFrame(data={
        "high": k_data["high"].values,
        "low": k_data["low"].values,
        "close": k_data["close"].values,
        "volume": k_data["amount"].values / 10000
    }, index=k_data["trade_date"].apply(pd.to_datetime))

# 帮助函数: 判断是否五部涨停
def FiveBarsRiseAndLimitDown(bars):
    try:
        raise_amounts = []
        for i in range(5):
            raise_amounts.append((bars["close"][i + 1] - bars["open"][i]) / bars["open"][i])
        if all(np.array(raise_amounts) > 0):
            if (HIGHEST(bars["high"], 5) == bars["current_high"]).all():
                return 5
            elif (HIGHEST(bars["high"], 4) == bars["current_high"][1:]).all():
                return 4
            elif (HIGHEST(bars["high"], 3) == bars["current_high"][2:]).all():
                return 3
            elif (HIGHEST(bars["high"], 2) == bars["current_high"][3:]).all():
                return 2
            elif (HIGHEST(bars["high"], 1) == bars["current_high"][4:]).all():
                return 1
    except:
        pass
    return 0
    ## 如何进行量化策略实盘?
    请把您优化好的选股语句放入文章最下面模板的选股语句中即可。

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

    模板如何使用?

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


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

评论