新闻中心
你的位置: kai云体育app官网版下载官网 > 新闻中心 >
![开云kaiyun stock_list=[code]-kai云体育app官网版下载官网](/uploads/allimg/260928/280RA501045a.jpg)
全球好开云kaiyun,我是花姐。今天聊一个量化生手陆续忽略的问题:咱们每天究诘的这些本领目标,确切靠谱吗?
图片
掀开本日头条检验图片细目
有时候看着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(行情相比单边),那野心出来的置信度极有可能被放大。是以最恰当的神色是:
至少包含一个完满牛熊周期,周期越多越稳。
今天对于目标置信度的分析就到这里了,临了送全球一句话:
量化的价值不在“信号多”,而在“信号实在”。学会量化置信度,你的政策才真确站在数据上。
—— 花姐 开云kaiyun
本站仅提供存储做事,统共内容均由用户发布,如发现存害或侵权内容,请点击举报。
