在数据探索后,我们需要进行特征工程,目的是选择合适的特征,并构造新的特征,以便后续的机器学习模型能更好地学习股票价格的变化规律。
3.1 特征选择
我们从原始数据中提取以下特征:
- 基本价格特征:
open(开盘价)high(最高价)low(最低价)close(收盘价)volume(交易量)
- 时间特征:
year(年份)month(月份)day_of_week(星期几)
- 技术指标特征:
5-day moving average (MA5)(5日均线)20-day moving average (MA20)(20日均线)Relative Strength Index (RSI)(相对强弱指数)Volatility (Standard Deviation of 5 days)(5日标准差衡量波动性)
3.2. 构造新特征
我们计算均线、相对强弱指数(RSI)等技术指标作为新特征。
3.2.1 计算移动均线(MA)
# 计算 5 日和 20 日移动均线
df["MA5"] = df.groupby("Name")["close"].transform(lambda x: x.rolling(window=5).mean())
df["MA20"] = df.groupby("Name")["close"].transform(lambda x: x.rolling(window=20).mean())
MA5和MA20代表短期和中期趋势。- 如果
MA5上穿MA20,可能是买入信号;反之可能是卖出信号。
3.2.2 计算相对强弱指数(RSI)
def compute_rsi(series, window=14):
delta = series.diff(1)
gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()
rs = gain / loss
rsi = 100 - (100 / (1 + rs))
return rsi
df["RSI14"] = df.groupby("Name")["close"].transform(lambda x: compute_rsi(x, window=14))
- RSI(相对强弱指数) 用于判断股票是否超买(>70)或超卖(<30)。
- RSI 过高时,股价可能即将回落;过低时,股价可能即将反弹。
3.2.3 计算波动性(标准差)
df["volatility"] = df.groupby("Name")["close"].transform(lambda x: x.rolling(window=5).std())
- 标准差用于衡量价格波动,波动较大的股票通常风险较高。
3.3 处理时间特征
# 提取年份、月份、星期几
df["year"] = df["date"].dt.year
df["month"] = df["date"].dt.month
df["day_of_week"] = df["date"].dt.dayofweek # 0: Monday, 6: Sunday
- 股票市场可能有季节性变化,如年底表现较强,周一或周五交易活跃度不同。
3.4 数据集划分
我们以 AAPL 作为示例,构建训练集和测试集:
from sklearn.model_selection import train_test_split
# 选择 AAPL 股票数据
df_aapl = df[df["Name"] == "AAPL"].dropna() # 移除 NaN 值
# 选取特征列
features = ["open", "high", "low", "volume", "MA5", "MA20", "RSI14", "volatility", "month", "day_of_week"]
target = "close"
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(df_aapl[features], df_aapl[target], test_size=0.2, random_state=42)
print(f"训练集样本数:{X_train.shape[0]}")
print(f"测试集样本数:{X_test.shape[0]}")
- 目标变量
close(收盘价)是我们希望预测的变量。 - 训练集占80%,测试集占20%,用于评估模型的泛化能力。
3.5 关键特征可视化
3.5.1 移动均线趋势
plt.figure(figsize=(12, 6))
plt.plot(df_aapl["date"], df_aapl["close"], label="Close Price", color="dodgerblue")
plt.plot(df_aapl["date"], df_aapl["MA5"], label="MA5", color="orange")
plt.plot(df_aapl["date"], df_aapl["MA20"], label="MA20", color="red")
plt.xlabel("Date")
plt.ylabel("Price")
plt.title("AAPL Stock Closing Price with Moving Averages")
plt.legend()
plt.grid(True)
plt.show()
![图片[1]-3. 特征工程-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/10/image-285-1024x543.png)
- 观察短期均线(MA5) 和长期均线(MA20) 是否交叉,判断趋势。
3.5.2 RSI 指标
plt.figure(figsize=(12, 4))
plt.plot(df_aapl["date"], df_aapl["RSI14"], label="RSI14", color="purple")
plt.axhline(70, linestyle="--", color="red") # 超买线
plt.axhline(30, linestyle="--", color="green") # 超卖线
plt.xlabel("Date")
plt.ylabel("RSI Value")
plt.title("AAPL RSI Trend")
plt.legend()
plt.show()
![图片[2]-3. 特征工程-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/10/image-286-1024x357.png)
- RSI > 70 时,可能是卖出信号;RSI < 30 时,可能是买入信号。
3.5.3 交易量 vs. 波动性
plt.figure(figsize=(10, 5))
sns.scatterplot(x=df_aapl["volume"], y=df_aapl["volatility"], alpha=0.5, color="blue")
plt.xlabel("Trading Volume")
plt.ylabel("Volatility")
plt.title("Trading Volume vs. Stock Volatility")
plt.show()
![图片[3]-3. 特征工程-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/10/image-287.png)
- 交易量越大,是否波动性越强?
- 这有助于理解大额交易对市场的影响。
3.6 小结
- 特征选择:
- 价格特征:
open,high,low,close,volume - 时间特征:
year,month,day_of_week - 技术指标:
MA5,MA20,RSI14,volatility
- 价格特征:
- 特征构造:
- 计算移动均线(MA5, MA20)
- 计算 RSI 指标
- 计算波动性(标准差)
- 提取时间特征(月份、星期)
- 数据划分:
- 训练集(80%) & 测试集(20%)
- 可视化分析:
- 移动均线趋势
- RSI 指标
- 交易量 vs. 波动性
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END













请登录后查看评论内容