实现简单单品种回测

This commit is contained in:
2025-06-18 10:25:05 +08:00
commit ce5ad27bab
17 changed files with 2238 additions and 0 deletions

77
main.py Normal file
View File

@@ -0,0 +1,77 @@
# main.py
from src.analysis.result_analyzer import ResultAnalyzer
# 导入所有必要的模块
from src.data_manager import DataManager
from src.backtest_engine import BacktestEngine
from src.strategies.simple_limit_buy_strategy import SimpleLimitBuyStrategy
def main():
# --- 配置参数 ---
# 获取当前脚本所在目录,假设数据文件在项目根目录下的 data 文件夹内
data_file_path = '/mnt/d/PyProject/NewQuant/data/data/SHFE_rb2501/SHFE_rb2501_m60_20240901_20241201_min60.csv'
initial_capital = 100000.0
slippage_rate = 0.001 # 假设每笔交易0.1%的滑点
commission_rate = 0.0002 # 假设每笔交易0.02%的佣金
strategy_parameters = {
'symbol': "SHFE_rb2501", # 根据您的数据文件中的品种名称调整
'trade_volume': 1, # 每次交易1手/股
'limit_price_factor': 0.995, # 限价单价格为开盘价的99.5%
'max_position': 10 # 最大持仓10手/股
}
# --- 1. 初始化数据管理器 ---
print("初始化数据管理器...")
data_manager = DataManager(file_path=data_file_path)
# 确保 DataManager 能够重置以进行多次回测
# data_manager.reset() # 首次运行不需要重置
# --- 2. 初始化回测引擎并运行 ---
print("\n初始化回测引擎...")
engine = BacktestEngine(
data_manager=data_manager,
strategy_class=SimpleLimitBuyStrategy,
strategy_params=strategy_parameters,
initial_capital=initial_capital,
slippage_rate=slippage_rate,
commission_rate=commission_rate
)
print("\n开始运行回测...")
engine.run_backtest()
print("\n回测运行完毕。")
# --- 3. 获取回测结果 ---
results = engine.get_backtest_results()
portfolio_snapshots = results["portfolio_snapshots"]
trade_history = results["trade_history"]
initial_capital_result = results["initial_capital"]
# --- 4. 结果分析与可视化 ---
if portfolio_snapshots:
analyzer = ResultAnalyzer(portfolio_snapshots, trade_history, initial_capital_result)
analyzer.generate_report()
analyzer.plot_performance()
else:
print("\n没有生成投资组合快照,无法进行结果分析。")
# --- 4. 结果分析与可视化 (待实现) ---
# if portfolio_snapshots:
# analyzer = ResultAnalyzer(portfolio_snapshots, trade_history, initial_capital_result)
# metrics = analyzer.calculate_all_metrics()
# print("\n--- 绩效指标 ---")
# for key, value in metrics.items():
# print(f" {key}: {value:.4f}")
#
# print("\n--- 绘制绩效图表 ---")
# analyzer.plot_performance()
# else:
# print("\n没有生成投资组合快照无法进行结果分析。")
if __name__ == '__main__':
main()