3. 特征工程

在数据探索后,我们需要进行特征工程,目的是选择合适的特征,并构造新的特征,以便后续的机器学习模型能更好地学习股票价格的变化规律。

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. 特征工程-大赛人网
  • 观察短期均线(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. 特征工程-大赛人网
  • 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. 特征工程-大赛人网
  • 交易量越大,是否波动性越强?
  • 这有助于理解大额交易对市场的影响。

3.6 小结

  1. 特征选择:
    • 价格特征:open, high, low, close, volume
    • 时间特征:year, month, day_of_week
    • 技术指标:MA5, MA20, RSI14, volatility
  2. 特征构造:
    • 计算移动均线(MA5, MA20)
    • 计算 RSI 指标
    • 计算波动性(标准差)
    • 提取时间特征(月份、星期)
  3. 数据划分:
    • 训练集(80%) & 测试集(20%)
  4. 可视化分析:
    • 移动均线趋势
    • RSI 指标
    • 交易量 vs. 波动性
© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发
头像-大赛人网
欢迎您留下宝贵的见解!
提交
头像-大赛人网

昵称

取消
昵称

    请登录后查看评论内容