Python技术迷

推荐一个适合小白上手的Python量化框架!

一上来就写策略,结果连数据列都喂不对,这种量化入门我见过太多次。

回测框架不是越“金融味”越好,小白第一步也别急着谈因子、Alpha、夏普、回撤那一套。先把三件事跑通:数据怎么进来,策略怎么触发,回测结果怎么看。

这地方我比较推荐 AKQuant。

Image

它不是那种纯 Python 慢慢循环 K 线的老框架。AKQuant 官方定位是 Rust + Python 的高性能量化研究框架,底层把事件循环、计算、撮合这类重活交给 Rust,上层仍然用 Python 写策略。这个取舍对小白挺友好:你不用一上来学 Rust,但也不用太早被 Python 回测速度劝退。官方快速开始里也给了 pip install akquant 和 run_backtest 这种入口,门槛不算高。

先别急着接实盘。

我一般建议小白就拿它干一件事:把一个很土的策略,从数据清洗到回测结果完整跑一遍。能跑通这个,再谈优化。不然上来就搞机器学习选股,最后十有八九卡在字段名、日期格式、复权数据这些破事上。

安装可以这样来:

python -m pip install akquant akshare pandas

AKQuant 项目当前声明支持 Python 3.10 及以上,依赖里也能看到 pandas、numpy、pyarrow、polars 这些数据处理组件,所以别拿太老的 Python 环境折腾,环境问题最烦。

下面这段代码,我故意不写复杂。策略就一个:短均线上穿长均线买入,跌破就清仓。它不高级,也别指望靠这个赚钱,但很适合拿来摸清 AKQuant 的使用手感。

import pandas as pd
import akshare as ak
from akquant import Strategy, run_backtest

defload_daily_bar(symbol: str, start: str, end: str) -> pd.DataFrame:
    raw = ak.stock_zh_a_daily(
        symbol=symbol,
        start_date=start,
        end_date=end,
        adjust="qfq"
    )

    df = raw.rename(columns={
"date": "date",
"open": "open",
"high": "high",
"low": "low",
"close": "close",
"volume": "volume",
    }).copy()

    df["date"] = pd.to_datetime(df["date"])
    df["symbol"] = symbol
    df = df.sort_values("date")

for col in ["open", "high", "low", "close", "volume"]:
        df[col] = pd.to_numeric(df[col], errors="coerce")

    df = df.dropna(subset=["open", "high", "low", "close"])
return df[["date", "symbol", "open", "high", "low", "close", "volume"]]

classLazyMaStrategy(Strategy):
def__init__(self):
        self.close_cache = {}

defon_bar(self, bar):
        prices = self.close_cache.setdefault(bar.symbol, [])
        prices.append(float(bar.close))

if len(prices) < 20:
return

        ma5 = sum(prices[-5:]) / 5
        ma20 = sum(prices[-20:]) / 20
        pos = self.get_position(bar.symbol)

if pos == 0and ma5 > ma20:
            self.buy(bar.symbol, 100)

if pos > 0and ma5 < ma20:
            self.close_position(bar.symbol)

if __name__ == "__main__":
    bars = load_daily_bar("sh600000", "20240101", "20241231")

if bars.empty:
raise RuntimeError("没有拿到行情数据,先检查股票代码、日期范围或者数据源。")

    result = run_backtest(
        data=bars,
        strategy=LazyMaStrategy,
        symbols="sh600000",
        initial_cash=100000.0,
        commission_rate=0.0003
    )

    print(result)

这段代码里有几个地方别跳过。

第一,数据列名要老老实实整理成 date、symbol、open、high、low、close、volume。很多小白跑不起来,不是策略错了,是数据进框架前就脏了。日期是字符串、成交量里混了空值、数据没排序,这些问题回测框架不会替你背锅。

第二,策略里别一上来写一堆指标。我这里直接在 on_bar 里维护一个 close_cache,土是土了点,但好查。你真遇到信号不对,直接打印最近 20 根收盘价就能看出来,不用在一坨向量化代码里猜。

第三,buy 和 close_position 先用最简单的。新手阶段最怕的是订单类型搞太复杂,策略还没验证,止盈止损、滑点、仓位管理全塞进来,最后亏在哪都不知道。

AKQuant 适合小白的点,不是它能把量化变简单。量化本身不简单。

它真正舒服的地方是:Python 这边写起来像正常策略代码,底层又不是完全靠 Python 硬跑。官方文档里也提到它支持快速回测、报告输出、合约元数据访问、复杂订单等能力,后面想继续深入,不至于刚入门就换框架。

但我也得泼点冷水。

小白别把 AKQuant 当“赚钱框架”。它只是帮你更快验证想法。历史回测跑得再好,也不代表实盘能活。手续费、滑点、停牌、涨跌停、成交量不足,这些东西才是真正磨人的地方。

我自己的建议是,刚开始就按这个顺序来:

先跑通单股票日线回测。

再加手续费。

再看最大回撤。

再换几只股票测。

最后再考虑多标的、多因子、机器学习。

顺序别反。

框架选 AKQuant 没问题,尤其是已经会一点 Python、想拿 AKShare 这类数据源练手的人。别贪多,先写一个能跑、能查、能复盘的小策略,比收藏十个量化框架靠谱多了。