股票量化交易开发 Yfinance

以下是一段基于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() |

代码功能说明:

  1. 数据获取

    • 使用yfinance获取雅虎财经数据
    • 包含开盘价、最高价、最低价、收盘价和成交量
  2. 技术指标计算

    • 双移动平均线(快速MA和慢速MA)
    • 相对强弱指数(RSI)
    • 布林带指标(Bollinger Bands)
  3. 交易策略

    • 双均线交叉策略(金叉买入,死叉卖出)
    • 包含0.2%的交易手续费
    • 初始资金10万美元
  4. 风险管理

    • 计算年化收益率
    • 夏普比率评估风险调整收益
    • 最大回撤指标
  5. 可视化功能

    • 价格与均线走势图
    • RSI指标图
    • 策略与买入持有收益对比
    • 交互式回测结果展示

使用说明:

  1. 安装依赖库:

bash

复制代码
pip install yfinance pandas numpy matplotlib seaborn backtesting
  1. 修改参数:

python

复制代码

|---|--------------------------------------|
| | # 可调整股票代码和时间范围 |
| | SYMBOL = 'TSLA' # 改为其他股票代码如TSLA |
| | START_DATE = '2022-01-01' # 修改开始日期 |
| | FAST_MA = 10 # 调整快速均线周期 |

  1. 策略优化示例:

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中运行以获得更好的交互体验。

相关推荐
Blue.ztl1 小时前
菜鸟之路Day25一一前端工程化(二)
开发语言·前端·javascript
java1234_小锋2 小时前
说说你对Java里Integer缓存的理解?
java·开发语言
钢铁男儿2 小时前
Python 用户账户(让用户拥有自己的数据)
数据库·python·sqlite
FreakStudio3 小时前
一文速通Python并行计算:02 Python多线程编程-threading模块、线程的创建和查询与守护线程
python·嵌入式·多线程·并行计算·电子diy
xy_optics3 小时前
matlab的meshgrid
开发语言·matlab
冷琴19964 小时前
基于python+django的酒店预定网站-酒店管理系统源码+运行步骤+课程学习
python·django·旅游
蹦蹦跳跳真可爱5894 小时前
Python---数据分析(Pandas十一:二维数组DataFrame统计计算二)
python·数据分析·pandas
ice_junjun4 小时前
OpenCV Video 模块使用指南(Python 版)
人工智能·python·opencv
一问三不知_5 小时前
pyqt5报错:qt.qpa.plugin: Could not find the Qt platform plugin “xcb“(已解决)
开发语言·python·qt·ubuntu·conda·bug
赛卡5 小时前
自动驾驶背后的数学:ReLU,Sigmoid, Leaky ReLU, PReLU,Swish等激活函数解析
人工智能·pytorch·python·神经网络·机器学习·数学建模·自动驾驶