首页 / 交易学院 / 模糊逻辑指标入门:用隶属函数判断趋势状态
模糊逻辑指标入门:用隶属函数判断趋势状态
📈

模糊逻辑指标入门:用隶属函数判断趋势状态

交易策略 难度 · 进阶 2013 12 分钟阅读
模糊逻辑隶属函数指标

模糊逻辑解决什么问题

传统指标用硬阈值判断“涨/跌”,非此即彼,容易被边界附近的噪声反复打脸。模糊逻辑引入“隶属函数”,把精确数值映射到 [0,1] 的“属于某集合的程度”——比如“70 度的咖啡多热”是 1,“20 度”是 0,中间温度得到 0~1 之间的渐变值。这样信号是平滑的、抗噪的,更适合表达“偏多/偏空”这种连续状态。

核心流程:模糊化→规则→去模糊化

隶属函数实现

最常用三角形/梯形隶属函数。文章用“EMA(2) 相对轨道线上/下边界的位置”定义隶属度:在上下边界之间为平缓(0),突破上边界趋近 1(强多),跌破下边界趋近 -1(强空):

double Fuzzy(double x, double a, double c)
  {
   double F;
   if(a<x)           F=1;                 // 100% 上升趋势
   else if(x<=a && x>=c) F=(1-2*(a-x)/(a-c)); // 平坦(线性过渡)
   else if(x<c)      F=-1;                // 100% 下降趋势
   return(F);
  }

完整指标实现

文章建两个轨道线(快/慢 Envelopes)和一个 EMA 信号线,各自算隶属度 Rule1/Rule2,结果取算术平均 Result=(R1+R2)/2。用 DRAW_COLOR_HISTOGRAM 画柱,按 |Result| 落在哪个 0.2 区间给 5 种颜色之一;Result==±1 时用 DRAW_COLOR_HISTOGRAM2 画买卖信号矩形。

CopyBuffer(Envelopes_Fast, UPPER_LINE, 0, rates_total, Env_Fast_Up);
CopyBuffer(Envelopes_Fast, LOWER_LINE, 0, rates_total, Env_Fast_Dn);
// ... 慢轨道线、信号线同理
double x = Mov_Sign[i];
Rule1Buffer[i] = Fuzzy(x, Env_Fast_Up[i], Env_Fast_Dn[i]);
Rule2Buffer[i] = Fuzzy(x, Env_Slow_Up[i], Env_Slow_Dn[i]);
ResultBuffer[i] = (Rule1Buffer[i]+Rule2Buffer[i])/2;
for(int ci=0; ci<=4; ci++)
  if(MathAbs(ResultBuffer[i])>0.2*ci && MathAbs(ResultBuffer[i])<=0.2*(ci+1))
    { ResultColors[i]=ci; break; }

优缺点

✦ 平滑但也有代价
优点:信号连续、抗噪,边界附近不会硬切换;规则表直观,像专家经验。缺点:隶属函数和规则是人为主观设计的,不同人设出来差异大;每柱算多个隶属函数+规则有计算开销;需要调的参数(轨道线周期/方差)不少,容易过拟合。

常见问题

普通均线是硬阈值(价格在均线上=多),边界附近会反复翻转。模糊逻辑用隶属度把“多/空”表达成 0~1 的连续程度,信号更平滑、抗噪,且能把多条规则(如趋势+动量)组合成一个输出,更像专家判断。
文章用快、慢两条轨道线各算一个隶属度,分别代表短期和长期的“偏多/偏空”程度。取平均是把短中期观点融合,避免单条轨道线在噪声下误判,相当于给信号做了一次平滑。
没有绝对客观的规则,但可以从交易常识出发:用已成为共识的指标关系(如 EMA 突破轨道线)作前提,输出映射成买卖强度。关键是回测验证规则表在历史数据上的表现,而不是凭感觉堆规则。参数(轨道线周期、方差)也要做敏感性测试。