101-简单动量策略
由jliang创建,最终由qxiao 被浏览 1250 用户
策略介绍
动量策略是一种利用历史价格趋势来预测未来价格行为的量化交易策略。这种策略基于一个假设:股票或其他资产的未来价格趋势可能会延续其近期的表现。在实际应用中,动量策略通常会购买表现好的资产并卖出表现差的资产。
策略思想
动量策略的核心是“追涨避跌”。具体来说,这种策略会:
- 选择时间窗口:确定回顾期(过去 40 个交易日)来计算资产的回报率。
- 计算动量:一般是通过资产的收盘价来计算这个时间窗口内的回报率。
- 排名资产:根据计算出的回报率对所有考虑的资产进行排名。
- 构建投资组合:选择表现最好的一部分资产进行买入(排名前 10,等仓位分配)
策略代码
策略代码,可以克隆策略进入 AIStudio 运行和调优。
https://bigquant.com/codesharev3/2ebfa569-3a43-498e-b60d-d4fae893b973
策略实现
数据查询
- 模块:输入特征 (DAI SQL)
- 输入模式:支持 表达式 和 SQL 两种,这里使用的
表达式
模式表达式
: 通过公式输入查询和计算数据,过滤数据等SQL
: 通过 SQL 可实现任何数据操作
- 表达式特征
c_rank(-close / m_lag(close, 40)) AS rank_returns
close / m_lag(close, 40)
计算过去四十日收益,m_lag(close, 40)
用于获取四十日前的收盘价c_rank(-close / m_lag(close, 40))
对收益排序,返回 1 / 2 / 3 ..,注意m_lag前面的负号,从大到小排序AS rank_returns
命名计算出来的数据列为 rank_returns
date
和instrument
列,表示日期和股票代码
- 表达式过滤条件
rank_returns <= 10
排名前 10 的股票st_status = 0
st状态,为 0 表示正常,1和2位ST和*ST,见 股票状态。这里能直接用是因为这个已经加入了 cn_stock_factors。
- 默认数据表:cn_stock_factors,见 预计算因子表文档。对于在上面输入里没有指定表名的字段,可以来自这些表。 会自动join这些表,也可以指定join主键,比如 cn_stock_status USING(date, instrument)。更灵活的JOIN,建议使用 SQL 模式。
- 表达式-其他字段:其他需要包含的字段, 会与expr合并起来, 非特征字段一般放在这里, 多个字段用英文逗号分隔。一般是
date,instrument
- 排序字段:结果排序字段,e.g.
date ASC, position DESC
仓位分配
0.1::float AS position
表示仓位分配,每个股票分配 10% 仓位- 以rank_returns作为排序的score字段并且以ASC升序排列
数据抽取
- 开始/结束日期:
2023-01-01
到2024-04-26
- 绑定交易日:表示在回测时使用用户输入,在模拟交易时,使用模拟交易日期
- 历史数据向前取的天数:基础历史数据取更多天,有个算子需要向前看数据
回测
- 初始化函数:设置手续费
- K线处理函数:主要代码逻辑,根据调仓周期确定交易日前一天才出信号,根据仓位目标调整仓位
- 调仓周期:每10个交易日调仓
- 开盘买卖
def bigquant_run(context, data):
import pandas as pd
# 下一个交易日不是调仓日,则不生成信号
if not context.rebalance_period.is_signal_date(data.current_dt.date()):
return
# 从传入的数据 context.data 中读取今天的信号数据
today_df = context.data[context.data["date"] == data.current_dt.strftime("%Y-%m-%d")]
target_instruments = set(today_df["instrument"])
# 获取当前已持有股票
holding_instruments = set(context.get_account_positions().keys())
# 卖出不在目标持有列表中的股票
for instrument in holding_instruments - target_instruments:
context.order_target_percent(instrument, 0)
# 买入目标持有列表中的股票
for i, x in today_df.iterrows():
# 处理 null 或者 decimal.Decimal 类型等
position = 0.0 if pd.isnull(x.position) else float(x.position)
context.order_target_percent(x.instrument, position)
理解策略
数据
-
m3.data.read()["sql"]
可视化模版m1
输出的是根据用户选择构建的SQL
-
m1.data.read()
m1
根据m3
的SQL
抽取指定时间段的数据 \n -
可以使用 bigcharts.Table 来查看数据,支持翻页、排序等
import bigcharts # bigcharts.Bar(m2.data.read().groupby("date")["instrument"].count().to_frame()) bigcharts.Table(m2.data.read())
-
查看策略代码,也可以在这里直接修改代码,切换回可视化模式\n
优化
从这两年看没有跑赢基准,我们可以继续修改这个策略
-
查看其他时间段效果,修改 m2 的开始日期为 2010-01-01,看过去14年\n
只在部分年份收益
-
添加换手率过滤条件:
m_avg(turn, 5) BETWEEN 0.02 AND 0.05
过去5日换手率均值在2%到5%之间效果改进很多
如何使用
- 这只是一个演示例子,请充分理解风险
- 克隆代码然后去 AI Studio 修改和运行。但是本策略只是一个入门和简化版本,不适合作为模版进一步开发。对于线性策略,请使用 选股策略 作为模版,来学习和使用。
- 基于人工规则开发,需要手动一步一步调优策略,对人的要求高,效率低。
- 下一个Demo我们直接进入AI策略,学习使用AI来开发和优化策略
- 同时我们将逐步发布小市值策略、红利策略等源代码
\