发布日期:2025-12-04 21:28 点击次数:79

大家好,我是花姐。今天聊一个量化新手常常忽略的问题:我们每天研究的这些技术指标a股加杠杆,真的靠谱吗?
图片
打开今日头条查看图片详情
有时候看着MACD金叉、KDJ拐头、RSI超卖反弹,都挺有道理,但真正下单后总感觉胜率不稳。那问题出在哪?——你从来没验证过它的置信度。
一、什么是置信度?为什么要判断?“置信度”听起来学术,其实很好理解:
它表示你对某个指标信号的“可信程度”。
举个例子:如果过去10次MACD金叉信号中,有6次之后股价上涨,那这个信号的置信度就是60%。
为什么要判断置信度?因为量化的核心不是预测未来,而是控制风险、提高胜率。没有验证过置信度的指标,本质上就是“拍脑袋交易”;而做了置信度验证,才算是“数据决策”。
二、怎么量化一个指标的置信度?以MACD为例,我们来验证它的买入信号到底有多靠谱。
基本逻辑:Step 1:定义信号触发点当:
DIF 从下向上穿越 DEA → 产生“金叉信号”DIF 从上向下穿越 DEA → 产生“死叉信号”我们把金叉视为买入,死叉视为卖出。
Step 2:计算每次信号后的收益假设我们在每次金叉买入,直到下次死叉当天卖出,计算区间收益。
Step 3:统计指标胜率与收益分布然后统计:
胜率 = 盈利次数 / 总次数平均收益、最大回撤、中位收益等指标这几个指标就能反映出MACD信号的置信度。
下面是花姐写的一个最简单可复现版本,行情来自miniQMT
import pandas as pdimport numpy as npimport talibfrom xtquant import xtdatadef get_hq(code, start_time, end_time): xtdata.enable_hello = False xtdata.download_history_data(stock_code=code, period='1d', start_time=start_time, end_time=end_time) history_data = xtdata.get_market_data_ex(['open','high','low','close','volume','amount','preClose'], stock_list=[code], period='1d', start_time=start_time, end_time=end_time, dividend_type='front_ratio', fill_data=False) df = history_data[code] df.index = pd.to_datetime(df.index.astype(str), format='%Y%m%d') df['date'] = df.index return df# 读取行情df = get_hq('xxxxxx.SZ','20200101','')# 计算MACDdf['macd_dif'], df['macd_dea'], df['macd'] = talib.MACD(df['close'], fastperiod=12, slowperiod=26, signalperiod=9)# 金叉、死叉信号df['golden'] = ((df['macd_dif'] > df['macd_dea']) & (df['macd_dif'].shift(1) <= df['macd_dea'].shift(1))).astype(int)df['dead'] = ((df['macd_dif'] < df['macd_dea']) & (df['macd_dif'].shift(1) >= df['macd_dea'].shift(1))).astype(int)# 模拟交易trades = []for i in df.index[df['golden'] == 1]: buy_price = df.loc[i, 'close'] next_dead = df.index[df.index.get_loc(i) + 1:] next_dead = next_dead[df.loc[next_dead, 'dead'] == 1] if len(next_dead) > 0: sell_date = next_dead[0] sell_price = df.loc[sell_date, 'close'] trades.append((sell_price - buy_price) / buy_price)results = pd.Series(trades)print('信号次数:', len(results))print('胜率:', (results > 0).mean())print('平均收益:', results.mean())print('中位收益:', results.median())print('最大回撤:', results.min())以下是某个股票从2020年至今的一个置信度统计结果:
信号次数: 54胜率: 0.3333333333333333平均收益: 0.004879251982125992中位收益: -0.02139616125923546最大回撤: -0.09598741148701802
看完以后你有什么想法呢?是不是比想象中的要低很多。
三、用“N日涨幅”来评估置信度更灵活当然我们也可以换个角度来计算一个指标的置信度,比如可以通过计算信号后的N日涨幅来评估。
比如:
3~5日:短线交易信号的预测力10~30日:趋势信号的可靠度60日以上:中长线趋势信号的持久性基于上面的代码我们简单修改下就可以计算N日涨幅的置信度了。
import pandas as pdimport numpy as npimport talibfrom xtquant import xtdatadef get_hq(code, start_time, end_time): xtdata.enable_hello = False xtdata.download_history_data(stock_code=code, period='1d', start_time=start_time, end_time=end_time) history_data = xtdata.get_market_data_ex(['open','high','low','close','volume','amount','preClose'], stock_list=[code], period='1d', start_time=start_time, end_time=end_time, dividend_type='front_ratio', fill_data=False) df = history_data[code] df.index = pd.to_datetime(df.index.astype(str), format='%Y%m%d') df['date'] = df.index return dfdef calc_macd(df): ''' 计算MACD指标与金叉信号 ''' df['macd_dif'], df['macd_dea'], df['macd'] = talib.MACD( df['close'], fastperiod=12, slowperiod=26, signalperiod=9 ) df['golden'] = ( (df['macd_dif'] > df['macd_dea']) & (df['macd_dif'].shift(1) <= df['macd_dea'].shift(1)) ).astype(int) return dfdef analyze_macd_returns(df, n_days=5): ''' 统计金叉后N日涨幅表现 ''' results = [] for i in df.index[df['golden'] == 1]: buy_price = df.loc[i, 'close'] # 确保不会超出索引 idx = df.index.get_loc(i) if idx + n_days < len(df): sell_price = df.iloc[idx + n_days]['close'] ret = (sell_price - buy_price) / buy_price results.append({ 'buy_date': df.loc[i, 'date'], 'sell_date': df.iloc[idx + n_days]['date'], 'buy_price': buy_price, 'sell_price': sell_price, f'{n_days}d_return': ret }) results = pd.DataFrame(results) if len(results) == 0: return None # 汇总统计 stats = { 'signal_count': len(results), 'win_rate': (results[f'{n_days}d_return'] > 0).mean(), 'avg_return': results[f'{n_days}d_return'].mean(), 'median_return': results[f'{n_days}d_return'].median(), 'max_return': results[f'{n_days}d_return'].max(), 'min_return': results[f'{n_days}d_return'].min(), } return results, statsdef run_macd_backtest(code, n_days=5, start='20200101', end=''): ''' 主函数:执行金叉后N日涨幅分析 ''' df = get_hq(code, start, end) df = calc_macd(df) results, stats = analyze_macd_returns(df, n_days) print(f'\n【{code}】MACD金叉后{n_days}日表现统计') print(pd.Series(stats)) return results, stats# ============ 示例调用 ============ #if __name__ == '__main__': code = 'xxxxxx.SZ' results, stats = run_macd_backtest(code, n_days=5)MACD金叉后5日表现统计
signal_count 55.000000win_rate 0.545455avg_return 0.003531median_return 0.003421max_return 0.171240min_return -0.197990
MACD金叉后10日表现统计
signal_count 55.000000win_rate 0.545455avg_return 0.003575median_return 0.006202max_return 0.195783min_return -0.156570MACD金叉后20日表现统计
signal_count 54.000000win_rate 0.462963avg_return -0.009931median_return -0.004154max_return 0.165404min_return -0.186467
从上面这3组数据不难看出,
5日涨幅的置信度最高,也最稳定。10日和20日涨幅的置信度都在40%以上,但10日的胜率要高一些。20日涨幅的置信度最低,也最不稳定。所以如果你想通过MACD金叉来操作这个股票,最后在出现金叉后5天内卖出,收益是最大的。
四、置信度统计用多久的K线更合理?看了上面的分析,你是不是会提出这样的一个问题:我用多久的数据来统计置信度更可靠呢?
置信度不是一个数学常数,而是从历史信号统计出来的“经验概率”。所以,样本越多,统计越稳。如果你只拿1年数据来算,那可能正好赶上牛市,MACD全胜;但放到5年一看,熊市一来胜率全崩,这就叫“样本偏差”。
不同策略的建议周期①日线级别(中低频策略)市场
推荐周期
原因
A股
5~10年日线数据
能覆盖至少一个完整牛熊周期(上涨、调整、下跌再上涨)
美股
10年以上日线数据
美股趋势更平缓,需要更长样本来检验周期性
指数/ETF策略
≥8年
相对稳定、波动小,需要更长历史来显著化差异
经验值: 至少包含 200~300次信号样本 才有统计意义。如果MACD金叉一年只有30次,那就得拉长到5~10年。
②高频策略(分钟线或小时线)周期
建议样本
说明
分钟线策略
至少 1~2年
高频信号多,但噪音大,需要大量样本平滑掉极端波动
小时线策略
至少 3年
信号数相对少,需要时间覆盖不同市场结构
要覆盖“不同市场状态”单纯说“多少年”还不够,更关键的是你得覆盖至少一个牛熊周期。
以A股为例
图片
打开今日头条查看图片详情
如果你的样本区间刚好只在2021–2024(行情比较单边),那计算出来的置信度极有可能被放大。所以最稳妥的方式是:
至少包含一个完整牛熊周期,周期越多越稳。
今天关于指标置信度的分析就到这里了,最后送大家一句话:
量化的价值不在“信号多”,而在“信号可信”。学会量化置信度,你的策略才真正站在数据上。
—— 花姐 a股加杠杆
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。上一篇:怎么加杠杆炒股票 国新办举行《新时代党的治疆方略的成功实践》白皮书发布会 新京报
下一篇:没有了


