次方量化 全球宏观 每月宏观 公众号 股票开户

【策略】算法判断沪深300走势

lindercube 2个月前 (10-27) 阅读数 107 #量化教程

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

image.png

首先通过akshare这个包获取数据


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这个软件网上可以下载到,如果想要下面原文件的朋友(关注次方量化服务号,操作栏里面找客服,我就发给你)你可以进一步研究。

image.png




image.png





分享到:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门
标签列表