别写代码了!我用 ChatGPT,10 分钟搓出一个能赚钱的量化策略(附完整 Python )
一、量化真的很难吗?
👉 用 AI,把第一步直接跳过去。
二、准备工作(从 0 到能跑)
👉 让你的策略真的能跑起来
1)初始化项目(用 uv,一步到位)
pip install uv
uv init quantcd quant
uv add pandas backtrader matplotlib tushare python-dotenv
2)配置数据源(Tushare)
import tushare as tsimport osts.set_token(os.getenv("TUSHARE_TOKEN"))pro = ts.pro_api()df = pro.daily(ts_code='300033.SZ',start_date='20240101',end_date='20250101')print(df.head())
3)关键一步:让数据能进回测系统
df = df.rename(columns={"trade_date": "datetime","vol": "volume"})df["datetime"] = pd.to_datetime(df["datetime"])df.set_index("datetime", inplace=True)df = df.sort_index()
三、核心:如何“正确地问 AI”
-
策略逻辑 -
回测框架 -
数据接入 -
你要做的不是写代码,而是:
👉 把需求讲清楚
四、我实际做了什么?
AI 已经帮你完成了 90%,剩下 10% 是“工程化”
五、完整可运行代码(A 股实战版)
from __future__ import annotationsfrom dataclasses import dataclassimport osimport backtrader as btimport matplotlib.pyplot as pltimport pandas as pdfrom dotenv import load_dotenvimport tushare as tsload_dotenv()def configure_matplotlib_font() -> None:plt.rcParams["font.sans-serif"] = ["Microsoft YaHei","SimHei","PingFang SC","Heiti SC","Arial Unicode MS","Noto Sans CJK SC","WenQuanYi Micro Hei","DejaVu Sans",]plt.rcParams["axes.unicode_minus"] = False@dataclass(frozen=True)class BacktestConfig:ts_code: str = "300033.SZ"start_date: str = "20240101"end_date: str = "20250101"initial_cash: float = 10_000.0commission: float = 0.001pfast: int = 10pslow: int = 30plot: bool = Trueclass SmaCross(bt.Strategy):params = (("pfast", 10), ("pslow", 30))def __init__(self) -> None:self.equity_curve = []sma_fast = bt.ind.SMA(period=self.p.pfast)sma_slow = bt.ind.SMA(period=self.p.pslow)self.crossover = bt.ind.CrossOver(sma_fast, sma_slow)self.crossover.plotinfo.plot = Falsedef prenext(self) -> None:self._record_equity()def nextstart(self) -> None:self.next()def next(self) -> None:self._record_equity()if not self.position and self.crossover > 0:self.buy()elif self.position and self.crossover < 0:self.close()def _record_equity(self) -> None:self.equity_curve.append({"date": self.datas[0].datetime.date(0),"value": self.broker.getvalue(),})def fetch_daily_data(config: BacktestConfig) -> pd.DataFrame:token = os.getenv("TUSHARE_TOKEN")if not token:raise RuntimeError("Missing Tushare token.")ts.set_token(token)pro = ts.pro_api()return pro.daily(ts_code=config.ts_code,start_date=config.start_date,end_date=config.end_date,)def prepare_daily_data(raw_data: pd.DataFrame) -> pd.DataFrame:data = raw_data.rename(columns={"trade_date": "datetime", "vol": "volume"}).copy()data["datetime"] = pd.to_datetime(data["datetime"])data.set_index("datetime", inplace=True)data.sort_index(inplace=True)return data[["open", "high", "low", "close", "volume"]]def plot_return_curve(equity_curve: pd.DataFrame, config: BacktestConfig) -> None:configure_matplotlib_font()equity_curve = equity_curve.copy()equity_curve["profit"] = equity_curve["value"] - config.initial_cashequity_curve["return_rate"] = equity_curve["profit"] / config.initial_cashfig, ax_return = plt.subplots(figsize=(12, 6))ax_profit = ax_return.twinx()ax_return.plot(equity_curve["date"],equity_curve["return_rate"] * 100,linewidth=2,label="收益率",)ax_profit.plot(equity_curve["date"],equity_curve["profit"],linewidth=2,label="收益金额",)ax_return.axhline(0, linestyle="--", label="盈亏平衡线")ax_return.set_xlabel("日期")ax_return.set_ylabel("收益率(%)")ax_profit.set_ylabel("收益金额(元)")ax_return.grid(True, linestyle="--", alpha=0.35)lines = ax_return.get_lines() + ax_profit.get_lines()labels = [line.get_label() for line in lines]ax_return.legend(lines, labels, loc="best")ax_return.set_title(f"{config.ts_code} 回测收益曲线")fig.autofmt_xdate()fig.tight_layout()plt.show()def run_backtest(data: pd.DataFrame, config: BacktestConfig):cerebro = bt.Cerebro(stdstats=False)cerebro.adddata(bt.feeds.PandasData(dataname=data))cerebro.addstrategy(SmaCross, pfast=config.pfast, pslow=config.pslow)cerebro.broker.setcash(config.initial_cash)cerebro.broker.setcommission(commission=config.commission)start_value = cerebro.broker.getvalue()results = cerebro.run()final_value = cerebro.broker.getvalue()if config.plot:equity_curve = pd.DataFrame(results[0].equity_curve)plot_return_curve(equity_curve, config)return start_value, final_valuedef main():config = BacktestConfig()raw_data = fetch_daily_data(config)data = prepare_daily_data(raw_data)start, end = run_backtest(data, config)print(f"Initial: {start:.2f}")print(f"Final: {end:.2f}")if __name__ == "__main__":main()
六、结果怎么看?

👉 在趋势出现时抓住它
七、结尾
你已经从“不会做”,走到了“可以开始研究”。
👉 如何优化策略达到年化30%以上的收益
夜雨聆风