
数据获取:从安装到接口调用
用Python分析股票,第一步是获取历史价格数据。常用的库有yfinance和akshare。yfinance从雅虎财经拉取数据,akshare面向中国市场。安装方法简单:
pip install yfinance akshare
获取单只股票数据
以yfinance为例,获取苹果股票最近一年日线数据:
import yfinance as yf
df = yf.download('AAPL', period='1y', interval='1d')
print(df.head())
输出包含开高低收、成交量等列。df是一个DataFrame,索引是日期。
获取多只股票或指数
可以用列表同时获取,或者使用yf.Ticker对象。例如获取标普500指数和纳斯达克指数:

import yfinance as yf
indices = ['^GSPC', '^IXIC']
data = yf.download(indices, period='6mo')
print(data['Close'].tail())
技术指标:计算与运用
技术指标用于量化股价行为,常见的有移动平均线、相对强弱指数(RSI)、MACD。用pandas和numpy手动计算,或用ta库。
移动平均线
简单移动平均(SMA)是过去N日收盘价的平均值。
import pandas as pd
df['SMA_20'] = df['Close'].rolling(window=20).mean()
df['SMA_50'] = df['Close'].rolling(window=50).mean()
当短期均线上穿长期均线,视为金叉,买入信号;反之死叉,卖出信号。
相对强弱指数(RSI)
RSI衡量价格变动速度和幅度,范围0-100。常用14日RSI。
import numpy as np
delta = df['Close'].diff()
gain = delta.clip(lower=0)
loss = -delta.clip(upper=0)
avg_gain = gain.rolling(window=14).mean()
avg_loss = loss.rolling(window=14).mean()
rs = avg_gain / avg_loss
rsi = 100 - (100 / (1 + rs))
df['RSI'] = rsi
RSI高于70超买,低于30超卖。
MACD指标
MACD由12日EMA和26日EMA的差产生。
ema_12 = df['Close'].ewm(span=12, adjust=False).mean()
ema_26 = df['Close'].ewm(span=26, adjust=False).mean()
df['MACD'] = ema_12 - ema_26
df['Signal'] = df['MACD'].ewm(span=9, adjust=False).mean()
MACD上穿信号线是买入信号,下穿是卖出。
可视化:用图表辅助判断
图表能直观展示股价和指标。常用matplotlib和plotly。
绘制价格和均线
import matplotlib.pyplot as plt
plt.figure(figsize=(12,6))
plt.plot(df.index, df['Close'], label='Close')
plt.plot(df.index, df['SMA_20'], label='SMA 20')
plt.plot(df.index, df['SMA_50'], label='SMA 50')
plt.legend()
plt.title('AAPL Price and Moving Averages')
plt.show()
绘制RSI和MACD子图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12,8))
ax1.plot(df.index, df['Close'], color='black')
ax1.set_title('Price')
ax2.plot(df.index, df['RSI'], color='orange')
ax2.axhline(70, color='red', linestyle='--')
ax2.axhline(30, color='green', linestyle='--')
ax2.set_title('RSI')
plt.tight_layout()
plt.show()
交互式图表
plotly支持缩放和悬停,推荐用于深度分析。
import plotly.graph_objects as go
fig = go.Figure(data=[go.Candlestick(x=df.index,
open=df['Open'], high=df['High'],
low=df['Low'], close=df['Close'])])
fig.show()
策略回测:验证想法
回测可以评估策略在历史数据上的表现。简单策略:当RSI低于30买入,高于70卖出。
capital = 10000
position = 0
cash = capital
for i in range(len(df)):
if df['RSI'].iloc[i] < 30 and position == 0:
position = cash / df['Close'].iloc[i]
cash = 0
elif df['RSI'].iloc[i] > 70 and position > 0:
cash = position * df['Close'].iloc[i]
position = 0
final_value = cash + position * df['Close'].iloc[-1]
print(f"最终资产: {final_value:.2f}")
回测需注意滑点、手续费等现实因素。
实时监控与自动交易
交易者需要实时数据。yfinance能间歇性获取数据,或用WebSocket。
实时报价
import time
while True:
ticker = yf.Ticker('AAPL')
hist = ticker.history(period='1d', interval='1m')
latest = hist['Close'].iloc[-1]
print(f"{time.ctime()} 价格: {latest}")
time.sleep(60)
通知与自动化
当指标触发信号时,发送邮件或消息,使用smtplib或第三方API。
import smtplib
from email.message import EmailMessage
def send_email(subject, body):
msg = EmailMessage()
msg.set_content(body)
msg['Subject'] = subject
msg['From'] = 'your@email.com'
msg['To'] = 'receiver@email.com'
with smtplib.SMTP('smtp.gmail.com', 587) as s:
s.starttls()
s.login('your@email.com', 'password')
s.send_message(msg)
风险与建议
Python分析股票能提供数据支撑,但技术指标有滞后性。注意市场风险,结合基本面。使用模拟账户测试策略,避免实盘损失。量化交易需要严谨的纪律,回测结果不代表未来收益。
不断学习新模型和库,如scikit-learn做预测,backtrader做回测。保持对市场的敬畏。