(supermind量化投资)task13/a/元宇宙、机构动向大于0、圆弧形

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

问财量化选股策略逻辑

选股逻辑包括三个条件:选择元宇宙行业的股票、机构动向大于0、形态识别为圆弧形。根据这些条件进行选股,进行投资。

选股逻辑分析

该选股策略主要围绕以下三个条件进行选股:

  1. 选取元宇宙行业中的股票,因为元宇宙领域具有较高的成长性和隐含收益;
  2. 机构动向具有预测性和引导作用,选择机构买入股票可以获得较好的资本回报;
  3. 选取圆弧形态的股票进行投资,因为圆弧形态是股价未来可能反转的信号。

综合以上条件,选择符合条件的个股进行投资。

有何风险?

  1. 行业投资的风险因素较大,选股策略难以捕捉行业整体动向;
  2. 只考虑机构动向和形态识别可能会忽略一些重要指标;
  3. 圆弧形态的判断存在主观性,可能会出现判断错误;
  4. 如果市场整体大跌,该策略可能无法有效保护投资本金。

如何优化?

  1. 加入行业板块轮动因素,进行相对强势的行业和个股选择;
  2. 综合考虑不同时间段的股票表现情况,并结合基本面指标等多个维度进行分析;
  3. 加入风险控制指标,有效保护投资本金;
  4. 优化形态识别算法,提高圆弧形态的准确性。

最终的选股逻辑

该选股策略选择元宇宙行业中,机构动向大于0,形态识别为圆弧形的股票进行投资。

同花顺指标公式代码参考

元宇宙行业:GNBK("gnxq");

机构动向:DRS_M("zlltgtzb");

圆弧形态识别:CIRCULARARC("k", 5, 10, 10, 1, 0.05, 0.2);

选股公式:GNBK("gnxq") AND DRS_M("zlltgtzb") AND CIRCULARARC("k", 5, 10, 10, 1, 0.05, 0.2) > 0;

Python代码参考

import pandas as pd 
import tushare as ts 

def stock_selector(): 
    ts.set_token('your_token') 
    pro = ts.pro_api() 

    data1 = pro.query('stock_basic', exchange='', list_status='L', fields='ts_code,name,industry') 
    data1 = data1[(data1['name'].str.contains('元宇宙')) & (data1['industry'] != '银行')] 

    data2 = pro.query('fii_lgt_list', start_date='20220308', end_date='20220308', 
    fields='ts_code, buy_value, sell_value, net_value') 
    data2 = data2.groupby(by='ts_code').sum() 
    data2['net'] = data2['net_value'] / 1e8 
    data2 = data2.sort_values(by='net', ascending=False) 
    data2 = data2.iloc[0:100, :] 
    data2['rank'] = range(1, 101) 
    data2 = data2.loc[:, ['rank']] 

    data3 = pro.query('daily_basic', trade_date='20220307', 
    fields='ts_code, pct_chg', 
    filters='pct_chg>0') 

    data4 = pro.query('kline', ts_code='000001.SH', start_date='20220307', end_date='20220307', 
    fields='trade_date, k') 
    data4 = data4.iloc[0, :] 
    data4 = pd.DataFrame({'ts_code': ['000001.SH'], 'k': [data4['k']]}) 

    data5 = pd.DataFrame() 
    for i in range(50): 
        data_k = pro.query('kline', ts_code=data1.iloc[i, 0], start_date='20220101', end_date='20220307', 
        fields='trade_date, close', ktype='W') 
        data_k['ts_code'] = data1.iloc[i, 0] 
        data_k.reset_index(drop=True, inplace=True) 
        data5 = pd.concat([data5, data_k]) 
    data5 = data5.pivot(index='trade_date', columns='ts_code', values='close') 
    data5['sh000001'] = data4.loc[0, 'k'] 
    data5.fillna(method='ffill', inplace=True) 
    data5.reset_index(inplace=True) 
    data5 = data5.loc[:, ['trade_date', 'sh000001']] 

    data6 = pd.DataFrame() 
    for i in range(50): 
        data_k = pro.query('kline', ts_code=data1.iloc[i, 0], start_date='20220101', end_date='20220307', 
        fields='trade_date, close', ktype='W') 
        data_k['ts_code'] = data1.iloc[i, 0] 
        data_k.reset_index(drop=True, inplace=True) 
        data_k = pd.merge(data_k, data5, on='trade_date') 
        data_k['return'] = data_k.iloc[:, -1] / data_k.iloc[:, -2] - 1 
        data_k['return'] = data_k['return'] * 100 
        data_k.reset_index(drop=True, inplace=True) 
        data6 = pd.concat([data6, data_k]) 
    data6 = data6.loc[:, ['ts_code', 'return']] 
    data6 = data6.groupby(by='ts_code').sum() 
    data6 = data6.sort_values(by='return', ascending=False) 
    data6 = data6.iloc[0:100, :] 
    data6['rank'] = range(1, 101) 
    data6 = data6.loc[:, ['rank']] 

    data7 = pd.concat([data1.loc[:, 'ts_code'], data2, data3.loc[:, 'pct_chg'], \
    data6.loc[:, 'rank']], axis=1) 
    data7.columns = ['ts_code', 'ddjlr_rank', 'pct_chg', 'return_rank'] 
    data7.reset_index(drop=True, inplace=True) 
    data7['circle_arc'] = data7['ts_code'].apply(lambda x: CIRCULARARC(x, 5, 10, 10, 1, 0.05, 0.2)) 
    data7 = data7[data7['circle_arc'] > 0] 
    data7.sort_values(by='circle_arc', ascending=False, inplace=True) 
    data7 = data7.iloc[0:50, :] 

    return data7

def CIRCULARARC(stock_code, K, N, M1, M2, f, s):
    """
    K: 判断的周期;
    N: 计算均线的周期;
    M1, M2: 判定区间范围,(1-f)*MA, (1+f)*MA;
    f: 判定区间范围比例因子;
    s: 判断幅度范围,s*ATR。
    """
    ts.set_token('your_token') 
    pro = ts.pro_api() 

    df_k = pro.query('kline', ts_code=stock_code, start_date='20180101', end_date='20220307', ktype='W', fields='open, high, low, close')
    df_k['K'] = (df_k['high'].rolling(K).max() + df_k['low'].rolling(K).min()) / 2
    df_k['MA'] = df_k['K'].rolling(N).mean()
    df_k['STD'] = df_k['K'].rolling(N).std()
    df_k['UP'] = df_k['MA'] + M2 * df_k['STD']
    df_k['DOWN'] = df_k['MA'] - M1 * df_k['STD']
    df_k['ATR'] = (df_k['high'] - df_k['low']).rolling(N).mean().shift(1)
    df_k = df_k.dropna()

    if df_k.iloc[-1]['close'] >= df_k.iloc[-1]['UP']:
        if (df_k.iloc[-1]['close'] - df_k.iloc[-1]['UP']) / df_k.iloc[-1]['ATR'] >= s:
            return 1
        else:
            return 0
    elif df_k.iloc[-1]['close'] <= df_k.iloc[-1]['DOWN']:
        if (df_k.iloc[-1]['DOWN'] - df_k.iloc[-1]['close']) / df_k.iloc[-1]['ATR'] >= s:
            return 1
        else:
            return 0
    else:
        return 0
    ## 如何进行量化策略实盘?
    请把您优化好的选股语句放入文章最下面模板的选股语句中即可。

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

    模板如何使用?

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


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

评论