算法-基于MACD的Adaboost股价涨跌预测模型

本文介绍了如何使用Adaboost算法建立基于MACD的股价涨跌预测模型。通过寻找最佳的阀值和偏置,构建弱分类器并组合成强分类器。实验结果显示,在特定股票上,反做模型能实现稳定收益,而正做则可能导致较大亏损。
摘要由CSDN通过智能技术生成

   郑重声明:股市有风险,投资需谨慎,利用本模型实盘请自行承担风险



MACD是一个指标,具体用法是MACD>0看涨,反之看跌,果真是这样的吗?由于所有的技术指标都基于对历史数据的统计,指标的滞后性也就难免,有时候MACD明明大于0,股价仍然跌,有时候macd小于0,股价仍然涨。 本文基于Adaboost算法提出了一种基于macd的线性阀值分类器作为若分类器,通过在限定的解空间内寻找使得错误率最小的阀值和偏置,这样做避免了训练若分类器的复杂性,经验证,这种方法有效。

  

    关于什么是adaboost算法,这里还需要简单说一下。算法的核心思想是,用大量的若分类器进行决策,采用一定的方法对若分类器的结果进行加权,从而得出一个具有强分类能力的分类器。值得注意的是,在计算若分类器的错误率e的时候,应该针对每个类别分别计算错误率,多个类别的错误率,这里是两类,涨和跌,分别用1和-1表示。每个类别的错误率同时<0.5,这样的弱分类器才合格。好了闲话少说,一下程序完全是Java写的,并没有做什么优化,先跑出结果再说。


首先我们需要一个弱分类器,定义如下:

package implementation;

import java.util.List;

public /**
 * 你可以根据自己的需要,继承这个类,实现自己的弱分类器,只需要实现两个方法即可
 * @author zhangshiming
 */
abstract class WeakClassifier{
	public static final int RIGHT = 1;
	public static final int WRONG = 0;
	public double weight;//alpha
	public final double calculateErrorPositive(double[][] inputX, double[] inputY, int[] rightOrWrong){
		double errorTimes = 0;//预测错误的次数
		double pnum = 0;
		for(int i = 0; i < inputX.length; i++){
			if(inputY[i] == 1){
				pnum++;
				int res = predict(inputX[i], inputY[i]);
				if(res == WRONG){
					errorTimes++;
				}
				rightOrWrong[i] = res;
			}
		}

		return errorTimes / pnum;//错误率
	}

	public final double calculateErrorNegative(double[][] inputX, double[] inputY, int[] rightOrWrong){
		double errorTimes = 0;//预测错误的次数
		double nnum = 0;
		for(int i = 0; i < inputX.length; i++){
			if(inputY[i] == -1){
				nnum++;
				int res = predict(inputX[i], inputY[i]);
				if(res == WRONG){
					errorTimes++;
				}
				rightOrWrong[i] = res;
			}
			
		}

		return errorTimes / nnum;//错误率
	}
	
	public final double calculateError(double[][] inputX, double[] inputY, int[] rightOrWrong){
		double errorTimes = 0;//预测错误的次数
		for(int i = 0; i < inputX.length; i++){
			int res = predict(inputX[i], inputY[i]);
			if(res == WRONG){
				errorTimes++;
			}
			rightOrWrong[i] = res;
		}

		return errorTimes / inputY.length;//错误率
	}
	public final double calculateIR(double[][] inputX, double[] inputY, int[] rightOrWrong,List<double[]> irlist){
		double sumIr = 0;
		for(int i = 0; i < inputX.length; i++){
			if(inputY[i] > 0 && rightOrWrong[i] == WeakClassifier.RIGHT){
				sumIr += irlist.get(i)[0];
			}
			
			if(inputY[i] < 0 && rightOrWrong[i] == WeakClassifier.WRONG){
				sumIr += irlist.get(i)[0];
			}
		}

		return sumIr;
	}
	
	
	
	//预测正确返回RIGHT,错误返回WRONG
	public final int predict(double[] x, double y){
		double res = predict(x);
		
		//System.out.println(res);s

		if(res == y){
			return RIGHT;
		}else{
			return WRONG;
		}
	}

	public abstract double predict(double[] x);

	public abstract void train(double[][] inputX, double[] inputY, double[] weights);

}


这个弱分类器是个抽象类,由你负责实现训练和预测两个抽象方法。如果你了解训练,那么参数是很容易理解的。


接下来我们继承这个类来实现我们的阀值分类器:



                
基于MK-SVM (Modified Kernel Support Vector Machine) 的 AdaBoost 算法是一种集成学习方法,它结合了Adaboost的核心思想和SVM的优势。MK-SVM通过修改传统的核函数,通常是为了适应非线性和复杂的数据分布。以下是基于MK-SVM的AdaBoost预测模型的一个简化版伪代码: ```python // 初始化: K = [] // 存储不同弱分类器 w = [1/n] * n // 初始权重向量,n为样本数 T = M // 总迭代次数 for t in range(1, T+1): # 计算当前迭代的弱分类器训练集权重 w_tilde = w * exp(-y * alpha_t) // 选择最大权重的少数类别作为新样本集 D_t = select_samples(w_tilde) // 使用MK-SVM在D_t上拟合新的弱分类器h_t h_t = MKSVM.fit(D_t, y[D_t]) // 更新α值 alpha_t = 0.5 * log((1 - ε) / ε) ε = 1 - sum(w_tilde * predict(h_t, X)) // 计算错误率 // 将弱分类器添加到集合K中,并更新总权重 K.append(h_t) w *= (1 - α_t) / (1 - ε) // 预测阶段 def predict(X_test): prediction = [] for h in K: prediction += [h.predict(X_test)] return majority_vote(prediction) // 结果处理函数(假设投票规则为多数决定) function majority_vote(predictions): most_common = max(set(predictions), key=predictions.count) return np.array(most_common) ``` 在这个伪代码中,`select_samples()`是一个辅助函数,用于从原始数据集中按权重选择新的训练样本。`ε`是误分类率,`predict()`表示对单个弱分类器的预测。注意实际代码需要引入相应的库和详细实现细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值