如何判断市场强弱,一般看上证指数或沪深300,中证1000这些指数,但什么时候走强,什么时候走弱,指数均线?指数点位?这些都不够准确,甚至指数根本不能反应行情,比如2020-2021的板块轮动行情,指数不涨,部分板块行情波澜壮阔。所以我开始着手,用更多的数据来分析市场强弱。
先看成果
下是2021年12月至今数据表,横轴是时间,竖轴取值0-0,蓝色的线是上涨的板块占总板块数比值,黄色的线是主升浪板块占全板块的比值,结合历史行情来看,这个表已相对精准,我还整理了过去2年的数据,效果还不错。
干货开始
在通达信行情软件准备数据。使用通达信历史行情排序功能,根据指标来对板块排序。
1先建立一个自定义板块,命名【赛道板块】,把【细分行业】板块和【概念板块】下的所有板块加入到【赛道板块】,截止目前一共300多个细分行业和概念板块,具体如何操作请百度
3有了【赛道板块】和排序指标【赛道排序】,结合通达信【.401】历史行情排序就可以对【赛道板块】排序了。通达信输入.40打开历史行情.指标排序功能,选择【赛道板块】,再选择使用【赛道排序】指标进行排序,就可以得到今天的板块排序。
导出通达信中板块排序数据,得到板块排序数据的EXCEL,再通过pythonDataFrame分析导出的数据,并画
1在通达信排序界面输入指令34导出数据,得到数据EXCEL文件
2编写python代码读取上面导出的EXCEL,分析每天板块数据情况并整理每天的板块数据。代码中先读取导出的EXCEL,按照交易日历处理每个交易日的数据,核心代码如下
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}排名
{_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,方便随时查看
3每天在收盘后导出数据,执行一遍python代码更新数据,这样就可以得到每天的市场情况,根据数据去择时,比如2022年10月11日,晴雨值已经接近0,主升值长时间0,观察EXCEL的数据可以明显看出除了煤炭及其他几个板块,其他板块已经全部空头走势,这表明除了煤炭少数板块外,全市场处于卖空状态,这种情况无外乎两个结果,继续卖空,由于无人接盘,那会产生踩踏股灾,有人试探性入场卖货,底部由此产生,回看历史数据,只有2015年股灾和2016熔断股灾后续按第一种走势,一般情况下是第二种,底部形成,新一轮行情继续,股市如同太极,买卖双方如此反复,这就有了K线的起起落落。
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点