快速入门

QFF框架读取用户编写的策略文件,根据输入的执行参数进行回测或模拟交易,并在执行完成后自动生成相应的策略评价报告。

说明

我们假设 QFF 已经正确安装在您的系统中,并且已经完成了相应数据库安装和股票数据的下载更新,如果有任何安装相关的问题,请首先查看 安装指南

开始编写第一个策略

QFF采用了函数式编程,以API的方式提供给策略研发者用于编写策略,从而避免陷入过多的技术细节,而非金融程序建模本身。

下载策略模板

在命令行终端中,创建并进入项目目录,然后运行以下指令:

$ qff create 
>>>请输入待创建的策略文件名称[默认:example.py]:test
>>>策略文件test.py创建成功!

编写自己的策略代码

使用Python开发工具 PyCharm, VsCode, Sublime 等打开下载的策略模板文件,并添加自己的策略代码。

下面是一个简单而又完整的策略:

 1# 导入函数库
 2from qff import *
 3
 4
 5# 初始化函数,设定基准等等
 6def initialize(context):
 7    # 输出内容到日志 log.info()
 8    log.info('初始函数开始运行且全局只运行一次')
 9
10    # 设定沪深300作为基准
11    set_benchmark('000300')
12
13    # 股票相关设定 ###
14    # 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
15    set_order_cost(open_tax=0,
16                   close_tax=0.001,
17                   open_commission=0.0003,
18                   close_commission=0.0003,
19                   min_commission=5)
20
21    # 开盘前运行
22    run_daily(before_market_open, run_time='before_open')
23    # 开盘时运行
24    run_daily(market_open, run_time='every_bar')
25    # 收盘后运行
26    run_daily(after_market_close, run_time='after_close')
27
28
29# 开盘前运行函数
30def before_market_open(context):
31    # 输出运行时间
32    log.info('函数运行时间(before_market_open):' + context.current_dt)
33
34    # 要操作的股票:平安银行(g.为全局变量)
35    g.security = '000001'
36
37
38# 开盘时运行函数
39def market_open(context, data):
40    log.info('函数运行时间(market_open):'+context.current_dt)
41    security = g.security
42    # 获取股票的收盘价
43    close_data = attribute_history(security, count=5, unit='1d', fields=['close'])
44    # 取得过去五天的平均价格
45    MA5 = close_data['close'].mean()
46    # 取得上一时间点价格
47    current_price = close_data['close'][-1]
48    # 取得当前的现金
49    cash = context.portfolio.available_cash
50
51    # 如果上一时间点价格高出五天平均价1%, 则全仓买入
52    if (current_price > 1.01*MA5) and (cash > 0):
53        # 记录这次买入
54        log.info("价格高于均价 1%%, 买入 %s" % security)
55        # 用所有 cash 买入股票
56        order_value(security, cash)
57    # 如果上一时间点价格低于五天平均价, 则空仓卖出
58    elif current_price < MA5 and \
59            security in context.portfolio.positions.keys() and\
60            context.portfolio.positions[security].closeable_amount > 0:
61        # 记录这次卖出
62        log.info("价格低于均价, 卖出 %s" % security)
63        # 卖出所有股票,使这只股票的最终持有量为0
64        order_target(security, 0)
65
66
67# 收盘后运行函数
68def after_market_close(context):
69    log.info(str('函数运行时间(after_market_close):'+context.current_dt))
70
71

一个完整策略只需要两步:

  • 设置初始化函数:[initialize],上面的例子中, 注册每个交易日盘前、盘中、盘后运行的函数。

  • 编写函数代码, 实现突破5日均线买入,下穿5日均线卖出的策略。

回测自己编写的策略

命令行运行

在命令行终端内,执行qff run -h 可以查看命令参数说明,然后执行以下语句:

$ qff run test.py -s 2022-06-01 -e 2022-10-31 

集成开发环境中运行

调用 run_file() 函数执行当前策略,在策略文件尾部添加以下代码,您可以直接在终端运行 python test.py 或在集成开发环境中运行。

1if __name__ == '__main__':
2     run_file(__file__, start="2022-06-01", end="2022-10-31")

查看策略回测结果

策略回测结束后,将在 ~\.qff\output\back_test\ 目录下保存回测结果,生成两个文件:

  1. 一个pkl文件,包含策略运行过程中context对象的所有信息

  2. 一个html文件,即策略运行报告。

strategy chart

实盘模拟编写的策略

启动实盘模拟

在命令行终端执行以下指令,将启动策略的实盘模拟,设置初始资金10万(默认值100万)。

$ qff sim test.py  --cash 100000

执行过程中交互

实盘模拟运行后,将在真实交易时间执行您的策略代码,命令行终端内将连续打印策略的日志信息。 您可以通过输入log命令开关日志信息,并输入命令与QFF进行交互,首先输入help可以查看所有交互命令。

trace

通过info命令可以随时查看策略当前实盘模拟的运行效果。

说明

QFF交互环境在回测过程同样可以使用。