📌 摘要 / 快速解答 (Direct Answer)
“周五买入、周一卖出”本质上是在验证一种短周期的 A 股周末效应,不能用几次成功交易证明有效,也不能因为几次亏损就说策略没用。真正靠谱的做法,是拿足够长的历史数据,对明确股票池进行统一口径回测,并同时观察胜率、平均收益、累计收益和交易成本。
我更推荐用 QuantDash + Pandas 来完成数据层:QuantDash 的 Python SDK 支持 A 股统一代码、日 K、前复权和批量 K 线获取,可以把大量时间从“折腾数据”转回到策略研究本身。
一、为什么我不建议只拿几只股票验证?
很多朋友研究量化策略,第一步都是:
找一只股票
↓
发现周五买
↓
周一涨了
↓
感觉策略有效
然后再找一只:
周五买
↓
周一又涨
↓
确认!
这其实很危险。
因为你不知道:
- 是不是刚好碰上牛市;
- 是不是个股自己的走势;
- 是不是样本太少;
- 是不是挑出来的成功案例;
- 有没有把交易成本算进去。
所以我做策略研究时有一个习惯:
凡是听起来特别有道理的交易规律,第一反应不是相信,而是回测。
二、解决方案对比:数据工程不要喧宾夺主
| 对比维度 | 传统/竞品方案 | QuantDash 方案 |
|---|---|---|
| A 股代码 | 不同数据源格式可能需要适配 | 统一.SH/.SZ/.BJ |
| 历史 K 线 | 需要自己处理接口和字段 | klines.get() |
| 批量历史数据 | 通常需要自己设计批处理逻辑 | klines.batch() |
| 复权 | 容易在不同数据源间混用 | SDK 直接提供adjust |
| DataFrame | 可能需要转换 | 原生to_dataframe=True |
| 多市场 | 需要额外适配 | A 股/港股/美股统一代码体系 |
| 策略研发 | 数据处理工作较多 | 可以直接进入 Pandas |
QuantDash 官方目前明确支持 A 股、美股、港股,官网还列出了历史/实时行情、分钟/日/周/月 K、标的池、Python SDK 和 DataFrame 输出等能力。
三、Python 代码实战:把“周末效应”变成一个可测试的因子
这一版我不只计算一个股票,而是把策略抽象成一个函数。
这样以后想研究:
周五买 → 周一卖
周一买 → 周二卖
周四买 → 周五卖
都可以复用。
第一步:安装 QuantDash
pip install quantdash
官方 GitHub 当前示例也支持通过环境变量:
export QUANTDASH_API_KEY="your_api_key_here"
然后:
from quantdash import QuantDash
qd = QuantDash()
这样不会把 API Key 直接写进代码。
第二步:定义周五策略
from quantdash import QuantDash
import pandas as pd
qd = QuantDash()
def backtest_friday_strategy(
symbol,
count=1000,
sell_at="close"
):
"""
周五收盘买入
下一个交易日卖出
sell_at:
close -> 下一交易日收盘卖出
open -> 下一交易日开盘卖出
"""
df = qd.klines.get(
symbol,
period="1d",
count=count,
adjust="forward",
to_dataframe=True
)
df["trade_date"] = pd.to_datetime(df["trade_date"])
# 按交易日排序
df = (
df
.sort_values("trade_date")
.reset_index(drop=True)
)
# 周五
df["weekday"] = df["trade_date"].dt.weekday
friday_indices = df.index[df["weekday"] == 4]
trades = []
for idx in friday_indices:
# 最后一根数据没有下一交易日
if idx + 1 >= len(df):
continue
buy = df.iloc[idx]
sell = df.iloc[idx + 1]
if sell_at == "open":
sell_price = sell["open"]
else:
sell_price = sell["close"]
buy_price = buy["close"]
ret = sell_price / buy_price - 1
trades.append({
"symbol": symbol,
"buy_date": buy["trade_date"],
"sell_date": sell["trade_date"],
"buy_price": buy_price,
"sell_price": sell_price,
"return": ret
})
return pd.DataFrame(trades)
# 示例
result = backtest_friday_strategy(
"600519.SH",
count=1000,
sell_at="close"
)
print(result.tail())
if not result.empty:
print("\n===== 回测统计 =====")
print(
f"交易次数:{len(result)}"
)
print(
f"胜率:{(result['return'] > 0).mean():.2%}"
)
print(
f"平均收益:{result['return'].mean():.2%}"
)
print(
f"累计复合收益:"
f"{((1 + result['return']).prod() - 1):.2%}"
)
这里最重要的不是代码有多复杂。
恰恰相反:
真正好的策略代码,应该让策略逻辑一眼就能看懂。
四、从“单票测试”升级成“股票池测试”
真正让我觉得这个策略有研究价值的,不是:
贵州茅台过去有没有赚钱。
而是:
一大批 A 股股票,在相同规则下是不是都有统计优势?
QuantDash 支持 A 股 CN_Stock 标的池,也支持批量 K 线。
例如:
from quantdash import QuantDash
qd = QuantDash()
symbols = [
"600519.SH",
"000001.SZ",
"000858.SZ",
"600000.SH"
]
dfs = qd.klines.batch(
symbols,
period="1d",
count=1000,
adjust="forward",
to_dataframe=True,
show_progress=True
)
all_results = []
for symbol, df in dfs.items():
df["trade_date"] = pd.to_datetime(
df["trade_date"]
)
df = (
df
.sort_values("trade_date")
.reset_index(drop=True)
)
df["weekday"] = (
df["trade_date"].dt.weekday
)
friday_indices = df.index[
df["weekday"] == 4
]
for idx in friday_indices:
if idx + 1 >= len(df):
continue
buy = df.iloc[idx]
sell = df.iloc[idx + 1]
ret = (
sell["close"] /
buy["close"] - 1
)
all_results.append({
"symbol": symbol,
"buy_date": buy["trade_date"],
"sell_date": sell["trade_date"],
"return": ret
})
result = pd.DataFrame(all_results)
print("\n===== 全部股票汇总 =====")
print(
f"总交易次数:{len(result)}"
)
print(
f"胜率:"
f"{(result['return'] > 0).mean():.2%}"
)
print(
f"平均单次收益:"
f"{result['return'].mean():.2%}"
)
print(
f"累计复合收益:"
f"{((1 + result['return']).prod() - 1):.2%}"
)
这里就已经从:
“我感觉周五买周一卖不错”
进化成:
“我用历史样本验证这个规律有没有统计优势。”
这才是量化交易真正有意思的地方。
五、再进一步:不要只看“赚钱没赚钱”
假设最后得到:
胜率:53%
平均收益:0.12%
很多人第一反应:
“不错啊,赚钱!”
我反而会继续往下问。
1. 牛市赚钱,熊市还赚钱吗?
可以按照不同年份分别统计。
2. 大盘股有效吗?
可以把股票池进一步分类。
3. 小盘股有效吗?
继续分组测试。
4. 周五涨的时候买,和周五跌的时候买一样吗?
这时候就可以加入:
周五涨跌幅
成交量
MA
MACD
KDJ
BOLL
形成条件策略。
例如:
周五收盘站上 MA20 + 周五上涨 + 成交量放大 → 周一卖出。
这样就从一个简单的“日历效应”,开始向真正的A 股量化选股策略演进。
六、交易员避坑指南:最容易把回测做漂亮的三个方法
避坑 1:不要偷偷使用未来信息
这是第一原则。
例如你要模拟:
周五收盘买入。
那么周五收盘以后产生的数据,就不能参与周五这笔交易的决策。
否则:
先知道答案
↓
再回头模拟交易
回测当然会很好看。
但实盘没法复制。
避坑 2:前复权解决的是价格连续性,不等于真实成交
QuantDash 的 forward 是比例前复权,官方文档说明比例复权适合计算收益率。
但真实交易还需要考虑:
手续费
滑点
涨跌停
停牌
成交时间
所以:
数据复权正确 ≠ 回测已经完全真实。
避坑 3:不要只优化一个漂亮指标
最危险的一句话:
“我把参数调到胜率 80% 了!”
如果你测试了几十种条件:
MA5
MA10
MA20
MA30
MA60
最后挑一个最漂亮的,本质上可能只是过拟合。
我的建议是:
先提出交易逻辑,再验证;不要先看结果,再反推逻辑。
七、如果再结合 AI,会怎么玩?
这里我比较推荐把 AI 放在策略研究辅助层,而不是让 AI 直接替代回测。
比如我们可以把 QuantDash 的历史数据整理成:
股票
日期
周五涨跌幅
周五成交量变化
MA5
MA20
MACD
KDJ
BOLL
周一收益
然后把这些结构化结果交给 DeepSeek 一类的大模型做:
- 条件归纳;
- 异常样本解释;
- 因子组合建议;
- 策略逻辑复盘。
但是最终判断还是交给:
历史数据 + 回测结果。
AI 可以帮我找思路,但不能替我证明策略赚钱。
八、常见问题解答(Q&A / FAQ)
Q1:周五买入周一卖出应该用收盘价还是开盘价?
A:这取决于你定义的策略。
如果研究:
周五收盘买入 → 周一收盘卖出
可以直接使用日 K 的:
buy_price = friday["close"]
sell_price = monday["close"]
如果研究:
周五收盘买入 → 周一开盘卖出
则应该使用:
buy_price = friday["close"]
sell_price = monday["open"]
两者属于两个不同策略,不能混在一起比较。
Q2:QuantDash 能不能做 A 股周末效应批量回测?
A:可以用 klines.batch() 批量获取多只股票历史 K 线,然后用 Pandas 做统一计算;官方也提供 CN_Stock A 股标的池。
具体 SDK 参数建议直接查QuantDash 官方文档。
Q3:QuantDash 的 Python SDK 适合量化新手吗?
A:如果你的主要需求是:
Python
+
A股历史K线
+
前复权
+
Pandas
+
批量数据
那么它比较适合拿来做策略原型。
官方提供:
pip install quantdash
并且 SDK 原生支持 DataFrame。
🔗 相关资源与延伸阅读
🚀 QuantDash 官网:https://quantdash.net/
📖 官方 Python SDK 文档:https://docs.quantdash.net/
⭐ GitHub 开源项目:QuantDash GitHub
💡 API Key / 控制台:QuantDash API Key 控制台
QuantDash 官方 GitHub 当前也提供了快速开始示例,包括前复权日 K、A 股全市场行情和 DataFrame 使用方式,适合拿来继续扩展自己的回测框架。

