|
|
逻辑简单
✅ 不追求高频
✅ Python 能直接跑
✅ 可先模拟,再半自动,最后实盘
一、整体量化框架(先看全貌)
🧠 这套框架在做什么?
用趋势判断 + 风控,决定 ETF 什么时候买、什么时候空仓
📦 适合标的
沪深300ETF
创业板ETF
中证500ETF
👉 只做 ETF,不碰个股
📊 策略核心逻辑(一句话版)
当 ETF 价格在中期趋势之上 → 持有
当价格跌破趋势 → 清仓观望
不预测,只跟随。
二、策略规则(非常清晰)
1️⃣ 使用指标
20 日均线(短期)
60 日均线(中期)
2️⃣ 买入规则
20 日均线 > 60 日均线
并且
收盘价 > 60 日均线
👉 市场处在上升趋势
3️⃣ 卖出规则
收盘价 < 60 日均线
👉 趋势走坏,直接离场
4️⃣ 仓位规则(适合 5000 元)
最多只持有 1~2 只 ETF
单只 ETF 不超过 50% 仓位
不加杠杆、不融资
三、完整 Python 示例(可直接跑)
说明:
使用 yfinance 获取数据(学习/回测用)
实盘时换成量化平台数据即可
📌 安装依赖
pip install yfinance pandas matplotlib
聚宽完整代码:
# === 引入聚宽平台核心接口 ===
# jqdata 是 JoinQuant 提供的 API 集合
from jqdata import *
def initialize(context):
"""
initialize 函数:
- 只在策略启动时运行一次
- 用来做全局配置、参数初始化、调度任务
"""
# ===============================
# 一、基础环境设置
# ===============================
# 设置策略的对标基准
# 用沪深300ETF作为基准,方便对比策略收益
set_benchmark('510300.XSHG')
# 使用真实价格(而不是前复权/后复权)
# 实盘、ETF 策略必须开启
set_option('use_real_price', True)
# 设置日志级别
# 这里只保留错误日志,避免订单日志刷屏
log.set_level('order', 'error')
# ===============================
# 二、手续费设置(ETF)
# ===============================
"""
A股 ETF 的真实手续费很低
这里做一个近似设置,主要是为了回测更贴近实盘
"""
set_order_cost(
OrderCost(
open_tax=0, # 买入不收印花税
close_tax=0, # 卖出 ETF 也不收印花税
open_commission=0.0003, # 买入佣金:万 3
close_commission=0.0003, # 卖出佣金:万 3
min_commission=5 # 最低 5 元
),
type='stock' # ETF 在聚宽里按 stock 处理
)
# ===============================
# 三、策略参数定义
# ===============================
# 交易标的:沪深300 ETF
context.etf = '510300.XSHG'
# 短期均线参数(20 日)
context.ma_short = 20
# 中期均线参数(60 日)
context.ma_long = 60
# ===============================
# 四、调度交易函数
# ===============================
# 每个交易日运行一次 trade 函数
# 在收盘前运行(用当天完整数据)
run_daily(trade, time='close')
def trade(context):
"""
trade 函数:
- 每个交易日执行
- 负责生成交易信号并下单
"""
# ===============================
# 一、读取策略参数
# ===============================
etf = context.etf
# ===============================
# 二、获取历史行情数据
# ===============================
"""
attribute_history:
- 获取指定证券的历史数据
- 这里取 ma_long + 1 天,是为了保证均线计算足够
"""
prices = attribute_history(
etf, # 证券代码
context.ma_long + 1, # 取 61 天数据
'1d', # 日线数据
['close'], # 只需要收盘价
skip_paused=True # 跳过停牌日
)
# 取出收盘价序列
close = prices['close']
# 计算 20 日均线
ma20 = close[-context.ma_short:].mean()
# 计算 60 日均线
ma60 = close[-context.ma_long:].mean()
# 最新一个交易日的收盘价
current_price = close[-1]
# ===============================
# 三、读取当前持仓
# ===============================
"""
total_amount:
- 表示当前持有的 ETF 数量
- 如果为 0,表示空仓
"""
position = context.portfolio.positions[etf].total_amount
# ===============================
# 四、交易逻辑(核心)
# ===============================
# === 买入条件 ===
# 1. 短期均线在中期均线之上(趋势向上)
# 2. 当前价格在 60 日均线之上(价格不破趋势)
if ma20 > ma60 and current_price > ma60:
# 如果当前没有持仓
if position == 0:
# 使用全部资金买入 ETF
# order_target_value:调整到目标市值
order_target_value(
etf,
context.portfolio.total_value
)
# === 卖出条件 ===
# 只要价格跌破 60 日均线,就认为趋势结束
else:
if position > 0:
# 清空持仓
order_target(etf, 0)
四、这套策略为什么适合 5000 元?
✅ 1️⃣ 低交易频率
日频 / 周频
几个月才交易一次
手续费影响极小
✅ 2️⃣ 回撤可控
大跌会空仓
不死扛
✅ 3️⃣ 心理压力小
不盯盘
不追热点
✅ 4️⃣ 可逐步升级
你以后可以加:
多 ETF 轮动
动量排序
波动率控制
最大回撤止损
五、5000 元实盘执行方式(现实版)
🔹 新手最优解(强烈建议)
❌ 不要直接 API 自动下单
✅ 半自动执行
每周一次:
跑策略
看 signal(0 or 1)
手动买 / 卖 ETF
👉 已经是 80% 的量化效果
🔹 示例仓位
沪深300ETF:2500
创业板ETF:2000
现金:500 |
|