(supermind量化-)振幅大于1、PE_0、macd零轴以上_

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

问财量化选股策略逻辑

振幅大于1,PE>0,macd零轴以上

选股逻辑分析

该选股逻辑通过考虑股票的振幅、估值和技术指标等因素,综合筛选出具备一定投资价值的个股。其中,振幅大于1可以更好地过滤出波动较大的标的;PE>0则强调了盈利的重要性;macd零轴以上则体现了短期技术面的上涨趋势。虽然综合考虑了不同因素,但也存在一些风险和局限性。

有何风险?

该选股逻辑可能对一些高成长性但目前处于亏损状态的公司过于苛刻,导致其被筛除。另外,单纯使用振幅作为选股因素有可能会过分强调短期波动性,带来不必要的风险。同时,该逻辑未考虑公司基本面的长期趋势和行业比较等因素,也可能影响选股的精度。

如何优化?

为了更好地使用该逻辑筛选出具备更大价值的标的,可以添加一些长期趋势的因素,比如考虑股票的市场地位、市占率、业绩增长等因素,来更好地判断其利润增长的潜力。在振幅的选择上,可以结合股票的成交量和成交金额来进行筛选,以更好地体现股票的流动性和市场认可度。另外,可以分别对不同行业进行比较,进行行业相对估值的比较,以更全面地判断股票的估值水平。

最终的选股逻辑

  1. 股票振幅大于1
  2. PE>0
  3. macd柱线>0
  4. ROE、净利率等基本面符合要求
  5. 行业相对估值合理

同花顺指标公式代码参考

振幅大于1:C/REF(C,1)-1>0.01

PE>0:PE>0

macd柱线>0:MACD()>REF(MACD(),1)

python代码参考

import baostock as bs

# 获取指定股票的数据
def get_stock_data(stock_code, start_date, end_date):
    bs.login()
    rs = bs.query_history_k_data_plus(stock_code,
                                      "date,code,open,high,low,close,volume",
                                      start_date=start_date,
                                      end_date=end_date,
                                      frequency="d")
    data_list = []
    while (rs.error_code == '0') & rs.next():
        data_list.append(rs.get_row_data())
    bs.logout()
    data_df = pd.DataFrame(data_list, columns=rs.fields)
    return data_df

# 振幅大于1%
def filter_amplitude(data_df):
    amplitude = (data_df["close"] / data_df["close"].shift(1)) - 1
    data_df = data_df[amplitude > 0.01]
    return data_df

# PE > 0
def filter_pe(data_df):
    # 使用baostock获取PE数据
    # 前提是有bs.db库的登录信息
    data_df = data_df.dropna()
    pe_list = []
    for date in data_df["date"].tolist():
        rs = bs.query_history_k_data_plus(data_df[data_df["date"] == date]["code"].tolist()[0],
                                          "peTTM",
                                          start_date=date,
                                          end_date=date,
                                          frequency="d")
        while (rs.error_code == '0') & rs.next():
            pe_list.append(float(rs.get_row_data()[-1]))
    
    pe_df = pd.DataFrame(pe_list, columns=["PE"])
    data_df = pd.concat([data_df.reset_index(drop=True), pe_df.reset_index(drop=True)], axis=1)
    data_df = data_df[data_df["PE"] > 0]
    return data_df

# MACD柱线 > 0
def filter_macd(data_df):
    # 计算MACD指标
    data_df["EMA12"] = data_df["close"].ewm(span=12).mean()
    data_df["EMA26"] = data_df["close"].ewm(span=26).mean()
    data_df["MACD"] = (data_df["EMA12"] - data_df["EMA26"]) * 2
    data_df["MACD_SIGNAL"] = data_df["MACD"].ewm(span=9).mean()
    data_df["MACD_HIST"] = data_df["MACD"] - data_df["MACD_SIGNAL"]
    
    data_df = data_df[data_df["MACD_HIST"] > 0]
    return data_df

# ROE、净利率等基本面符合要求
def filter_fundamental(data_df):
    # TO DO
    return data_df

# 行业相对估值合理
def filter_industry(data_df):
    # TO DO
    return data_df

# 筛选出符合条件的股票
def select_stocks(stock_list, start_date, end_date):
    selected_stocks = []
    for stock_code in stock_list:
        data_df = get_stock_data(stock_code, start_date, end_date)
        data_df = filter_amplitude(data_df)
        data_df = filter_pe(data_df)
        data_df = filter_macd(data_df)
        data_df = filter_fundamental(data_df)
        data_df = filter_industry(data_df)
        if not data_df.empty:
            selected_stocks.append(stock_code)
    return selected_stocks    
    ## 如何进行量化策略实盘?
    请把您优化好的选股语句放入文章最下面模板的选股语句中即可。

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

    模板如何使用?

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


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

评论