股票市场数据蕴含着丰富的信息,通过Python进行数据分析可以帮助投资者发现潜在规律、预测价格趋势。本文将介绍如何使用Python获取股票数据、进行基础分析、可视化展示以及构建简单的趋势预测模型。
一、获取股票数据
1. 使用Tushare库(国内股票)
import tushare as ts
# 设置token(需要在Tushare官网注册获取)
ts.set_token('你的token')
pro = ts.pro_api()
# 获取贵州茅台日线数据
df = pro.daily(ts_code='600519.SH', start_date='20200101', end_date='20221231')
print(df.head())
2. 使用yfinance库(国际股票)
import yfinance as yf
# 获取苹果公司股票数据
apple = yf.Ticker("AAPL")
df = apple.history(period="5y") # 获取5年数据
print(df.head())
3. 使用AKShare库(多源数据)
import akshare as ak
# 获取A股实时行情数据
stock_zh_a_spot = ak.stock_zh_a_spot()
print(stock_zh_a_spot.head())
二、基础数据分析
1. 数据清洗与预处理
import pandas as pd
# 处理缺失值
df.fillna(method='ffill', inplace=True) # 前向填充
df.dropna(inplace=True) # 删除仍存在的缺失值
# 计算每日收益率
df['daily_return'] = df['close'].pct_change()
# 计算移动平均线
df['MA5'] = df['close'].rolling(window=5).mean()
df['MA20'] = df['close'].rolling(window=20).mean()
2. 基本统计指标
# 基本统计描述
print(df[['open', 'high', 'low', 'close', 'volume']].describe())
# 相关性分析
correlation = df[['close', 'volume', 'daily_return']].corr()
print(correlation)
三、数据可视化分析
1. 使用Matplotlib绘制K线图
import matplotlib.pyplot as plt
from mplfinance.original_flavor import candlestick_ohlc
import matplotlib.dates as mdates
# 准备数据
df_plot = df.reset_index()[['trade_date', 'open', 'high', 'low', 'close']]
df_plot['trade_date'] = pd.to_datetime(df_plot['trade_date'])
df_plot['trade_date'] = df_plot['trade_date'].apply(mdates.date2num)
# 创建图表
fig, ax = plt.subplots(figsize=(12, 6))
candlestick_ohlc(ax, df_plot.values, width=0.6, colorup='r', colordown='g')
# 添加移动平均线
ax.plot(df_plot['trade_date'], df['MA5'], label='5日均线')
ax.plot(df_plot['trade_date'], df['MA20'], label='20日均线')
# 设置格式
ax.xaxis_date()
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
plt.xticks(rotation=45)
plt.title('贵州茅台K线图')
plt.legend()
plt.show()
2. 使用Seaborn绘制分布图
import seaborn as sns
# 收益率分布
plt.figure(figsize=(10, 6))
sns.histplot(df['daily_return'].dropna(), bins=50, kde=True)
plt.title('每日收益率分布')
plt.show()
# 收盘价与成交量关系
plt.figure(figsize=(10, 6))
sns.scatterplot(x='volume', y='close', data=df)
plt.title('收盘价与成交量关系')
plt.show()
四、趋势分析与预测
1. 移动平均策略分析
# 生成交易信号
df['signal'] = 0
df.loc[df['MA5'] > df['MA20'], 'signal'] = 1 # 5日均线上穿20日均线买入
df.loc[df['MA5'] <= df['MA20'], 'signal'] = -1 # 5日均线下穿20日均线卖出
# 计算策略收益
df['strategy_return'] = df['signal'].shift(1) * df['daily_return']
# 绘制累计收益曲线
cumulative_returns = (1 + df[['daily_return', 'strategy_return']]).cumprod()
cumulative_returns.plot(figsize=(12, 6))
plt.title('简单移动平均策略表现')
plt.show()
2. 使用Prophet进行时间序列预测
from prophet import Prophet
# 准备数据
df_prophet = df.reset_index()[['trade_date', 'close']].rename(
columns={'trade_date': 'ds', 'close': 'y'})
# 创建并拟合模型
model = Prophet(daily_seasonality=False)
model.fit(df_prophet)
# 创建未来30天的预测
future = model.make_future_dataframe(periods=30)
forecast = model.predict(future)
# 绘制预测结果
fig = model.plot(forecast)
plt.title('Prophet股票价格预测')
plt.show()
3. 使用LSTM神经网络预测
from keras.models import Sequential
from keras.layers import LSTM, Dense
from sklearn.preprocessing import MinMaxScaler
import numpy as np
# 数据标准化
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(df['close'].values.reshape(-1, 1))
# 创建训练数据集
def create_dataset(dataset, look_back=60):
X, Y = [], []
for i in range(len(dataset)-look_back-1):
a = dataset[i:(i+look_back), 0]
X.append(a)
Y.append(dataset[i + look_back, 0])
return np.array(X), np.array(Y)
X, Y = create_dataset(scaled_data)
X = np.reshape(X, (X.shape[0], X.shape[1], 1))
# 构建LSTM模型
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(X.shape[1], 1)))
model.add(LSTM(50))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
# 训练模型
model.fit(X, Y, epochs=20, batch_size=32, verbose=1)
# 预测
train_predict = model.predict(X)
train_predict = scaler.inverse_transform(train_predict)
五、风险管理指标计算
1. 计算波动率
# 年化波动率
annual_volatility = df['daily_return'].std() * np.sqrt(252)
print(f"年化波动率: {annual_volatility:.2%}")
2. 计算最大回撤
# 计算累计最大回撤
wealth_index = (1 + df['daily_return']).cumprod()
previous_peaks = wealth_index.cummax()
drawdown = (wealth_index - previous_peaks) / previous_peaks
max_drawdown = drawdown.min()
print(f"最大回撤: {max_drawdown:.2%}")
3. 计算夏普比率
# 假设无风险利率为3%
risk_free_rate = 0.03
sharpe_ratio = (df['daily_return'].mean() * 252 - risk_free_rate) / (df['daily_return'].std() * np.sqrt(252))
print(f"夏普比率: {sharpe_ratio:.2f}")
六、完整分析流程示例
import pandas as pd
import matplotlib.pyplot as plt
import tushare as ts
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np
# 1. 获取数据
ts.set_token('你的token')
pro = ts.pro_api()
df = pro.daily(ts_code='600519.SH', start_date='20180101', end_date='20221231')
# 2. 数据预处理
df['trade_date'] = pd.to_datetime(df['trade_date'])
df.set_index('trade_date', inplace=True)
df.sort_index(inplace=True)
# 3. 技术指标计算
df['MA5'] = df['close'].rolling(5).mean()
df['MA20'] = df['close'].rolling(20).mean()
df['daily_return'] = df['close'].pct_change()
# 4. 可视化
plt.figure(figsize=(14, 7))
plt.plot(df['close'], label='收盘价')
plt.plot(df['MA5'], label='5日均线')
plt.plot(df['MA20'], label='20日均线')
plt.title('贵州茅台股价与均线')
plt.legend()
plt.show()
# 5. LSTM预测
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(df['close'].values.reshape(-1, 1))
train_size = int(len(scaled_data) * 0.8)
train_data = scaled_data[:train_size]
test_data = scaled_data[train_size:]
def create_dataset(dataset, look_back=60):
X, Y = [], []
for i in range(len(dataset)-look_back-1):
X.append(dataset[i:(i+look_back), 0])
Y.append(dataset[i + look_back, 0])
return np.array(X), np.array(Y)
X_train, Y_train = create_dataset(train_data)
X_test, Y_test = create_dataset(test_data)
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(X_train.shape[1], 1)))
model.add(LSTM(50))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(X_train, Y_train, epochs=20, batch_size=32, verbose=1)
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)
train_predict = scaler.inverse_transform(train_predict)
Y_train = scaler.inverse_transform([Y_train])
test_predict = scaler.inverse_transform(test_predict)
Y_test = scaler.inverse_transform([Y_test])
plt.figure(figsize=(14, 7))
plt.plot(df.index[60:train_size-1], Y_train[0], label='实际训练值')
plt.plot(df.index[60:train_size-1], train_predict[:,0], label='训练预测值')
plt.plot(df.index[train_size+60:-1], Y_test[0], label='实际测试值')
plt.plot(df.index[train_size+60:-1], test_predict[:,0], label='测试预测值')
plt.legend()
plt.title('LSTM股价预测')
plt.show()
七、注意事项
- 数据质量:确保数据准确完整,处理缺失值和异常值
- 过拟合风险:机器学习模型可能过度拟合历史数据
- 市场变化:历史规律不一定适用于未来市场
- 风险控制:任何投资策略都应设置止损点
- 多因素分析:考虑宏观经济、行业新闻等多方面因素
八、总结
Python为股票价格趋势分析提供了强大工具,从数据获取到复杂模型构建都能高效完成。本文介绍了从基础分析到LSTM预测的完整流程,但实际应用中需要结合更多因素和市场知识。记住,股市有风险,任何分析工具都应谨慎使用,建议将量化分析作为辅助决策手段而非唯一依据。