如何用Python分析股票趋势

企业微信

数据获取:从安装到接口调用

Python分析股票,第一步是获取历史价格数据。常用的库有yfinanceakshareyfinance从雅虎财经拉取数据,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指数和纳斯达克指数:

如何用Python分析股票趋势


import yfinance as yf

indices = ['^GSPC', '^IXIC']

data = yf.download(indices, period='6mo')

print(data['Close'].tail())

技术指标:计算与运用

技术指标用于量化股价行为,常见的有移动平均线、相对强弱指数(RSI)、MACD。用pandasnumpy手动计算,或用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上穿信号线是买入信号,下穿是卖出。

可视化:用图表辅助判断

图表能直观展示股价和指标。常用matplotlibplotly

绘制价格和均线


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做回测。保持对市场的敬畏。

转载请注明出处:https://www.lianghuajiaoyi.top/wenzhang/Python-gupiao-fenxi-233.html