A股市场强弱量化的一个思路

原由

我们在炒股时,很希望有这个市场整体强弱的指标,来帮我们决策入场时机,择时是炒股最重要的要点之一。

如何判断市场强弱,一般看上证指数或沪深300,中证1000这些指数,但什么时候走强,什么时候走弱,指数均线?指数点位?这些都不够准确,甚至指数根本不能反应行情,比如2020-2021的板块轮动行情,指数不涨,部分板块行情波澜壮阔。所以我开始着手,用更多的数据来分析市场强弱。

先看成果

下图是2021年12月至今(2022年10月11日)数据图表,横轴是时间,竖轴取值0-1.0,蓝色的线是上涨的板块占总板块数比值,黄色的线是主升浪板块占全板块的比值,结合历史行情来看,这个图表已相对精准,我还整理了过去2年的数据,效果还不错。

 干货开始

1. 在通达信行情软件准备数据。使用通达信历史行情排序功能,根据指标来对板块排序。

1.1 先建立一个自定义板块,命名【赛道板块】(名称随意),把【细分行业】板块和【概念板块】下的所有板块加入到【赛道板块】,截止目前一共300多个细分行业和概念板块,具体如何操作请百度

1.2 通达信创建排序指标,指标命名【赛道排序】,指标原理来源于网络,个人觉得这个指标简单直观。具体如何创建指标步骤请百度,源码如下。

 1.3 有了【赛道板块】和排序指标【赛道排序】,结合通达信【.401】历史行情排序就可以对【赛道板块】排序了。通达信输入.401,打开历史行情.指标排序功能,选择【赛道板块】,再选择使用【赛道排序】指标进行排序,就可以得到今天的板块排序。

 2. 导出通达信中板块排序数据,得到板块排序数据的EXCEL,再通过python DataFrame分析导出的数据,并画图

2.1 在通达信排序界面输入指令34导出数据,得到数据EXCEL文件

2.2 编写python代码读取上面导出的EXCEL,分析每天板块数据情况并整理每天的板块数据。代码中先读取导出的EXCEL,按照交易日历(调用tushare API)处理每个交易日的数据,核心代码如下

def read_bk(fn, zhusheng_xl=21, limit=40):
    """
    读取板块导出的排序文件

    :param fn: 通达信导出的xls,必须包含交易日期,例如:超级赛道20220708.xls
    :param before_num: 数据包含前多少天
    :param zhusheng_xl: 主升浪斜率值设置
    :param limit: 取前多少行,0-取所有的行

    :return: 以板块名称为序的df
    """
    df = refine_csv(fn)

    # 把处理后的csv写入文件
    csv_path = os.path.splitext(fn)[0] + '.csv'
    df.to_csv(csv_path, encoding='gbk')

    # 保存处理的结果
    ret_df = pd.DataFrame()

    # 准备待处理的列集合
    date_sets = df.columns.to_list()
    date_sets = [e for e in date_sets if re.match(r'^(\d{8})$', e)]
    date_sets.sort()
    for idx in range(0, len(date_sets), 1):
        k = date_sets[idx]
        df[k] = df[k].astype(np.float64)
        _td = df.sort_values(by=k, ascending=False)
        limit = len(_td[k]) if limit == 0 else limit
        if (_td[k] > zhusheng_xl).sum() < limit:
            _name = _td.loc[:, '名称'].reset_index(drop=True)[0:limit]
        else:
            _name = _td.loc[_td[k] > zhusheng_xl, '名称'].reset_index(drop=True)[:]
        print(f'{k} ==> 板块前{limit}排名 \r\n {_name}')
        # 计算大于0的板块数量占比
        zb = (_td[k] > 0).sum() / len(_td[k])
        _name[-2] = round(zb, 4)
        # 斜率21度以上的占比
        zb21 = (_td[k] > zhusheng_xl).sum() / len(_td[k])
        _name[-1] = round(zb21, 4)
        _name = _name.sort_index()
        # 斜率值
        _xl = _td[k].reset_index(drop=True)[0:(len(_name) - 2)]
        # 较前一日变动值
        _delta_all = pd.Series([np.nan] * (len(_td[k])))
        _delta_head_5 = pd.Series([np.nan] * 5)
        if idx > 0:
            _td[date_sets[idx - 1]] = _td[date_sets[idx - 1]].astype(np.float64)
            _delta_all = (_td[k] - _td[date_sets[idx - 1]]).reset_index(drop=True)
            # 计算DELTA值前10名
            _td['DELTA'] = round(_td[k] - _td[date_sets[idx - 1]], 2)
            _tdd = _td.sort_values(by='DELTA', ascending=False)
            _tdd['DELTA'] = _tdd['DELTA'].astype('str')
            _tdd['名称,DELTA'] = _tdd['名称'].str.cat([_tdd['DELTA']], sep=',')
            _delta_head_5 = _tdd['名称,DELTA'].reset_index(drop=True)[0:5]
        _delta = _delta_all[0:(len(_name) - 2)]

        # 构造结果集
        ret_df = pd.concat(
            [ret_df, pd.DataFrame({k: _name}),
             pd.DataFrame({'分值': _xl}),
             pd.DataFrame({'DELTA': _delta}),
             pd.DataFrame({'DELTA前N': _delta_head_5})], axis=1)
    return ret_df

处理过程

 处理后还会将整理的数据写入EXCEL,方便随时查看

 2.3 每天在收盘后导出数据,执行一遍python代码更新数据,这样就可以得到每天的市场情况,根据数据去择时,比如2022年10月11日,晴雨值已经接近0,主升值长时间0,观察EXCEL的数据可以明显看出除了煤炭及其他几个板块,其他板块已经全部空头走势,这表明除了煤炭少数板块外,全市场处于卖空状态,这种情况无外乎两个结果,一:继续卖空,由于无人接盘,那会产生踩踏股灾,二:有人试探性入场卖货,底部由此产生,回看历史数据,只有2015年股灾和2016熔断股灾后续按第一种走势,一般情况下是第二种,底部形成,新一轮行情继续,股市如同太极,买卖双方如此反复,这就有了K线的起起落落。

欢迎交流探讨,新的思路,选股策略,交易策略,集思广益。

 

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值