问题描述
策略回测如何调用研究中的自定义因子?
1.我目前看到因子分析中只有因子分析,没有调用示例
2.回测教程中只有用看板因子的示例,那自定义的要怎么用?
3.或者说哪里有讲解
主要是平时在研究中的因子,要实际使用,后续可以提交模拟盘
应该是可以 from ? import ?
解决方案
在 JoinQuant(聚宽)平台上,将研究环境中定义的自定义因子应用到回测或模拟交易中,主要有两种方式:
方法一:直接在回测代码中定义并计算因子
你可以直接将自定义因子的类定义在回测代码中,然后使用 jqfactor 库提供的 calc_factors 函数来计算因子值。
代码示例:
# 导入聚宽函数库
import jqdata
from jqfactor import Factor, calc_factors
import numpy as np
# 1. 定义你的自定义因子
class ALPHA013(Factor):
name = 'alpha013_name'
max_window = 1
dependencies = ['high', 'low', 'volume', 'money']
def calc(self, data):
high = data['high']
low = data['low']
vwap = data['money'] / data['volume']
return (np.power(high * low, 0.5) - vwap).mean()
def initialize(context):
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
g.security = ['000001.XSHE', '000002.XSHE']
run_daily(market_open, time='09:30')
def market_open(context):
# 2. 在需要的时候计算因子值
# 注意:end_date 必须小于 context.current_dt,通常使用 context.previous_date
factors = calc_factors(
securities=g.security,
factors=[ALPHA013()],
start_date=context.previous_date,
end_date=context.previous_date,
use_real_price=False,
skip_paused=False
)
# 获取计算出的因子值
alpha_values = factors['alpha013_name']
print(alpha_values)
# 根据因子值进行交易逻辑...
方法二:将因子保存在研究目录的 .py 文件中并导入
如果你在研究环境中编写了很长的因子代码,不想全部复制到回测代码中,你可以利用聚宽的自定义 Python 库功能。
步骤 1:在研究环境中创建 .py 文件
在“投资研究”的根目录下,新建一个 Python 文件,例如命名为 my_factors.py,将你的因子类写在里面:
# my_factors.py
from jqfactor import Factor
import numpy as np
class MyCustomFactor(Factor):
name = 'my_custom_factor'
max_window = 5
dependencies = ['close']
def calc(self, data):
return data['close'][-5:].mean()
步骤 2:在回测代码中导入并使用
在你的回测或模拟交易代码的开头,使用 import 导入你刚才创建的文件:
import jqdata
from jqfactor import calc_factors
# 导入你研究根目录下的自定义库
from my_factors import MyCustomFactor
def initialize(context):
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
g.security = ['000001.XSHE', '000002.XSHE']
run_daily(market_open, time='09:30')
def market_open(context):
# 实例化并计算导入的因子
factors = calc_factors(
securities=g.security,
factors=[MyCustomFactor()],
start_date=context.previous_date,
end_date=context.previous_date
)
factor_values = factors['my_custom_factor']
print(factor_values)
注意事项:
- 避免未来函数:在回测中调用
calc_factors时,end_date参数千万不要传入context.current_dt(当天的逻辑时间),应该传入context.previous_date(前一个交易日),否则会引入未来数据。 - 文件路径:使用
import导入时,.py文件必须放在研究环境的根目录下,目前暂不支持导入子目录中的文件(例如import a.b.c)。 - 性能考虑:
calc_factors每次调用都会进行计算,如果因子计算非常复杂,建议在before_trading_start中计算好当天的因子值并存入全局变量g中,然后在handle_data或定时运行函数中使用。