以下是一段基于Python的股票量化分析代码,包含数据获取、技术指标计算、策略回测和可视化功能:
python
|---|--------------------------------------------------------------------------------|
| | import yfinance as yf
|
| | import pandas as pd
|
| | import numpy as np
|
| | import matplotlib.pyplot as plt
|
| | import seaborn as sns
|
| | from backtesting import Backtest, Strategy
|
| | from backtesting.lib import crossover
|
| | |
| | # 参数设置
|
| | SYMBOL = 'AAPL' # 股票代码
|
| | START_DATE = '2020-01-01'
|
| | END_DATE = '2023-12-31'
|
| | FAST_MA = 20 # 快速均线周期
|
| | SLOW_MA = 50 # 慢速均线周期
|
| | RSI_PERIOD = 14 # RSI周期
|
| | BB_PERIOD = 20 # 布林带周期
|
| | |
| | # 获取数据
|
| | def get_stock_data(symbol, start, end):
|
| | data = yf.download(symbol, start=start, end=end)
|
| | data = data[['Open', 'High', 'Low', 'Close', 'Volume']]
|
| | data.columns = ['open', 'high', 'low', 'close', 'volume']
|
| | return data.dropna()
|
| | |
| | # 计算技术指标
|
| | def calculate_technical_indicators(df):
|
| | # 移动平均线
|
| | df['fast_ma'] = df['close'].rolling(FAST_MA).mean()
|
| | df['slow_ma'] = df['close'].rolling(SLOW_MA).mean()
|
| | |
| | # RSI计算
|
| | delta = df['close'].diff()
|
| | gain = delta.where(delta > 0, 0)
|
| | loss = -delta.where(delta < 0, 0)
|
| | avg_gain = gain.rolling(RSI_PERIOD).mean()
|
| | avg_loss = loss.rolling(RSI_PERIOD).mean()
|
| | rs = avg_gain / avg_loss
|
| | df['rsi'] = 100 - (100 / (1 + rs))
|
| | |
| | # 布林带
|
| | df['bb_mid'] = df['close'].rolling(BB_PERIOD).mean()
|
| | std = df['close'].rolling(BB_PERIOD).std()
|
| | df['bb_upper'] = df['bb_mid'] + 2 * std
|
| | df['bb_lower'] = df['bb_mid'] - 2 * std
|
| | |
| | return df.dropna()
|
| | |
| | # 双均线策略
|
| | class DualMovingAverageStrategy(Strategy):
|
| | def init(self):
|
| | self.fast_ma = self.I(lambda x: x, self.data.close.rolling(FAST_MA).mean())
|
| | self.slow_ma = self.I(lambda x: x, self.data.close.rolling(SLOW_MA).mean())
|
| | |
| | def next(self):
|
| | if crossover(self.fast_ma, self.slow_ma):
|
| | self.buy()
|
| | elif crossover(self.slow_ma, self.fast_ma):
|
| | self.sell()
|
| | |
| | # 可视化函数
|
| | def visualize_results(data, bt):
|
| | plt.figure(figsize=(16, 20))
|
| | |
| | # 价格与均线
|
| | plt.subplot(3, 1, 1)
|
| | plt.plot(data['close'], label='Price')
|
| | plt.plot(data['fast_ma'], label=f'{FAST_MA} MA')
|
| | plt.plot(data['slow_ma'], label=f'{SLOW_MA} MA')
|
| | plt.title('Price and Moving Averages')
|
| | plt.legend()
|
| | |
| | # RSI
|
| | plt.subplot(3, 1, 2)
|
| | plt.plot(data['rsi'], label='RSI')
|
| | plt.axhline(70, color='red', linestyle='--')
|
| | plt.axhline(30, color='green', linestyle='--')
|
| | plt.title('RSI Indicator')
|
| | |
| | # 策略收益曲线
|
| | plt.subplot(3, 1, 3)
|
| | plt.plot(bt._equity_curve['Equity'], label='Strategy')
|
| | plt.plot(data['close']/data['close'].iloc[0], label='Buy & Hold')
|
| | plt.title('Strategy vs Buy & Hold')
|
| | plt.legend()
|
| | |
| | plt.tight_layout()
|
| | plt.show()
|
| | |
| | # 主程序
|
| | if __name__ == "__main__":
|
| | # 获取并处理数据
|
| | data = get_stock_data(SYMBOL, START_DATE, END_DATE)
|
| | data = calculate_technical_indicators(data)
|
| | |
| | # 回测策略
|
| | bt = Backtest(data, DualMovingAverageStrategy, cash=100000, commission=.002)
|
| | stats = bt.run()
|
| | |
| | # 输出关键指标
|
| | print(f"策略年化收益率: {stats['Return [%]']:.2f}%")
|
| | print(f"夏普比率: {stats['Sharpe Ratio']:.2f}")
|
| | print(f"最大回撤: {stats['Max. Drawdown [%]']:.2f}%")
|
| | print(f"交易次数: {stats['# Trades']}")
|
| | |
| | # 可视化结果
|
| | visualize_results(data, bt)
|
| | |
| | # 显示详细回测报告
|
| | bt.plot()
|
代码功能说明:
-
数据获取:
- 使用yfinance获取雅虎财经数据
- 包含开盘价、最高价、最低价、收盘价和成交量
-
技术指标计算:
- 双移动平均线(快速MA和慢速MA)
- 相对强弱指数(RSI)
- 布林带指标(Bollinger Bands)
-
交易策略:
- 双均线交叉策略(金叉买入,死叉卖出)
- 包含0.2%的交易手续费
- 初始资金10万美元
-
风险管理:
- 计算年化收益率
- 夏普比率评估风险调整收益
- 最大回撤指标
-
可视化功能:
- 价格与均线走势图
- RSI指标图
- 策略与买入持有收益对比
- 交互式回测结果展示
使用说明:
- 安装依赖库:
bash
pip install yfinance pandas numpy matplotlib seaborn backtesting
- 修改参数:
python
|---|--------------------------------------|
| | # 可调整股票代码和时间范围
|
| | SYMBOL = 'TSLA' # 改为其他股票代码如TSLA
|
| | START_DATE = '2022-01-01' # 修改开始日期
|
| | FAST_MA = 10 # 调整快速均线周期
|
- 策略优化示例:
python
|---|-------------------------------------------------------------------|
| | # 增加止损止盈逻辑
|
| | class EnhancedStrategy(DualMovingAverageStrategy):
|
| | def next(self):
|
| | if crossover(self.fast_ma, self.slow_ma):
|
| | self.buy(sl=self.data.low[-1]*0.95, tp=self.data.high[-1]*1.15)
|
| | elif crossover(self.slow_ma, self.fast_ma):
|
| | self.sell()
|
该代码实现了完整的量化分析流程,可以作为量化交易策略开发的基础框架。建议在Jupyter Notebook中运行以获得更好的交互体验。