问题描述
源码里面的code和研究里面的code不同,这是为什么?两个不同区域的代码分别代表什么?
谢谢回复!感激不尽!
解决方案
你好!这是一个非常好的问题,也是很多初学 JoinQuant(聚宽)量化平台的新手经常会遇到的疑惑。
简单来说,**“源码”(策略代码)和“研究”(研究代码)**代表了量化交易开发流程中的两个不同阶段,它们运行的底层环境、代码结构以及支持的 API 都有很大的区别。
以下是两者的详细对比解析:
1. 源码(策略代码 / 回测与模拟交易环境)
“源码”区域的代码,是用来进行“历史回测”和“模拟实盘交易”的。
- 核心目的:验证你的交易逻辑在历史行情中是否能赚钱,或者在模拟盘中自动执行买卖。
- 运行机制(事件驱动):策略代码是事件驱动的。你不需要自己写循环去遍历每一天,聚宽的底层引擎会像时间机器一样,一天一天(或一分钟一分钟)地推进时间,并在特定的时间点自动调用你写好的函数。
- 代码结构特征:
- 必须包含
initialize(context)初始化函数(设定基准、手续费、初始股票池等)。 - 通常包含定时运行函数
run_daily()或handle_data(context, data)来处理每天/每分钟的交易逻辑。 - 依赖
context对象来获取当前的账户资金、持仓信息和当前时间。
- 必须包含
- 专属 API:只能在这里使用交易下单函数,如
order()、order_target(),以及获取当前持仓的context.portfolio等。
示例结构:
def initialize(context):
g.security = '000001.XSHE'
set_benchmark('000300.XSHG')
def handle_data(context, data):
# 引擎每天自动调用,执行买卖
order(g.security, 100)
2. 研究(研究代码 / Jupyter Notebook 环境)
“研究”区域的代码,是用来进行“数据分析、策略探索和因子挖掘”的。
- 核心目的:在写具体的交易策略之前,你需要先分析数据。比如:画出某只股票的均线图、统计某个财务指标的分布、测试某个因子的有效性等。
- 运行机制(线性执行):研究环境本质上是一个 Jupyter Notebook。代码是线性执行的,也就是你写一行代码,运行一行,马上就能看到结果(表格或图表)。它没有时间机器引擎帮你推进时间。
- 代码结构特征:
- 不需要
initialize或handle_data。 - 没有
context对象(因为你没有在跑回测,也就没有虚拟账户和持仓)。 - 大量使用
pandas、numpy、matplotlib等数据分析和绘图库。
- 不需要
- 专属 API:主要使用数据获取 API,如
get_price()、get_fundamentals()、get_factor_values()等。注意:在研究环境中调用order()下单函数会直接报错。
示例结构:
import pandas as pd
import matplotlib.pyplot as plt
from jqdata import *
# 直接获取数据并分析,没有 context
df = get_price('000001.XSHE', start_date='2020-01-01', end_date='2020-12-31')
df['close'].plot()
plt.show()
总结:为什么它们不同?
- 研究(Research) 是你的实验室。你在这里查阅数据、画图、寻找规律、验证你的数学模型。这里的代码偏向于数据科学(Data Science)。
- 源码(Strategy) 是你的自动交易机器人。当你在“研究”中找到了赚钱的规律,你把这个规律翻译成机器人的执行指令(买入、卖出条件),放到回测引擎中去跑。这里的代码偏向于工程实现。
在社区的帖子里,作者通常会先在“研究”中展示他们是如何发现这个策略逻辑的(比如贴出数据图表),然后再在“源码”中给出可以实际运行回测的完整策略代码。这就是为什么你会看到两份截然不同的代码!