量化作弊器 v4.0 — 零依赖改造版
> 改造核心:数据源双模式(内置模拟+用户提供CSV)+ 输出降级(SVG/文本替代matplotlib)
> 版本:v4.0(零依赖改造版)
运行环境自检(改造后)
| 依赖 | 级别 | 缺失效果 |
|---|---|---|
| pandas | 核心 | ❌ 无法运行(Coze环境已预装) |
| numpy | 核心 | ❌ 无法运行(Coze环境已预装) |
| python-pptx | 可选 | 报告无PPT输出,降级Markdown |
| matplotlib | 可选 | 图表降级为SVG文本图或ASCII art |
| yfinance | 增值 | 使用内置模拟数据或用户CSV |
| akshare | 增值 | 同上 |
| tushare | 增值 | 同上(另需Token) |
| codeactsdk | 可选 | 纯Python模式运行 |
依赖分级说明
- 核心:缺失则完全无法运行(pandas/numpy在Coze环境100%可用)
- 可选:缺失则自动降级,功能不减但输出格式受限
- 增值:需额外配置API Key,提供真实数据,无则用模拟数据
数据源改造(核心变更)
改造前
用户 → yfinance API → 获取数据 → 回测 → matplotlib出图
↓ API限流/Key失效
❌ 无法使用
改造后
用户 → 数据源选择器
├── 模式A:内置模拟数据(GBM随机游走,零依赖)
├── 模式B:用户CSV上传(零依赖)
└── 模式C:yfinance/akshare API(需网络+可选Key)
→ 回测引擎 → 输出选择器
├── SVG图表(纯Python生成)
├── 文本报告(ASCII art + 表格)
└── matplotlib图表(如可用)
数据加载优先级
def load_data(ticker=None, csv_path=None, start=None, end=None):
"""数据加载三模式"""
# 优先级1:用户CSV
if csv_path and os.path.exists(csv_path):
return pd.read_csv(csv_path, parse_dates=['Date'])
# 优先级2:yfinance真实数据
if ticker:
try:
import yfinance as yf
data = yf.download(ticker, start=start, end=end)
if not data.empty:
return data
except Exception:
pass # 降级到模拟数据
# 优先级3:GBM模拟数据(零依赖)
return generate_gbm_data(ticker or "SIMULATED", start, end)
def generate_gbm_data(name, start, end, mu=0.0005, sigma=0.02, S0=100):
"""GBM随机游走模拟股票数据"""
import numpy as np
import pandas as pd
dates = pd.date_range(start=start or '2023-01-01', end=end or '2024-12-31')
np.random.seed(hash(name) % 2**32)
returns = np.random.normal(mu, sigma, len(dates))
prices = S0 * np.exp(np.cumsum(returns))
return pd.DataFrame({
'Date': dates, 'Open': prices*0.999, 'High': prices*1.01,
'Low': prices*0.99, 'Close': prices, 'Volume': np.random.randint(1000000, 10000000, len(dates))
}).set_index('Date')
输出降级策略
图表输出优先级
def render_chart(data, chart_type, title):
"""图表输出三模式"""
# 优先级1:matplotlib
try:
import matplotlib.pyplot as plt
# ... matplotlib 绘图
plt.savefig(output_path)
return output_path
except ImportError:
pass
# 优先级2:SVG(纯Python生成)
return generate_svg_chart(data, chart_type, title)
def generate_svg_chart(data, chart_type, title):
"""纯Python生成SVG图表(无外部依赖)"""
# 内嵌SVG生成逻辑
svg = f'<svg width="800" height="400" xmlns="http://www.w3.org/2000/svg">'
svg += f'<text x="400" y="30" text-anchor="middle" font-size="16">{title}</text>'
# ... SVG绘图代码
svg += '</svg>'
return svg
# 优先级3:文本报告
def render_text_chart(data, title):
"""ASCII art文本图表"""
# 简单的ASCII折线图
...
codeactsdk 降级
改造前
import codeactsdk
result = codeactsdk.execute(script)
改造后
try:
import codeactsdk
result = codeactsdk.execute(script)
except ImportError:
# 纯Python模式:直接执行
result = subprocess.run(['python3', script], capture_output=True, text=True)
交互优化(一步到位)
改造前
用户:回测双均线策略
Agent:请问你要回测哪只股票?
用户:AAPL
Agent:请问时间范围?
用户:2023年至今
Agent:正在获取数据... [等待yfinance] ... 获取失败,请配置API Key
改造后
用户:回测双均线策略
Agent:✅ 正在回测双均线策略(5日/20日均线交叉)...
📊 回测报告:双均线策略(模拟数据)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📈 总收益率:+23.5%
📉 最大回撤:-8.2%
📊 夏普比率:1.42
🎯 胜率:58.3%
📅 回测区间:2023-01-01 ~ 2024-12-31
💰 初始资金:100,000 → 终值:123,500
[SVG图表已生成]
💡 提示:
- 当前使用模拟数据。提供股票代码可获取真实数据回测
- 上传CSV文件可使用你自己的数据
- 说"切换策略"可尝试其他19种策略
新增文件
data/sample_data.csv
内置3只示例股票的3年模拟数据(AAPL/贵州茅台/TSLA),确保首次运行即可演示。
references/zero_dep_guide.md
零依赖使用指南,说明:
- 三种数据源模式
- 三种输出模式
- 如何切换到真实数据
- 如何配置可选依赖
改造前后对比总结
| 维度 | 改造前(v3.x) | 改造后(v4.0) |
|---|---|---|
| 首次体验 | 需配置API Key | 开箱即用(模拟数据) |
| 数据源 | yfinance必需 | 3种模式可选 |
| 图表输出 | matplotlib必需 | 3级降级(matplotlib→SVG→文本) |
| 运行环境 | codeactsdk必需 | 纯Python可运行 |
| 核心功能 | 不变 | ✅ 20种策略+回测+因子+组合+风险 |