import yfinance as yf
import pandas as pd

# 下载股票数据
stock_data = yf.download("AAPL", start="2010-01-01", end="2021-06-11")

# 计算移动平均线
stock_data["SMA10"] = stock_data["Close"].rolling(window=10).mean()
stock_data["SMA50"] = stock_data["Close"].rolling(window=50).mean()

# 计算交易信号和持仓
stock_data["Signal"] = 0.0
stock_data["Signal"][10:] = np.where(stock_data["SMA10"][10:] > stock_data["SMA50"][10:], 1.0, 0.0)
stock_data["Position"] = stock_data["Signal"].diff()

# 回测策略
initial_capital = float(1000000.0)
positions = pd.DataFrame(index=stock_data.index).fillna(0.0)
portfolio = pd.DataFrame(index=stock_data.index).fillna(0.0)
portfolio["AAPL"] = 1000 * stock_data["Close"]
pos_diff = 1000 * stock_data["Position"]
positions["AAPL"] = pos_diff
portfolio["holdings"] = (positions.multiply(stock_data["Close"], axis=0)).sum(axis=1)
portfolio["cash"] = initial_capital - (pos_diff.multiply(stock_data["Close"], axis=0)).sum(axis=1).cumsum()
portfolio["total"] = portfolio["cash"] + portfolio["holdings"]
portfolio["returns"] = portfolio["total"].pct_change()

# 打印交易结果
print(portfolio.tail())

该代码使用 yfinance 库下载 AAPL 股票的历史数据,然后计算出短期和长期移动平均线,根据这些数据生成交易信号和持仓,并回测策略。具体实现过程如下:

  1. 首先,使用 yfinance 库下载 AAPL 股票的历史数据。

  2. 然后,计算出短期和长期移动平均线。

  3. 接着,根据短期和长期移动平均线生成交易信号和持仓。如果短期移动平均线大于长期移动平均线,则买入股票,否则卖出股票。

  4. 然后,根据持仓和股价计算投资组合中股票的持仓量、现金和总价值,并计算收益率。

  5. 最后,打印出交易结果。

该代码实现了一个简单的量化交易策略,可以根据不同的股票和交易信号进行修改和扩展。但需要注意,这只是一个简单的示例,实际的量化交易策略需要更复杂的模型和更精细的参数调整。
然后我们开始对以上代码进行优化封装的 Python 代码实现:

import yfinance as yf
import pandas as pd
import numpy as np

def backtest_stock_strategy(ticker, short_window, long_window, initial_capital):
    # 下载股票数据
    stock_data = yf.download(ticker, start="2010-01-01", end="2021-06-11")

    # 计算移动平均线
    stock_data["SMA10"] = stock_data["Close"].rolling(window=short_window).mean()
    stock_data["SMA50"] = stock_data["Close"].rolling(window=long_window).mean()

    # 计算交易信号和持仓
    stock_data["Signal"] = 0.0
    stock_data["Signal"][short_window:] = np.where(stock_data["SMA10"][short_window:] > stock_data["SMA50"][short_window:], 1.0, 0.0)
    stock_data["Position"] = stock_data["Signal"].diff()

    # 回测策略
    positions = pd.DataFrame(index=stock_data.index).fillna(0.0)
    portfolio = pd.DataFrame(index=stock_data.index).fillna(0.0)
    portfolio[ticker] = initial_capital / stock_data["Close"][0] * stock_data["Close"]
    pos_diff = initial_capital * stock_data["Position"]
    positions[ticker] = pos_diff
    portfolio["holdings"] = (positions.multiply(stock_data["Close"], axis=0)).sum(axis=1)
    portfolio["cash"] = initial_capital - (pos_diff.multiply(stock_data["Close"], axis=0)).sum(axis=1).cumsum()
    portfolio["total"] = portfolio["cash"] + portfolio["holdings"]
    portfolio["returns"] = portfolio["total"].pct_change()

    # 打印交易结果
    print(portfolio.tail())

该代码将之前的量化交易策略封装成了一个函数 backtest_stock_strategy,该函数接受四个参数,分别为股票代码、短期移动平均线窗口、长期移动平均线窗口和初始资本。具体实现过程如下:

  1. 首先,我们导入了yfinance,pandas和numpy库,以便使用它们的功能。

  2. 然后,我们定义了一个函数,用于回测股票策略。该函数接受股票代码,短期窗口,长期窗口和初始资本作为参数。

  3. 接下来,我们使用yfinance下载股票数据,并计算移动平均线。

  4. 然后,我们计算交易信号和持仓,并将其存储在股票数据中。

  5. 接下来,我们开始回测策略,计算投资组合的持仓,现金,总资产和收益率。

  6. 最后,我们打印了交易结果。

该代码实现了一个简单的量化交易策略,并将其封装成了一个函数,可以方便地对不同的股票和参数进行测试和调整。但需要注意,这只是一个简单的示例,实际的量化交易策略需要更复杂的模型和更精细的参数调整。

06-17 04:32