企业微信

数据获取与处理

Python分析股票,先把数据弄到手。使用yfinance库下载历史行情,简单高效。


import yfinance as yf

import pandas as pd

data = yf.download('AAPL', start='2020-01-01', end='2023-12-31')

print(data.head())

数据包含开盘价、最高价、最低价、收盘价、成交量等字段。用pandas清洗数据,处理缺失值,计算收益率。


data['Return'] = data['Close'].pct_change()

data = data.dropna()

技术指标计算

技术指标是量化分析的基础。使用ta-lib库计算RSI、MACD、布林带等。注意,ta-lib需要单独安装。

如何用Python进行股票数据分析?


import talib

close = data['Close'].values

rsi = talib.RSI(close, timeperiod=14)

macd, macdsignal, macdhist = talib.MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)

data['RSI'] = rsi

data['MACD'] = macd

data['MACD_Signal'] = macdsignal

也可以手动实现,避免依赖。以简单移动平均线为例:


data['SMA_20'] = data['Close'].rolling(window=20).mean()

data['SMA_50'] = data['Close'].rolling(window=50).mean()

数据可视化

matplotlibseaborn绘制价格走势和技术指标图,直观判断趋势。


import matplotlib.pyplot as plt

plt.style.use('ggplot')

fig, ax = plt.subplots(figsize=(12,6))

ax.plot(data.index, data['Close'], label='Close')

ax.plot(data.index, data['SMA_20'], label='SMA 20')

ax.plot(data.index, data['SMA_50'], label='SMA 50')

ax.legend()

plt.title('Apple Stock Price with Moving Averages')

plt.show()

风险与收益分析

计算年化收益率、波动率和夏普比率,衡量投资表现。


import numpy as np

returns = data['Return'].dropna()

annual_return = returns.mean() * 252

annual_volatility = returns.std() * np.sqrt(252)

sharpe_ratio = annual_return / annual_volatility

print(f'Annual Return: {annual_return:.2%}')

print(f'Annual Volatility: {annual_volatility:.2%}')

print(f'Sharpe Ratio: {sharpe_ratio:.2f}')

也可以用empyrical库快速计算。

构建回测系统

回测验证策略效果。一个简单的双均线策略:金叉买入,死叉卖出。


import numpy as np

data['Signal'] = 0

data.loc[data['SMA_20'] > data['SMA_50'], 'Signal'] = 1

data['Position'] = data['Signal'].diff()

data['Strategy_Return'] = data['Position'] * data['Return']

data['Cumulative_Return'] = (1 + data['Strategy_Return']).cumprod()

cumulative_return = data['Cumulative_Return'].iloc[-1] - 1

print(f'Cumulative Return: {cumulative_return:.2%}')

更完整的回测需要考虑交易成本和滑点,使用backtrader等框架。

机器学习预测

利用机器学习模型预测股价方向。特征可以使用历史价格和指标,目标变量是未来涨跌。使用scikit-learn


from sklearn.ensemble import RandomForestClassifier

from sklearn.model_selection import train_test_split

from sklearn.metrics import accuracy_score

data['Target'] = np.where(data['Return'] > 0, 1, 0)

features = ['RSI', 'MACD', 'MACD_Signal', 'SMA_20', 'SMA_50']

X = data[features].dropna()

Y = data.loc[X.index, 'Target']

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)

model = RandomForestClassifier(n_estimators=100)

model.fit(X_train, Y_train)

pred = model.predict(X_test)

accuracy = accuracy_score(Y_test, pred)

print(f'Accuracy: {accuracy:.2%}')

特征重要性可以帮助理解模型。

实时数据获取

websocket连接交易所API,获取实时行情,结合pandas滚动计算。


import websocket

def on_message(ws, message):

    data = json.loads(message)

    # 处理数据

ws = websocket.WebSocketApp('wss://stream.binance.com:9443/ws/btcusdt@trade', on_message=on_message)

ws.run_forever()

自动化交易

使用ccxt库连接交易所,执行自动化交易。确保策略稳定后再实盘。


import ccxt

exchange = ccxt.binance()

balance = exchange.fetch_balance()

order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)

构建交互式仪表板

plotlydash创建交互式图表,方便分析和展示。


import plotly.graph_objects as go

import dash

from dash import dcc, html

app = dash.Dash()

app.layout = html.Div([

    dcc.Graph(

        figure=go.Figure(data=[go.Candlestick(x=data.index,

                                              open=data['Open'], high=data['High'], low=data['Low'], close=data['Close'])])

    )

])

if __name__ == '__main__':

    app.run_server(debug=True)

数据存储与管理

数据量大时,使用SQLitePostgreSQL存储,定期更新。


import sqlite3

conn = sqlite3.connect('stock.db')

data.to_sql('prices', conn, if_exists='replace')

回测框架的深化

backtrader提供完整的事件驱动回测,包含滑点和佣金。


import backtrader as bt

class SmaCross(bt.SignalStrategy):

    def __init__(self):

        sma1 = bt.ind.SMA(period=20)

        sma2 = bt.ind.SMA(period=50)

        self.signal_add(bt.SIGNAL_LONG, bt.And(sma1 > sma2, sma1[-1] < sma2[-1]))

        self.signal_add(bt.SIGNAL_SHORT, bt.And(sma1 < sma2, sma1[-1] > sma2[-1]))

cerebro = bt.Cerebro()

data_feed = bt.feeds.PandasData(dataname=data)

cerebro.adddata(data_feed)

cerebro.addstrategy(SmaCross)

cerebro.broker.set_cash(10000)

cerebro.broker.set_commission(commission=0.001)

cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')

results = cerebro.run()

策略优化

scikit-optimizeoptuna进行参数优化,寻找最佳参数组合。


import optuna

def objective(trial):

    sma_fast = trial.suggest_int('sma_fast', 5, 30)

    sma_slow = trial.suggest_int('sma_slow', 30, 200)

    # 运行回测并返回负夏普比率

    return -result_sharpe

study = optuna.create_study(direction='maximize')

study.optimize(objective, n_trials=100)

风险控制

设置止损止盈,计算最大回撤。最大回撤是评判风险的重要指标。


cumulative = data['Cumulative_Return']

rolling_max = cumulative.cummax()

drawdown = cumulative / rolling_max - 1

max_drawdown = drawdown.min()

print(f'Max Drawdown: {max_drawdown:.2%}')

因子分析

使用alphalens分析因子有效性,检测收益与因子的相关性。

文本数据与情感分析

分析新闻和社交媒体情绪,用vaderSentimenttransformers模型。


from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer

analyzer = SentimentIntensityAnalyzer()

score = analyzer.polarity_scores('Apple stock is rising')

print(score)

并行处理与加速

使用multiprocessingnumba加速计算,处理大规模数据。

代码组织与测试

模块化代码,编写单元测试,确保策略正确无误。

部署与监控

将策略部署到云服务器,使用dockercron定期运行,并设置监控警报。

Python助力股票数据分析,需要不断学习和实践。掌握数据处理、指标计算、回测验证等核心技能,能有效提升分析效率。