
寰宇好万博manbext网站登录app娱乐,我是花姐。今天聊一个量化生手时时忽略的问题:咱们每天商议的这些时代主义,真的靠谱吗?
图片
大开本日头条搜检图片确定
偶而候看着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(行情相比单边),那蓄意出来的置信度极有可能被放大。是以最安妥的方式是:
至少包含一个竣工牛熊周期,周期越多越稳。
今天对于主义置信度的分析就到这里了,终末送寰宇一句话:
量化的价值不在“信号多”,而在“信号的确”。学会量化置信度,你的计策才果真站在数据上。
—— 花姐 万博manbext网站登录app娱乐
本站仅提供存储劳动,悉数内容均由用户发布,如发现存害或侵权内容,请点击举报。