A股量化策略回测实战:从行情数据到绩效评估(第 24 篇):资金、技术复合策略
前言
第 21–23 篇是资金视角(板块/北向/机构),第 5–10 篇是技术视角。单一维度都有盲区:资金流可能"拉高出货"、技术信号可能"无量假突破"。把它们投票融合——资金看多且技术看多才出手——用多源共识降低单维噪音。本篇做资金×技术的复合策略。
一、接口原始字段梳理
本篇是融合层,输入来自前文真实接口(零编造):
| 板块资金 | hizj/zjh | net5(5 日净流额) |
| 北向 | ht/nbzj/bxpm | jrcg(个股净买额) |
| 技术-均线 | hsstock/history/ma | ma5, ma20 |
| 技术-MACD | hsstock/history/macd | diff, dea |
复合器对每只标的,资金维给一票、技术维给一票,多数看多才买。
二、自研衍生统计指标
- 资金票 vote_fund = +1 if (net5>0 或 jrcg>0) else −1:有资金流入看多。
- 技术票 vote_tech = +1 if (ma5>ma20 且 diff>dea) else −1:均线多头 + MACD 金叉看多。
- 复合信号 = vote_fund + vote_tech:>= +2 买入、<= −2 卖出、否则持有。
- 两票独立来源、低相关,融合后噪音显著低于单维。
三、数据表设计
CREATE TABLE IF NOT EXISTS fundtech_signal (
stock TEXT NOT NULL,
t TEXT NOT NULL,
vote_fund INTEGER,
vote_tech INTEGER,
sig TEXT, — BUY/SELL/HOLD
PRIMARY KEY (stock, t)
);
四、完整代码
4.1 资金 × 技术 双票融合
import sqlite3, json, time
BASE = "https://api.biyingapi.com"
LICENCE = "YOUR_LICENCE_HERE"
DB_PATH = "backtest.db"
def biying_api_get_retry(url, timeout=15, max_retry=3):
import urllib.request
last = None
for i in range(max_retry):
try:
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
with urllib.request.urlopen(req, timeout=timeout) as r:
return json.loads(r.read().decode('utf-8', 'ignore'))
except Exception as e:
last = e
if i < max_retry – 1:
time.sleep(1 + i)
raise last
def fetch_one(stock, api, start, end, adj='f', level='d', lt=1200):
url = (f"{BASE}/hsstock/history/{api}/{stock}/{level}/{adj}/{LICENCE}"
f"?st={start}&et={end}<={lt}")
data = biying_api_get_retry(url)
bars = data if isinstance(data, list) else data.get('data', [])
return sorted(bars, key=lambda b: b['t'])
def fundtech_vote(bar_ma, bar_macd, net5=None, jrcg=None):
"""资金票 + 技术票 融合(纯计算)。"""
vote_fund = 0
if (net5 is not None and net5 > 0) or (jrcg is not None and jrcg > 0):
vote_fund = 1
elif (net5 is not None and net5 < 0) or (jrcg is not None and jrcg < 0):
vote_fund = –1
vote_tech = 0
if bar_ma.get('ma5') and bar_ma.get('ma20'):
vote_tech += 1 if float(bar_ma['ma5']) > float(bar_ma['ma20']) else –1
if bar_macd.get('diff') and bar_macd.get('dea'):
vote_tech += 1 if float(bar_macd['diff']) > float(bar_macd['dea']) else –1
total = vote_fund + vote_tech
sig = 'BUY' if total >= 2 else ('SELL' if total <= –2 else 'HOLD')
return vote_fund, vote_tech, sig
def demo_ft():
ma = {'ma5': 10.5, 'ma20': 9.8}
macd = {'diff': 0.2, 'dea': 0.1}
print("资金+技术票:", fundtech_vote(ma, macd, net5=30.0, jrcg=5.0))
if __name__ == '__main__':
demo_ft()
五、关键业务说明
- 低相关源融合才降噪:资金(博弈维度)与技术(价格维度)信息来源不同,共识比单维可靠;若两源本质同源(如均来自价格),融合增益有限。
- 权重可不对称:资金票可给更高权重(机构/北向更"聪明"),或技术票更灵敏;权重是过拟合源(第 29 篇)。
- 仍是事件级信号:复合后信号仍需"下一根开盘"成交(第 3 篇对齐),避免前视。
- 与第 10 篇区别:第 10 篇融的是多个技术指标(同源),本篇融的是"资金+技术"跨维度,降噪更实质。
- 可作组合底层:复合信号作为第 25–28 篇组合的选股输入。
六、拓展练习
下篇预告
系列第 25 篇:等权、市值加权组合策略 —— 单标的策略讲完,下一篇进入组合层:把多个信号标的按等权或市值加权构建组合,看分散化如何降波动、稳收益。
免责申明:本篇全部代码与回测结果仅作为量化编程与策略研究的学习演示,所有回测均为方法演示,不构成任何投资建议。市场有风险,投资需谨慎。
网硕互联帮助中心





评论前必须登录!
注册