乐于分享
好东西不私藏

别写代码了!我用 ChatGPT,10 分钟搓出一个能赚钱的量化策略(附完整 Python )

别写代码了!我用 ChatGPT,10 分钟搓出一个能赚钱的量化策略(附完整 Python )

一、量化真的很难吗?

很多人一听“量化交易”,第一反应就是:门槛太高。
要学 Python、要懂金融、还要会建模,一堆东西叠在一起,直接劝退。
但更真实的情况是:
大多数人不是学不会,而是卡在第一步——连一个能跑的策略都没有。
那有没有“捷径”?
有,而且现在已经很成熟了:

👉 用 AI,把第一步直接跳过去。

今天这篇文章,我只做一件事:
带你在 10 分钟内,做出人生第一个量化策略(A 股版)。

二、准备工作(从 0 到能跑)

这一节不讲复杂环境配置,只解决一个问题:

👉 让你的策略真的能跑起来


1)初始化项目(用 uv,一步到位)

先安装 uv:
pip install uv
初始化项目:
uv init quantcd quant
安装依赖:
uv add pandas backtrader matplotlib tushare python-dotenv

2)配置数据源(Tushare)

去 Tushare 官网注册账号,拿到 token。
建议用 .env 管理(更安全):
TUSHARE_TOKEN=你的token
测试数据是否正常:
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”

直接给你一个可以复制的提示词:
请扮演一个量化研究员,帮我写一个 Python 的股票量化交易策略,
使用双均线策略(金叉买入,死叉卖出),
使用 backtrader 框架,
数据源使用 tushare(A股),
并展示回测结果(包含资金曲线)。
你会得到什么?
  • 策略逻辑
  • 回测框架
  • 数据接入
  • 你要做的不是写代码,而是:

👉 把需求讲清楚


四、我实际做了什么?

我没有去“改策略”,只做了两件事:
把数据格式调通
让代码能稳定运行
也就是说:

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.0    commission: float = 0.001    pfast: int = 10    pslow: int = 30    plot: 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 = False    def 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_cash    equity_curve["return_rate"] = equity_curve["profit"] / config.initial_cash    fig, ax_return = plt.subplots(figsize=(126))    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()

六、结果怎么看?

你会得到一条完整的收益曲线。
这个策略本质是:
均线上穿 → 买
均线下穿 → 卖
它不是为了“每次都赚钱”,而是:

👉 在趋势出现时抓住它

七、结尾

这就是 AI 带来的变化。
不是让你变成程序员,
而是让你不用成为程序员,也能做量化
但更重要的是:

你已经从“不会做”,走到了“可以开始研究”。


下一篇我会写:

👉 如何优化策略达到年化30%以上的收益

关注我,回复[均线]获取详细源码