【策略】算法判断沪深300走势
之前基本上写的基本面的东西多一些,不过大家对这个不感兴趣,还是写一些量化探索性的东西,大家更加喜欢,如果我们探索性的东西有意义的话,后面就做成【次方量化】里面成熟的产品,给大家一起使用。到目前为止,没有任何一个产品,能够预测大盘的走势。如果通过一些衍生指标做神经网络,又经常过拟合。就算一些大学生写的论文,也是过拟合严重,随便弄一个机器学习跑一个demo,就把论文交上去了。如果通过经济的基本面去预测的话,延迟非常严重。股市的本质是资金推动的,之前有北线资金,现在北线资金被取消了,而且也有内资借道。还有主力资金,不过所有的主力资金,那个数据都是假的,主力资金,天天流出,这个不是真的资金,现在还有一个能用的资金指标,那就是【融资融券】这个数据真实性非常高,而且每天更新,里面没有假数据。

import akshare as ak
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
# ========== 1. 数据准备 ==========
stock_margin_account_info_df = ak.stock_margin_account_info()
stock_zh_index_daily_df = ak.stock_zh_index_daily(symbol="sh000300")
# 统一日期格式
stock_margin_account_info_df.rename(columns={'日期': 'date'}, inplace=True)
stock_zh_index_daily_df['date'] = pd.to_datetime(stock_zh_index_daily_df['date'])
stock_margin_account_info_df['date'] = pd.to_datetime(stock_margin_account_info_df['date'])
# 合并
data = pd.merge(stock_margin_account_info_df, stock_zh_index_daily_df, how='inner', on='date')
data = data.sort_values('date').reset_index(drop=True)
data = data[1000:].copy()
# 特征工程
for i in [5, 10, 20]:
for j in ['close', 'volume', '融资买入额']:
data[f"{j}_{i}"] = data[j].rolling(window=i).mean()
# 目标变量:未来10天是否上涨
data['y_price'] = data['close'].shift(-10) - data['close']
data['target'] = (data['y_price'] > 0).astype(int)
# 准备特征
drop_cols = ['date', 'y_price', 'close', 'open', 'high', 'low', 'volume', 'amount', '融资买入额']
feature_cols = [col for col in data.columns if col not in drop_cols]
data = data[20:].dropna().reset_index(drop=True)
# ========== 2. 训练模型 ==========
X = data[feature_cols]
y = data['target']
# 时间顺序划分(最后20%作为测试)
split_idx = int(len(X) * 0.8)
X_train, X_test = X.iloc[:split_idx], X.iloc[split_idx:]
y_train, y_test = y.iloc[:split_idx], y.iloc[split_idx:]
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# 预测类别(0/1)
y_pred = model.predict(X_test)
# 提取测试集对应的日期和收盘价
test_dates = data['date'].iloc[split_idx:].reset_index(drop=True)
test_close = data['close'].iloc[split_idx:].reset_index(drop=True)
# ========== 3. 只保留最近3个月(约60个交易日)==========
# 注意:A股每月约22个交易日,3个月≈66天
N_DAYS = 120
if len(test_dates) > N_DAYS:
recent_dates = test_dates.iloc[-N_DAYS:]
recent_close = test_close.iloc[-N_DAYS:]
recent_pred = y_pred[-N_DAYS:]
else:
recent_dates = test_dates
recent_close = test_close
recent_pred = y_pred
# ========== 4. 可视化:最近3个月 ==========
plt.figure(figsize=(12, 6))
# 实际收盘价曲线
plt.plot(recent_dates, recent_close, color='black', linewidth=1.5, label='沪深300 实际收盘价')
# 标记预测结果:绿色=预测上涨,红色=预测下跌
up_mask = recent_pred == 1
down_mask = recent_pred == 0
plt.scatter(recent_dates[up_mask], recent_close.iloc[up_mask],
color='green', s=30, label='模型预测:未来10日上涨', zorder=5)
plt.scatter(recent_dates[down_mask], recent_close.iloc[down_mask],
color='red', s=30, label='模型预测:未来10日下跌', zorder=5)
# 美化图表
plt.title('最近3个月:沪深300实际走势 + 模型预测信号(每天预测未来10日涨跌)', fontsize=14)
plt.xlabel('日期')
plt.ylabel('收盘价')
plt.legend()
plt.grid(True, linestyle='--', alpha=0.5)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()再构建你的机器学习模型,我这边用的神经网络,软件用的spss modeler这个软件网上可以下载到,如果想要下面原文件的朋友(关注次方量化服务号,操作栏里面找客服,我就发给你)你可以进一步研究。


次方量化-技术博客
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。