快速入门
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\ 目录下保存回测结果,生成两个文件:
一个pkl文件,包含策略运行过程中context对象的所有信息
一个html文件,即策略运行报告。

实盘模拟编写的策略
启动实盘模拟
在命令行终端执行以下指令,将启动策略的实盘模拟,设置初始资金10万(默认值100万)。
$ qff sim test.py --cash 100000
执行过程中交互
实盘模拟运行后,将在真实交易时间执行您的策略代码,命令行终端内将连续打印策略的日志信息。
您可以通过输入log命令开关日志信息,并输入命令与QFF进行交互,首先输入help可以查看所有交互命令。

通过info命令可以随时查看策略当前实盘模拟的运行效果。
说明
QFF交互环境在回测过程同样可以使用。