
我们通过分析历史数据中价格波动幅度(价格变化率绝对值)与交易量的关系,建立线性回归模型,预测未来交易量。算法分为四个步骤:
- 计算每日价格波动量(涨跌幅绝对值)
- 分离上涨/下跌日数据
- 为每种趋势训练线性回归模型
- 使用近期平均波动量预测未来交易量
关键公式与参数
1、价格波动量 (ΔP)
ΔP = |(今日收盘价 – 昨日收盘价) / 昨日收盘价|
2、线性回归模型
- 模型公式:交易量 V = a × ΔP + b
- 斜率 a 计算公式:
a = [nΣ(ΔP_i × V_i) – Σ(ΔP_i)Σ(V_i)] / [nΣ(ΔP_i²) – (ΣΔP_i)²]
3、截距 b 计算公式:
b = [Σ(V_i) – a × Σ(ΔP_i)] / n
参数说明:
- n:数据点数量
- ΔP_i:第i天的价格波动量
- V_i:第i天的实际交易量
4、未来波动量估计
预测波动量 = 最近N天波动量的平均值
算法流程
- 数据准备:输入历史收盘价和交易量
- 计算波动量:逐日计算价格波动幅度
- 数据分类:分离上涨日和下跌日数据
- 模型训练:为上涨/下跌趋势分别计算回归参数
- 预测交易量:
- 计算近期平均波动量
- 根据当前趋势选择模型
- 代入公式预测未来交易量
C++11 实现代码
代码实现步骤:
1. 定义数据结构:存储每天的收盘价和交易量。
2. 读取历史数据。
3. 计算每日价格波动量(ΔP)和涨跌方向。
4. 将数据分为上涨日和下跌日。
5. 对两组数据分别进行线性回归,得到参数a和b。
6. 预测未来K天:
- 1)、计算最近一天(今天)的涨跌:如果今天收盘价大于昨天,则趋势为上涨,否则下跌;
- 2)、估计明天的价格波动量:用最近N天(例如5天)的ΔP的平均值(也可以使用其他方法,这里我们用简单移动平均))。
- 3)、判断今天的涨跌方向(即最后一天相对于倒数第二天的涨跌),以确定使用哪个模型。
- 4)、对于未来K天,根据趋势选择模型,每天的交易量预测值都为:
V_pred = a * ΔP_avg + b (使用对应模型的a和b)
c++代码:
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
// 数据结构:存储每日股票数据
struct StockData {
double closePrice; // 收盘价
double volume; // 交易量
};
// 数据结构:存储波动率分析结果
struct VolatilityAnalysis {
double slope; // 斜率 a
double intercept; // 截距 b
};
// 计算线性回归参数
VolatilityAnalysis linearRegression(const std::vector<double>& deltaP,
const std::vector<double>& volumes) {
VolatilityAnalysis result = {0, 0};
const size_t n = deltaP.size();
if (n == 0) return result;
double sumDeltaP = 0.0, sumVolume = 0.0;
double sumDeltaPSquared = 0.0, sumDeltaPVolume = 0.0;
// 计算各项累加和
for (size_t i = 0; i < n; ++i) {
sumDeltaP += deltaP[i];
sumVolume += volumes[i];
sumDeltaPSquared += deltaP[i] * deltaP[i];
sumDeltaPVolume += deltaP[i] * volumes[i];
}
// 计算斜率 a (公式分子分母)
double numerator = n * sumDeltaPVolume - sumDeltaP * sumVolume;
double denominator = n * sumDeltaPSquared - sumDeltaP * sumDeltaP;
// 防止除零错误
if (fabs(denominator) > 1e-7) {
result.slope = numerator / denominator;
result.intercept = (sumVolume - result.slope * sumDeltaP) / n;
}
return result;
}
// 主预测函数
std::vector<double> predictFutureVolumes(
const std::vector<StockData>& historicalData, // 历史数据
int futureDays, // 预测天数
int lookbackDays = 5 // 计算平均波动量的回溯天数
) {
std::vector<double> predictions;
// 1. 检查数据量是否足够
if (historicalData.size() < 2) {
std::cerr << "错误:历史数据不足(至少需要2天数据)" << std::endl;
return predictions;
}
// 2. 计算每日价格波动量
std::vector<double> allDeltaP;
std::vector<double> upDeltaP, downDeltaP; // 上涨/下跌日的波动量
std::vector<double> upVolumes, downVolumes; // 上涨/下跌日的交易量
for (size_t i = 1; i < historicalData.size(); ++i) {
double priceChange = historicalData[i].closePrice -
historicalData[i-1].closePrice;
double deltaP = fabs(priceChange / historicalData[i-1].closePrice);
allDeltaP.push_back(deltaP);
// 分类存储数据
if (priceChange > 0) { // 上涨日
upDeltaP.push_back(deltaP);
upVolumes.push_back(historicalData[i].volume);
} else if (priceChange < 0) { // 下跌日
downDeltaP.push_back(deltaP);
downVolumes.push_back(historicalData[i].volume);
}
}
// 3. 训练回归模型
VolatilityAnalysis upModel = linearRegression(upDeltaP, upVolumes);
VolatilityAnalysis downModel = linearRegression(downDeltaP, downVolumes);
// 4. 确定当前市场趋势(最后一天的涨跌)
bool isRising = false;
if (historicalData.size() >= 2) {
double lastChange = historicalData.back().closePrice -
historicalData[historicalData.size()-2].closePrice;
isRising = (lastChange > 0);
}
// 5. 计算近期平均波动量
double avgDeltaP = 0.0;
int validDays = std::min(static_cast<int>(allDeltaP.size()), lookbackDays);
if (validDays > 0) {
for (int i = allDeltaP.size() - validDays; i < allDeltaP.size(); ++i) {
avgDeltaP += allDeltaP[i];
}
avgDeltaP /= validDays;
}
// 6. 选择模型并预测未来交易量
VolatilityAnalysis model = isRising ? upModel : downModel;
for (int i = 0; i < futureDays; ++i) {
double predictedVolume = model.slope * avgDeltaP + model.intercept;
predictions.push_back(predictedVolume);
}
return predictions;
}
int main() {
// 示例数据:历史股票数据(收盘价和交易量)
std::vector<StockData> historicalData = {
{100.0, 10000}, // 第1天
{102.0, 12000}, // 第2天:上涨 +2%
{101.5, 15000}, // 第3天:下跌 -0.5%
{103.0, 18000}, // 第4天:上涨 +1.5%
{105.0, 20000}, // 第5天:上涨 +1.9%
{104.0, 17000} // 第6天:下跌 -1.0%
};
// 预测未来3天的交易量
int forecastDays = 3;
std::vector<double> predictions = predictFutureVolumes(
historicalData, forecastDays);
// 输出结果
std::cout << "基于历史数据的预测模型:" << std::endl;
std::cout << "当前趋势: "
<< (historicalData.back().closePrice > historicalData[historicalData.size()-2].closePrice
? "上涨" : "下跌")
<< std::endl;
std::cout << "\n未来 " << forecastDays << " 天预测交易量:" << std::endl;
for (int i = 0; i < predictions.size(); ++i) {
std::cout << "第 " << i+1 << " 天: " << predictions[i] << " 股" << std::endl;
}
return 0;
}
代码解析
1、数据结构
- StockData:存储每日收盘价和交易量
- VolatilityAnalysis:存储线性回归参数(斜率和截距)
2、核心函数
1)linearRegression:实现线性回归算法
- 输入:波动量数组和对应交易量数组
- 输出:回归参数{a, b}
- 使用最小二乘法计算最佳拟合线
2)predictFutureVolumes:主预测函数
- 步骤1:计算每日价格波动率(ΔP)
- 步骤2:分离上涨/下跌日数据
- 步骤3:为不同趋势训练独立模型
- 步骤4:使用最近5天波动率平均值作为预测输入
- 步骤5:根据当前趋势选择模型预测未来交易量
3、关键实现细节
- 防错处理:检查足够历史数据
- 趋势判断:基于最近一天的价格变化
- 波动量计算:使用绝对值确保正值
- 模型选择:不同趋势使用不同回归参数
4、参数调整建议
- lookbackDays:可调整计算平均波动率的天数
- 数据清洗:实际应用中需处理异常值
- 模型优化:可扩展为多项式回归或加入更多特征
算法特点
- 直观易懂:基于价格波动与交易量的正相关关系
- 趋势区分:独立分析上涨/下跌行情
- 实时适应:使用最新数据更新模型
- 计算高效:O(n)时间复杂度,适合实时系统
注意:实际应用中需结合更多因素(如市场情绪、新闻事件、基本面数据等)进行综合判断,本算法提供基础框架,可根据需求扩展。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/1310945
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!