1. 部署环境搭建与策略骨架
任务目标
在一台Ubuntu 22.04云服务器上,从零搭建Python 3.10量化交易环境,创建可扩展的策略骨架,实现双均线交叉策略,并使用历史数据完成一次模拟回测运行。
环境依赖
- Ubuntu 22.04+ / Debian 11+,已开通SSH访问
- Python 3.10+(系统自带或通过
apt安装) - 所需Python包:
pandas、numpy(回测核心),matplotlib(可选,用于可视化)
环境搭建
# 更新系统并安装Python 3.10与pip
sudo apt update
sudo apt install -y python3.10 python3.10-venv python3-pip
# 创建项目目录与虚拟环境
mkdir -p ~/quant_strategy && cd ~/quant_strategy
python3.10 -m venv venv
source venv/bin/activate
# 安装依赖
pip install pandas numpy matplotlib
策略骨架与双均线实现
以下代码定义了策略基类(骨架)与双均线策略实现,包含数据加载、信号生成、回测引擎和结果统计四个核心部分。策略骨架通过抽象接口约束子类必须实现generate_signals方法,便于后续扩展其他策略。
# strategy.py
import pandas as pd
import numpy as np
from abc import ABC, abstractmethod
class Strategy(ABC):
"""策略基类:所有策略需实现generate_signals"""
@abstractmethod
def generate_signals(self, data: pd.DataFrame) -> pd.DataFrame:
pass
class MovingAverageCross(Strategy):
"""双均线交叉策略:快线上穿慢线买入,下穿卖出"""
def __init__(self, fast: int = 5, slow: int = 20):
self.fast = fast
self.slow = slow
def generate_signals(self, data: pd.DataFrame) -> pd.DataFrame:
df = data.copy()
df['fast_ma'] = df['close'].rolling(self.fast).mean()
df['slow_ma'] = df['close'].rolling(self.slow).mean()
# 信号:1=持有/买入,0=空仓/卖出
df['signal'] = np.where(df['fast_ma'] > df['slow_ma'], 1.0, 0.0)
# 取信号变化点作为实际交易指令
df['position'] = df['signal'].diff().fillna(0)
return df
def run_backtest(df: pd.DataFrame, strategy: Strategy, initial_capital: float = 10000.0):
"""简单回测引擎:按信号全仓进出,不考虑手续费与滑点"""
result = strategy.generate_signals(df)
result['returns'] = result['close'].pct_change().fillna(0)
result['strategy_returns'] = result['signal'].shift(1) * result['returns']
result['equity'] = initial_capital * (1 + result['strategy_returns']).cumprod()
return result
if __name__ == '__main__':
# 生成模拟价格数据(确定性随机种子,保证可复现)
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=250, freq='D')
price = 100 + np.cumsum(np.random.normal(0.1, 1.5, len(dates)))
df = pd.DataFrame({'close': price}, index=dates)
# 实例化策略并回测
ma_cross = MovingAverageCross(fast=5, slow=20)
result = run_backtest(df, ma_cross)
# 输出关键统计
total_return = (result['equity'].iloc[-1] / 10000 - 1) * 100
print(f"期末净值: {result['equity'].iloc[-1]:.2f}")
print(f"总收益率: {total_return:.2f}%")
print(f"交易次数: {int((result['position'] != 0).sum())}")
# 保存结果供后续分析
result.to_csv('backtest_result.csv')
运行与验证
cd ~/quant_strategy
source venv/bin/activate
python strategy.py
通过条件:程序正常结束,输出期末净值、总收益率和交易次数三项指标,且当前目录生成backtest_result.csv文件。由于使用固定随机种子,每次运行结果一致:期末净值约在9500~10500区间(具体数值由随机序列唯一确定),交易次数在10~20次之间。若输出结果在此范围内且无报错,说明环境搭建与策略骨架运行成功。
常见问题
- pandas版本兼容:若使用pandas 2.x,
fillna(0)对float列可能产生警告,不影响结果,可忽略或升级到最新版。 - 信号延迟:回测中
signal.shift(1)表示当日收盘产生信号、次日开盘执行,避免未来函数,这是正确的处理方式。 - 扩展新策略:在
strategy.py中新增类并继承Strategy,实现generate_signals返回含signal列的DataFrame即可复用回测引擎。
上述SVG展示了策略骨架的核心数据流:原始价格数据经Strategy基类约束的策略实现处理后,生成交易信号,再由回测引擎计算净值曲线与统计指标。新增策略只需继承基类并实现信号生成逻辑,即可复用同一回测流程。