算法-基于成交量的Adaboost股价涨跌预测模型

本文介绍了修正后的Adaboost算法,采用感知器作为弱分类器,以成交量预测股价涨跌。文章强调了在样本分布不均匀时正确计算错误率的重要性,并分享了训练过程及部分测试结果,展示了一个阶段性预测模型的建立和效果。
摘要由CSDN通过智能技术生成

     基于上篇文章提到的思路,个人觉得你不能用A来预测A,所以我打算换一种数据。 上篇文章 《算法-基于MACD的Adaboost股价涨跌预测模型》 虽然给出了adaboost算法,但是并没有完全正确的表达,尤其是在权重如何处理上,也就是如何对待那些被误分的样本。 所以打算更严谨的来对待这个算法,本着不要用错误的方法得出正确的结论的原则,我修正了我的adaboost算法,由于需要用大量的数据进行测试,我决定把java代码移植为C/C++版本以期获得更高的训练速度。好吧,下面我介绍一下修正后的算法。我再一次参考李航的《统计学习方法》 和《量价秘密》这两本书,我决定放弃我的阀值分类器转而使用最简单的感知器线性分类器,事实上股价的涨跌和成交量本身就不是一种线性关系,而是一种复杂的非线性关系,而且这种关系由于其他变量的作用变得模糊,我们只能大概判断,却无法精确定性,由此使用弱分类器是合适的。这个版本的预测只是一个阶段性的,后期我还会继续寻找非线性的简单分类器来训练我的数据。在使用adaboost的时候,不得不提到就是error率如何计算,特别是在样本分布不均匀的时候,我们必须分别计算正样本和负样本的分类准确率,这个前提条件下整体的分类准确率才有意义。举个例子,假如正样本个数51个,负样本数据49个,假如分类器毫无理由的完全输出1,即所有的样本都分类为正样本,那么可以获得49%的准确率,完全符合adaboost的算法框架,实际上,这种分类器是毫无意义的,训练出来也毫无决策能力,因为它受样本分布影响,也就是说涨的多你就赚,跌的多你就亏。 如果我们将正负样本分开,51个正样本的错误率是40%, 49个负样本的错误率是42%,那么整体的错误率就会下降:51*40%+49*42%=40.98, 也就是错误分的样本数为40.98个,那么错误率也就是40.98%,这样计算出来错误率才有意义,我不得不百般的强调这个结论,因为在训练的时候我确实因为没有分别对待正样本和负样本而导致了前面提到的垃圾分类器诞生。对于简单的线性感知器,我有一点看法,具体实现请参考李航的《统计学习方法》,训练非常的简单:

for(int epoch = 0; epoch < EPOCH; epoch++){
		//sequence gradient descent. not stochastic.

		for(int i = 0; i < rows; i++){
			double res = predict(trainX[i], colsX);
			if(trainY[i] * res <= 0){
				//update W and b.
				for(int j = 0; j < colsX; j++){
					mWeights[j] += lr * trainY[i] * trainX[i][j];//ok
				}
				mBias += lr * trainY[i];//ok
			}
		}
		
	}

double predict(double* trainX, int colsX){
	double res = 0;
	for(int i = 0; i < colsX; i++){
		res += mWeights[i] * trainX[i];
		
	}
	res += mBias;
	
	return res;
}

对于Adaboost算法错误率的修正


double WeakClassifier::calculateAdaBoostError(double** inputX, double* inputY, double* weights, int* rightOrWrong, const int rows, const int colsX){
    if(inputX == NULL || inputY == NULL || rightOrWrong == NULL || weights == NULL){
        printf("WeakClassifier::calculateAdaBoostError(double**, double*, double*, int*, int, int), param NULL\n");
        int paramNull 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值