有的是xsheel5,有的是xshg有什么区别吗

xshe,xshg是什么英语的缩写_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
xshe,xshg是什么英语的缩写
我有更好的答案
g就是给用户自定义实用的全局变量,用户可以自定义数据。xshe是深证 xshg上证希望可以帮到您❤️
采纳率:72%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包使用notebook打造日内监控市场数据的利器V0.5
我的图书馆
使用notebook打造日内监控市场数据的利器V0.5
日内监控市场数据如何通过重构日内所见来增加交易的成功率?所见:背景信息大盘指数涨跌停信息板块信息监控自选股票池个股走势:暂时还没有添加缘起作为长期的主观交易者,非常容易通过直觉性的方式来面对所看到的数据。在面对跳到的数据时,这种被动接受的方式不知不觉会使自己认为自己是被市场所拉着的,情绪就自然容易陷入到紧张之中,似乎一直在追着新鲜的数据。我有一种直觉,认为如果我们主动去构造自己所见,而非被动去看跳到的变化数据,那么我们的情绪可以被更有效的调节。其实不管是主观交易还是程式化交易,交易目标都是一样的,就是依照一定的准则来获得利润。我们太容易被noise所干扰,使得我们的目标不再明确。"金钱是四个脚的,人是两个脚的", 如果人去追金钱,永远也追不上~基本日内背景信息外部环境: 人民币汇率停复牌信息XSHG,XSHE,CCFX,XDCE,XSGE,XZCE,XHKG。XSHG表示上海证券交易所,XSHE表示深圳证券交易所,CCFX表示中国金融期货交易所,XDCE表示大连商品交易所,XSGE表示上海期货交易所,XZCE表示郑州商品交易所,XHKG表示香港证券交易所人民币汇率中间价12import datetime34today = datetime.datetime.now() 5last10_day = (today- datetime.timedelta(days=20)).strftime("%Y%m%d") 6print "前20天为:" + last10_day7rmb_rate =DataAPI.MktFxRefRateGet(currencyPair=u"USD/CNY",beginDate=last10_day,endDate=u"",field=u"",pandas="1");rmb_rate前20天为:
tradeDatecurrencyPairmidRate0USD/CNY6.51861USD/CNY6.51522USD/CNY6.52373USD/CNY6.51304USD/CNY6.51185USD/CNY6.53146USD/CNY6.54197USD/CNY6.55218USD/CNY6.55109USD/CNY6.5539
停复牌信息12df =DataAPI.SecTipsGet(tipsTypeCD=u"H",field=u"",pandas="1")3print df.head()456 secID ticker exchangeCD secShortName 0 000002.XSHE 000002 XSHE 万科A
1 000007.XSHE 000007 XSHE 全新好
2 000023.XSHE 000023 XSHE 深天地A
3 000028.XSHE 000028 XSHE 国药一致
4 000034.XSHE 000034 XSHE 深信泰丰
0 继续停牌(起始停牌时间: 13:00:00);停牌原因:停牌
1 继续停牌(起始停牌时间: 09:30:00);停牌原因:停牌
2 继续停牌(起始停牌时间: 09:30:00);停牌原因:重大事项
3 继续停牌(起始停牌时间: 09:30:00);停牌原因:停牌
4 继续停牌(起始停牌时间: 09:30:00);停牌原因:停牌
监控大盘指数走势图,那是必须的!通过监控日内来获得买点~可以简单用 time模块的sleep来每隔一点时间传输,不过这不是我要的!要主动画走势图价格的变化成交量的变化希望加入领先指数~ 无非是平均值:目前还没有~似乎没有现成对象12a =DataAPI.MktBarRTIntraDayGet(securityID=u'000001.XSHG', startTime='09:30', endTime='', unit='', pandas='1');a34pic_data = a.set_index("barTime");pic_data.tail(5) 5
unittickerexchangeCDshortNMutcOffsetcurrencyCDclosePriceopenPricehighPricelowPricetotalVolumetotalValuebarTime14:421000001XSHG上证综指+08:00NaN13456651.14:431000001XSHG上证综指+08:00NaN10621721.14:441000001XSHG上证综指+08:00NaN8737699.14:451000001XSHG上证综指+08:00NaN8313218.14:461000001XSHG上证综指+08:00NaN7326878.
123pd.set_option('display.mpl_style', 'default')45show_data_price = pic_data.closePrice;show_data_price6show_data_value = pic_data.totalValue;show_data_value78import matplotlib.pyplot as plt9fig, ax = plt.subplots(2, 1, figsize=(12, 4))10show_data_price.plot(ax=ax[0], title="Shanghai composite index daily chart ") 11show_data_value.plot(kind='bar',ax=ax[1])1213fig.tight_layout()1415实时涨跌停信息监控实时获取涨跌幅超过8%的股票123data_tp =DataAPI.EquRTRankGet(exchangeCD=u"",desc=u"0",field=u"dataTime,ticker,shortNM,volume,changePct",pandas="1") 4data_bt =DataAPI.EquRTRankGet(exchangeCD=u"",desc=u"1",field=u"dataTime,ticker,shortNM,volume,changePct",pandas="1") 5678910print data_tp[data_tp.changePct&0.080] 11print data_bt[data_bt.changePct&-0.080]12 dataTime ticker shortNM volume changePct
0 14:29:22 600319 亚星化学 .1007
1 14:29:52 002163 中航三鑫 .1007
2 14:29:49 002689 远大智能 .1006
3 14:29:52 000889 茂业通信 .1005
4 14:29:22 600070 浙江富润 .1005
5 14:29:22 601900 南方传媒 .1004
6 14:29:52 002537 海立美达 .1003
7 14:29:22 600345 长江通信 .1003
8 14:29:22 600288 大恒科技 .1003
9 14:29:52 002436 兴森科技 .1002
10 14:29:22 600370 三房巷 .1002
11 14:29:49 300412 迦南科技 .1002
12 14:29:49 300499 高澜股份 1
13 14:29:52 002788 鹭燕医药 1
14 14:29:49 200020 深华发B .1001
15 14:29:52 002308 威创股份 .1001
16 14:29:49 300501 海顺新材 1
17 14:29:49 300248 新开普 .1001
18 14:29:49 002740 爱迪尔 .1001
19 14:29:22 603377 东方时尚 .1001
20 14:29:52 000972 新中基 .1001
21 14:29:49 300209 天泽信息 .1001
22 14:29:52 002119 康强电子 .1000
23 14:29:49 300032 金龙机电 .1000
24 14:29:52 002504 弘高创意 .1000
25 14:29:49 300500 苏州设计 0
26 14:29:49 300496 中科创达 .1000
27 14:29:52 000681 视觉中国 0
28 14:29:52 000935 四川双马 .1000
29 14:29:52 000626 如意集团 .1000
30 14:29:52 000020 深华发A .1000
31 14:29:52 000716 黑芝麻 .1000
32 14:29:52 000016 深康佳A .1000
33 14:29:52 002103 广博股份 .0999
34 14:29:22 603608 天创时尚 9
35 14:29:22 600080 金花股份 .0999
36 14:29:52 000012 南 玻A .0999
37 14:29:22 600571 信雅达 .0999
38 14:29:22 600841 上柴股份 .0997
39 14:29:52 002226 江南化工 .0996
40 14:29:22 600283 钱江水利 .0908
41 14:29:49 300176 鸿特精密 .0904
42 14:29:49 300229 拓尔思 .0878
43 14:29:49 300096 易联众 .0816
44 14:29:49 300453 三鑫医疗 .0812
dataTime ticker shortNM volume changePct
0 14:29:22 600774 汉商集团 .1000
1 14:29:22 600378 天科股份 .0924
指数信息指数信息是某种意义上的板块信息12idx =DataAPI.IdxGet(secID=u"",ticker=u"",field=u"",pandas="1");idx3idx.sort(columns="publishDate", ascending =True)4个股所属板块查询:123DataAPI.ThemesByTickersGet(ticker=u"",secShortName=u"迦南",secID=u"",exchangeCD=u"",beginDate=u"",endDate=u"",field=u"",pandas="1")
secIDexchangeCDexchangeNametickersecShortNamethemeIDthemeNamebeginDateendDatereturnScoretextContributionScoreindustryScoreinsertTimeupdateTime0300412.XSHEXSHE深圳证券交易所300412迦南科技2899医疗器械NaN0.8720270.0974730.661654 00:00:00 10:27:111300412.XSHEXSHE深圳证券交易所300412迦南科技120064医药生物NaN0.8812470.2023350.689320 00:00:00 10:32:202300412.XSHEXSHE深圳证券交易所300412迦南科技2690创业板NaN0.9773650.1159780.152966 00:00:00 10:24:583300412.XSHEXSHE深圳证券交易所300412迦南科技1833新股NaN0.9597500.1655900.174107 09:01:00 10:18:084300412.XSHEXSHE深圳证券交易所300412迦南科技120867次新NaN0.9592600.2124280.180195 09:00:51 10:37:085300412.XSHEXSHE深圳证券交易所300412迦南科技121070医疗器械服务NaN0.7360290.0000000.766667 09:00:07 10:37:526300412.XSHEXSHE深圳证券交易所300412迦南科技593送转NaN0.9556120.0425090.116998 09:00:12 10:06:227300412.XSHEXSHE深圳证券交易所300412迦南科技943医疗NaN0.9291970.1088440.451140 09:00:21 10:11:438300412.XSHEXSHE深圳证券交易所300412迦南科技119989保健NaN0.8652880.3592230.666667 09:00:22 10:31:309300412.XSHEXSHE深圳证券交易所300412迦南科技120058医疗保健NaN0.7364580.3116880.703704 09:00:21 10:32:0410300412.XSHEXSHE深圳证券交易所300412迦南科技120694预盈预增NaN0.9621770.0000000.113382 09:01:50 10:36:31
筛选板块关联股票信息:12theme_universe = DataAPI.TickersByThemesGet(themeID=u"",themeName=u"预盈预增",beginDate=u"",endDate=u"",isNew=u"",field=u"",pandas="1") 34universe_selected =theme_universe[theme_universe["returnScore"]&0.995];universe_selected 5print "从"+str(len(theme_universe.index))+"只股票中选取了"+ str(len(universe_selected.index))+"只股票; ";6print "筛选率为:"+ str(len(universe_selected.index)*100/len(theme_universe.index)) +"%"7universe_selected8从805只股票中选取了20只股票;
筛选率为:2%
themeIDthemeNamesecIDtickersecShortNameexchangeCDexchangeNamebeginDateendDateisNewreturnScoretextContributionScoreindustryScoreinsertTimeupdateTime50120694预盈预增000665.XSHE000665湖北广电XSHE深圳证券交易所NaN10.99927200.166180 09:01:41 10:36:27120120694预盈预增002014.XSHE002014永新股份XSHE深圳证券交易所NaN10.99711300.071776 09:01:29 10:36:29139120694预盈预增002060.XSHE002060粤水电XSHE深圳证券交易所NaN10.99877900.081995 09:01:29 10:36:29302120694预盈预增002403.XSHE002403爱仕达XSHE深圳证券交易所NaN10.99845100.052311 09:01:41 10:36:30325120694预盈预增002448.XSHE002448中原内配XSHE深圳证券交易所NaN10.99542900.061800 09:00:15 10:36:29340120694预盈预增002495.XSHE002495佳隆股份XSHE深圳证券交易所NaN11.00000000.037226 09:01:29 10:36:30362120694预盈预增002533.XSHE002533金杯电工XSHE深圳证券交易所NaN10.99559200.124574 09:01:29 10:36:30370120694预盈预增002545.XSHE002545东方铁塔XSHE深圳证券交易所NaN10.99623000.134550 09:00:15 10:36:30408120694预盈预增002603.XSHE002603以岭药业XSHE深圳证券交易所NaN10.99503200.079562 09:01:41 10:36:30489120694预盈预增300002.XSHE300002神州泰岳XSHE深圳证券交易所NaN10.99609100.100973 09:00:14 10:36:29507120694预盈预增300037.XSHE300037新宙邦XSHE深圳证券交易所NaN10.99766100.126521 09:00:12 10:36:30523120694预盈预增300070.XSHE300070碧水源XSHE深圳证券交易所NaN10.99658600.082238 09:01:41 10:36:30529120694预盈预增300080.XSHE300080易成新能XSHE深圳证券交易所NaN10.99758900.120925 09:00:14 10:36:30539120694预盈预增300107.XSHE300107建新股份XSHE深圳证券交易所NaN10.99528800.126521 09:00:14 10:36:30571120694预盈预增300201.XSHE300201海伦哲XSHE深圳证券交易所NaN10.99517500.130657 09:01:41 10:36:30584120694预盈预增300239.XSHE300239东宝生物XSHE深圳证券交易所NaN10.99872500.079562 09:00:14 10:36:30674120694预盈预增300483.XSHE300483沃施股份XSHE深圳证券交易所NaN10.99767400.067397 09:00:14 10:36:30684120694预盈预增600022.XSHG600022山东钢铁XSHG上海证券交易所NaN10.99752800.045012 09:00:14 10:36:29738120694预盈预增600609.XSHG600609金杯汽车XSHG上海证券交易所NaN10.99694600.061800 09:00:14 10:36:28753120694预盈预增600713.XSHG600713南京医药XSHG上海证券交易所NaN10.99733100.079075 09:01:50 10:36:29
本周先到这里~最后要大赞一下uqer! 真的,这里就是我所一直期望的投资分享伊甸园!谢谢大家的阅读~ 初步尝试,包括命名、内容都希望多提提意见~enjoy~^@^
TA的最新馆藏
喜欢该文的人也喜欢感谢您使用GFQuant量化交易平台,以下内容主要介绍的API使用方法,目录中带有”?” 标识的API是 "回测环境/模拟"的专用API,不能在研究模块中调用。
内容较多,可使用Ctrl+F进行搜索。
如果以下内容仍没有解决您的问题,请您通过的方式告诉我们,谢谢。
开始写策略
简单但是完整的策略
先来看一个简单但是完整的策略:
def initialize(context):
g.security = '000001.XSHE'
def handle_data(context, data):
if g.security not in context.portfolio.positions:
order(g.security, 1000)
order(g.security, -800)
一个完整策略只需要两步:
设置初始化函数: ,上面的例子中, 只操作一支股票: ‘000001.XSHE’, 平安银行
实现一个函数: , 来根据历史数据调整仓位.
这个策略里, 每当我们没有股票时就买入1000股, 每当我们有股票时又卖出800股, 具体的下单API请看函数.
这个策略里, 我们有了交易, 但是只是无意义的交易, 没有依据当前的数据做出合理的分析
下面我们来看一个真正实用的策略
实用的策略
在这个策略里, 我们会根据历史价格做出判断:
如果上一时间点价格高出五天平均价1%, 则全仓买入
如果上一时间点价格低于五天平均价, 则空仓卖出
import jqdata
def initialize(context):
g.security = '000001.XSHE'
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
def handle_data(context, data):
security = g.security
close_data = attribute_history(security, 5, '1d', ['close'])
MA5 = close_data['close'].mean()
current_price = close_data['close'][-1]
cash = context.portfolio.cash
if current_price & 1.01*MA5:
order_value(security, cash)
("Buying %s" % (security))
elif current_price & MA5 and context.portfolio.positions[security].closeable_amount & 0:
order_target(security, 0)
("Selling %s" % (security))
record(stock_price=current_price)
用户需要实现的函数
initialize
initialize(context)
初始化方法,在整个回测、模拟实盘中最开始执行一次,用于初始一些全局变量
context: 对象, 存放有当前的账户/股票持仓信息
def initialize(context):
g.security = "000001.XSHE"
handle_data, 可选
handle_data(context, data)
该函数每个单位时间会调用一次, 如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次。
该函数依据的时间是股票的交易时间,即 9:30 - 15:00. 期货请使用函数。
该函数在回测中的非交易日是不会触发的(如回测结束日期为日,则程序在日-3日时,handle_data不会运行,4日继续运行)。
context: 对象, 存放有当前的账户/标的持仓信息
data: 一个字典(dict), key是股票代码, value是当时的 对象. 存放前一个单位时间(按天回测, 是前一天, 按分钟回测, 则是前一分钟) 的数据. 注意:
为了加速, data 里面的数据是按需获取的, 每次 handle_data 被调用时, data 是空的 dict, 当你使用 data[security] 时该 security 的数据才会被获取.
data 只在这一个时间点有效, 请不要存起来到下一个 handle_data 再用
注意, 要获取回测当天的开盘价/是否停牌/涨跌停价, 请使用
def handle_data(context, data):
order("000001.XSHE",100)
定时运行函数, 可选
run_monthly
run_weekly
def initialize(context):
run_monthly(func, monthday, time='open', reference_security)
run_weekly(func, weekday, time='open', reference_security)
run_daily(func, time='open', reference_security)
func: 一个函数, 此函数必须接受一个参数, 就是 context
monthday: 每月的第几个交易日, 可以是负数, 表示倒数第几个交易日
weekday: 每周的第几个交易日, 可以是负数, 表示倒数第几个交易日
time: 日内执行时间, 具体到分钟, 一个字符串, 可以是具体执行时间, 比如 “10:00”, 或者 “every_bar”, “open”, “before_open” 和 “after_close”, 他们的含义是:
every_bar: 在每一个 bar 结束后调用. 按天会在每天的开盘时调用一次,按分钟会在每天的每分钟运行,可以在该时段下单
open: 开盘的第一分钟(等同于”9:30”),可以在该时段下单
before_open: 开盘前(等同于”9:20”, 但是请不要使用直接使用此时间, 后续可能会调整)
after_close: 收盘后(半小时内运行)
morning: 早上 8:00 运行,可以在该时段下单
night: 晚上 20:00 运行,可以在该时段下单
注:当time不等于 every_bar/open/before_open/after_close/morning/night 时, 必须使用分钟级回测
reference_security: 时间的参照标的。如参照’000001.XSHG’,交易时间为9:30-15:00。如参照’IF1512.CCFX’,之后的交易时间为9:30-15:00,在此之前为 9:15-15:15。
def weekly(context):
print 'weekly %s %s' % (context.current_dt, context.current_dt.isoweekday())
def monthly(context):
print 'monthly %s %s' % (context.current_dt, context.current_dt.month)
def daily(context):
print 'daily %s' % context.current_dt
def initialize(context):
run_monthly(monthly, 1, 'open')
run_weekly(weekly, -1, 'before_open')
run_daily(daily, 'after_close')
run_daily(daily, '10:00')
run_daily(daily, 'every_bar', reference_security='IF1512.CCFX')
before_trading_start, 可选
before_trading_start(context)
该函数会在每天开始交易前被调用一次, 您可以在这里添加一些每天都要初始化的东西.
该函数依据的时间是股票的交易时间,即该函数启动时间为 9:20. 期货请使用函数,time 参数设定为’before_open’ 。
context: 对象, 存放有当前的账户/股票持仓信息
def before_trading_start(context):
(str(context.current_dt))
after_trading_end, 可选
after_trading_end(context)
该函数会在每天结束交易后被调用一次, 您可以在这里添加一些每天收盘后要执行的内容. 这个时候所有未完成的订单已经取消.
该函数依据的时间是股票的交易时间,即该函数启动时间为 15:10. 期货请使用函数,time 参数设定为’after_close’ 。
context: 对象, 存放有当前的账户/股票持仓信息
def after_trading_end(context):
(str(context.current_dt))
process_initialize, 可选
process_initialize(context)
该函数会在每次模拟盘/回测进程重启时执行, 一般用来初始化一些不能持久化保存的内容. 在
因为模拟盘会每天重启, 所以这个函数会每天都执行.
context: 对象, 存放有当前的账户/股票持仓信息
def process_initialize(context):
g.__q = query(valuation)
def handle_data(context, data):
get_fundamentals(g.__q)
after_code_changed, 可选
after_code_changed(context)
模拟盘在每天的交易时间结束后会休眠,第二天开盘时会恢复,如果在恢复时发现代码已经发生了修改,则会在恢复时执行这个函数。
具体的使用场景:可以利用这个函数修改一些模拟盘的数据。
注意: 因为一些原因, 执行回测时这个函数也会被执行一次, 在
执行完之后执行.
context: 对象, 存放有当前的账户/股票持仓信息
def after_code_changed(context):
g.stock = '000001.XSHE'
回测引擎介绍
回测引擎运行在Python2.7之上, 请您的策略也兼容Python2.7
我们支持所有的Python标准库和部分常用第三方库, 具体请看: . 另外您可以把.py文件放在研究根目录, 回测中可以直接import, 具体请看:
安全是平台的重中之重, 您的策略的运行也会受到一些限制, 具体请看:
准备好您的策略,
选择要操作的股票池, 实现handle_data函数
选定一个回测开始和结束日期, 选择初始资金、调仓间隔(每天还是每分钟), 开始回测
引擎根据您选择的股票池和日期, 取得股票数据, 然后每一天或者每一分钟调用一次您的handle_data函数, 同时告诉您现金、持仓情况和股票在上一天或者分钟的数据. 在此函数中, 您还可以调用函数获取任何多天的历史数据, 然后做出调仓决定.
当您下单后, 我们会根据接下来时间的实际交易情况, 处理您的订单. 具体细节参见
下单后您可以调用get_open_orders取得所有未完成的订单, 调用cancel_order取消订单
您可以在handle_data里面调用record()函数记录某些数据, 我们会以图表的方式显示在回测结果页面
您可以在任何时候调用/debug/warn/error函数来打印一些日志
回测结束后我们会画出您的收益和基准(参见)收益的曲线,
列出每日持仓,每日交易和一系列风险数据。
股票数据:我们拥有所有A股上市公司2005年以来的股票行情数据、、、、等。为了避免,我们包括了已经退市的股票数据。
基金数据:我们目前提供了600多种在交易所上市的基金的行情、净值等数据,包含、、以及的完整的行情、净值数据等,请点击查看。
金融期货数据:我们提供中金所推出的所有的行情数据,并包含历史产品的数据。
股票指数:我们支持近600种数据,包括指数的行情数据以及成分股数据。为了避免未来函数,我们支持获取历史任意时刻的指数成分股信息,具体见。注意:指数不能买卖
行业板块:我们支持按行业、按板块选股,具体见
概念板块:我们支持按概念板块选股,具体见
宏观数据:我们提供全方位的,为投资者决策提供有力数据支持。
所有的行情数据我们均已处理好前复权信息。
我们当日的回测数据会在收盘后通过多数据源进行校验,并在T+1(第二天)的00:01更新。
保证您的策略安全是我们的第一要务
在您使用我们网站的过程中, 我们全程使用https传输
策略会加密存储在数据库
回测时您的策略会在一个安全的进程中执行, 我们使用了进程隔离的方案来确保系统不会被任何用户的代码攻击, 每个用户的代码都运行在一个有很强限制的进程中:
只能读指定的一些python库文件
不能写和执行任何文件, 如果您需要保存和读取私有文件, 请看[write_file]/[read_file]
不能创建进程或者线程
限制了cpu和内存, 堆栈的使用
可以访问网络, 但是对带宽做了限制, 下载最大带宽为500KB/s, 上传带宽为10KB/s
有严格的超时机制, 如果handle_data超过30分钟则立即停止运行
对于读取回测所需要的数据, 和输出回测结果, 我们使用一个辅助进程来帮它完成, 两者之间通过管道连接.
我们使用了linux内核级别的apparmer技术来实现这一点.
有了这些限制我们确保了任何用户不能侵入我们的系统, 更别提盗取他人的策略了.
1. Bar 的概念
在一定时间段内的时间序列就构成了一根 K 线(日本蜡烛图),单根 K 线被称为 Bar。
如果是一分钟内的 Tick 序列,即构成一根分钟 K 线,又称分钟 B
如果是一天内的分钟序列,即构成一根日线 K 线,又称日线 B
Bar 的示意图如下所示:
Bar 就是时间维度上,价格在空间维度上变化构成的数据单元。如下图所示,多个数据单元 Bar 构成的一个时间序列。
2. 频率详解
下列图片中齿轮为 handle_data(context, data) 的运行时间,before_trading_start(context) 等其他函数运行时间详见。
当选择天频率时, 算法在每根日线 Bar 都会运行一次,即每天运行一次。
在算法中,可以获取任何粒度的数据。
频率:分钟
当选择分钟频率时, 算法在每根分钟 Bar 都会运行一次,即每分钟运行一次。
在算法中,可以获取任何粒度的数据。
频率:Tick
当选择 Tick 频率时,每当新来一个 Tick,算法都会被执行一次。
注意:现阶段,Tick 频率只有在模拟交易时可以选择。
执行示意图如下图所示:
对于您在某个单位时间下的单, 我们会做如下处理:
交易价格: 开盘价 +
最大成交量: 每次下单成交量不会超过该股票当天的总成交量.
可通过选项
设置每天最大的成交量, 例如: 0.25 表示下单成交量不会超过当天成交量的 25%
context.portfolio中的持仓价格会使用当天开盘价更新
data 是昨天的按天数据, 要想拿到当天开盘价, 请使用
拿取 day_open 字段
交易价格: 因为我们是在每分钟的第一秒钟执行代码, 所以价格是上一分钟的最后一个价格 +
同按天回测规则, 每次下单成交量不会超过该股票当天的总成交量,
同样有效. 注意: 这是限制了每个订单的成交量, 当然, 你可以通过一天多次下单来超过一天成交量, 但是, 为了对你的回测负责, 请不要这么做.
交易价格: 同回测
最大交易量: 不管是按天, 按分钟, 还是按tick, 由于市价单都是同步完成, 下单那一刻无法知道当天成交量, 所以市价单都不考虑成交量, 全量成交.
所有市价单下单之后同步完成(也即 order_XXX 系列函数返回时完成), context.portfolio 会同步变化
回测和模拟交易保持一致
不是立即完成, 下单之后 context.portfolio.cash 和 context.portfolio.positions 不会同步变化.
下单(按天, 是09:30:00下单)之后每分钟根据这一分钟的分价表撮合一次, 直到完全成交或者当天收盘为止. 撮合时会考虑
选项, 具体撮合机制见
选项的说明.
按tick, 不是立即完成, 而是下单之后每个tick根据这个tick的分价表撮合一次, 直到完全成交或者当天收盘为止. 同样考虑
按天模拟交易暂时不支持限价单
上述过程中, 如果实际价格已经涨停或者跌停, 则相对应的买单或卖单不成交, 市价单直接取消(log中有警告信息), 限价单会挂单直到可以成交.
一天结束后, 所有未完成的订单会被取消
每次订单完成(完全成交)或者取消后, 我们会根据成交量计算手续费(参见), 减少您的现金
更多细节, 请看函数
拆分合并和分红
传统前复权回测模式:当股票发生拆分,合并或者分红时,股票价格会受到影响,为了保证价格的连续性, 我们使用前复权来处理之前的股票价格,给您的所有股票价格已经是前复权的价格。
真实价格(动态复权)回测模式:当股票发生拆分,合并或者分红时,会按照历史情况,对账户进行处理,会在账户账户中增加现金或持股数量发生变化,并会有日志提示。
在实战交易中,往往最终成交价和预期价格有一定偏差,因此我们加入了滑点模式来帮助您更好地模拟真实市场的表现。
您可以通过来设置回测具体的滑点参数。
交易税费包含券商手续费和印花税。您可以通过来设置具体的交易税费的参数。
券商手续费
中国A股市场目前为双边收费,券商手续费系默认值为万分之三,即0.03%,最少5元。
印花税对卖方单边征收,对买方不再征收,系统默认为千分之一,即0.1%。
风险指标数据有利于您对策略进行一个客观的评价。
注意: 无论是回测还是模拟, 所有风险指标(年化收益/alpha/beta/sharpe/max_drawdown等指标)都只会每天更新一次, 也只根据每天收盘后的收益计算, 并不考虑每天盘中的收益情况. 例外:
分钟和TICK模拟盘每分钟会更新策略收益和基准收益
按天模拟盘每天开盘后和收盘后会更新策略收益和基准收益
那么可能会造成这种现象: 模拟时收益曲线中有回撤, 但是 max_drawdown 可能为0.
Total Returns(策略收益)
Total Annualized Returns(策略年化收益)
Benchmark Returns(基准收益)
Benchmark Annualized Returns(基准年化收益)
Alpha(阿尔法)
投资中面临着系统性风险(即Beta)和非系统性风险(即Alpha),Alpha是投资者获得与市场波动无关的回报。比如投资者获得了15%的回报,其基准获得了10%的回报,那么Alpha或者价值增值的部分就是5%。
策略相对于风险,获得了超额收益
策略相对于风险,获得了适当收益
策略相对于风险,获得了较少收益
Beta(贝塔)
表示投资的系统性风险,反映了策略对大盘变化的敏感性。例如一个策略的Beta为1.5,则大盘涨1%的时候,策略可能涨1.5%,反之亦然;如果一个策略的Beta为-1.5,说明大盘涨1%的时候,策略可能跌1.5%,反之亦然。
投资组合和基准的走向通常反方向,如空头头寸类
投资组合和基准的走向没有相关性,如固定收益类
投资组合和基准的走向相同,但是比基准的移动幅度更小
投资组合和基准的走向相同,并且和基准的移动幅度贴近
投资组合和基准的走向相同,但是比基准的移动幅度更大
Sharpe(夏普比率)
表示每承受一单位总风险,会产生多少的超额报酬,可以同时对策略的收益与风险进行综合考虑。
Sortino(索提诺比率)
表示每承担一单位的下行风险,将会获得多少超额回报。
衡量单位超额风险带来的超额收益。信息比率越大,说明该策略单位跟踪误差所获得的超额收益越高,因此,信息比率较大的策略的表现要优于信息比率较低的基准。合理的投资目标应该是在承担适度风险下,尽可能追求高信息比率。
Algorithm Volatility(策略波动率)
用来测量策略的风险性,波动越大代表策略风险越高。
Benchmark Volatility(基准波动率)
用来测量基准的风险性,波动越大代表基准风险越高。
Max Drawdown(最大回撤)
描述策略可能出现的最糟糕的情况,最极端可能的亏损情况。
策略收益下行波动率。和普通收益波动率相比,下行标准差区分了好的和坏的波动。
盈利次数在总交易次数中的占比。
盈利超过基准的日数在总交易数中的占比。
周期盈利亏损的比例。
开盘前(9:20)运行:
//中指定time=’before_open’运行的函数
//中在指定交易时间执行的函数, 执行时间为这分钟的第一秒. 例如: run_daily(func, '14:50') 会在每天的14:50:00(精确到秒)执行
按日回测/模拟, 在9:30:00(精确到秒)运行, 为昨天的天数据
按分钟回测/模拟, 在每分钟的第一秒运行, 每天执行240次, 不包括11:30和15:00这两分钟, 是上一分钟的分钟数据. 例如: 当天第一次执行是在9:30:00, 是昨天14:59这一分钟的分钟数据, 当天最后一次执行是在14:59:00, 是14:58这一分钟的分钟数据.
按tick模拟, 上午从9:30:00到11:29:55, 下午从13:00:00到14:59:55, 每5秒钟执行一次, 一天执行240*12次. 例如: 当天第一次执行时在9:30:00, 为昨天最后5秒(14:59:55-15:00:00)的数据(统计高开低收+成交量+成交额)
收盘后(15:00后半小时内)运行:
//中指定time=’after_close’运行的函数
同一个时间点, 总是先运行 run_XXX 指定的函数, 然后是 ,
run_XXX 指定的函数只能有一个参数 ,
不再提供, 请使用 / 获取
都是可选的, 如果不是必须的, 不要实现这些函数, 一个空函数会降低运行速度.
模拟盘注意事项
模拟盘在每天运行结束后会保存状态, 结束进程(相当于休眠). 然后在第二天恢复.
进程结束时会保存这些状态:
用户账户, 持仓
对象. 注意
g 中以 ‘__’ 开头的变量将被忽略, 不会被保存
g 中不能序列化的变量不会被保存, 重启后会不存在. 如果你写了如下的代码:
def initialize(context):
g.query = query(valuation)
将不能被保存, 因为 query() 返回的对象并不能被持久化. 重启后也不会再执行 , 使用 g.query 将会抛出 AttributeError 异常
正确的做法是, 在
中初始化它, 并且名字以 ‘__’ 开头.
def process_initialize(context):
g.__query = query(valuation)
注意: 涉及到IO(打开的文件, 网络连接, 数据库连接)的对象是不能被序列化的:
query(valuation) : 数据库连接
open("some/path") : 打开的文件
requests.get('') : 网络连接
对象, 处理方式跟
为了兼容老旧的代码, 我们会保存在函数外定义的全局变量. 但是不推荐大家直接使用全局变量.
b = '000001.XSHE'
def handle_data(context, data):
context.c = 1
a, b 同 g, context 一样, 都会被保存
请注意, 下面的变量 xxx 不会被保存:
def handle_data(context, data):
global xxx
函数外定义一下 xxx, 比如: 在
函数前加入 xxx = 0
建议大家不要在函数外定义全局变量, 取而代之, 使用
保存全局变量. 因为我们保存所有的函数外变量其实有一定风险, 比如你写了如下的代码:
from numpy import *
我们将需要保存所有的从 numpy 导入的对象, 而其中可能有一些变量是不能
序列化的, 这会导致所有全局变量都没有持久保存
为了防止恶意攻击, 序列化之后的状态大小不能超过 30M, 如果超出将在保存状态时运行失败. 当超过 20M 时日志中会有警告提示, 请注意日志.
恢复过程是这样的:
加载策略代码, 因为python是动态语言, 编译即运行, 所以全局的(在函数外写的)代码会被执行一遍.
使用保存的状态恢复 , , 和函数外定义的全局变量.
执行 , 每次启动时都会执行这个函数.
如果策略代码和上一次运行时发生了修改,而且代码中定义了
函数,则会运行
重启后不再执行
函数在整个模拟盘的生命周期中只执行一次. 即使是更改回测后,
也不会执行.
模拟盘更改回测之后上述的全局变量(包括 g 和 context 中保存的)不会丢失. 新代码中
如果需要修改原来的值, 可以在
函数里面修改, 比如, 原来代码是:
def initialize(context):
g.stock = '000001.XSHE'
def initialize(context):
g.stock = '000002.XSHE'
执行时, a 仍然是 1, g.stock 仍然是 ‘000001.XSHE’, 要修改他们的值, 必须定义 :
def after_code_changed(context):
g.stock = '000002.XSHE'
创建模拟交易时, 如果选择的日期是今天, 则从今天当前时间点开始运行, 应该在当前时间点之前运行的函数不再运行. 比如: 今天10:00创建了按天的模拟交易, 选择日期是今天, 代码中实现了 handle_data 和 after_trading_end, 则 handle_data 今天不运行, 而 after_trading_end 会在 15:10 运行
当模拟交易在A时间点失败后, 然后在B时间点”重跑”, 那么 A-B 之间的时间点应该运行的函数不再运行
因为模拟盘资源有限, 为了防止用户创建之后长期搁置浪费资源, 我们做出如下限制: 如果一个模拟盘同时满足下面条件, 则暂缓运行:
该用户连续30天没有使用GFQuant网站
没有开启微信通知
当用户重新使用网站后, 第二天会继续运行(会把之前的交易日执行一遍, 并不会跳过日期)
强烈建议模拟盘使用真实价格成交, 即调用 set_option('use_real_price', True). 更多细节请看
模拟交易和回测的差别
因为一些原因, 模拟交易现在和回测还是有些微小的差别, 具体如下:
市价单的处理:
回测: 成交量不会超过当天成交量(或当天成交量的一部分, 见 选项)
模拟: 全部成交
这会导致同样的日期同样的程序回测结果可能会和模拟交易结果不一样, 请注意
按天模拟交易暂时不支持限价单, 所有限价单会自动转成市价单
理论上对运行结果不会有影响: 模拟交易进程每天会重启(请看[模拟交易注意事项]). 回测进程一般不会重启, 如果需要重启(比如机器宕机了) 也会做和模拟交易同样的处理.
期货交割日
期货持仓到交割日,没有手动交割,系统会以当天结算价平仓, 没有手续费, 不会有交易记录.
T+1, 当日融的券当日不能还
还券时要扣除利息
直接还券时, 可以使用当日买入的券还(不受T+1限制), 且优先使用当日买入的券还
【取数据函数】【其它函数】目录中带有”?” 标识的API是 "回测环境/模拟"专用的API,不能在研究模块中调用。整个 【jqdata 模块】在研究环境与回测环境下都可以使用.
所有价格单位是元
所有时间都是北京时间, 时区:UTC+8
所有时间都是对象
每日结束时自动撤销所有未完成订单
下文中提到 Context, SecurityUnitData,
Portfolio,
Order 对象都是只读的, 尝试修改他们会报错或者无效.
没有python基础的同学请注意, 有的函数的定义中, 某些参数是有值的, 这个值是参数的默认值, 这个参数是可选的, 可以不传.
如需使用分仓操作,请看.
策略设置函数
set_benchmark - 设置基准
set_benchmark(security)
默认我们选定了沪深300指数的每日价格作为判断您策略好坏和一系列风险值计算的基准. 您也可以使用指定其他股票/指数/ETF的价格作为基准。注意:这个函数只能在initialize中调用。
security:股票/指数/ETF代码
set_benchmark('600000.XSHG')
set_order_cost - 设置佣金/印花税
set_order_cost(cost, type)
指定每笔交易要收取的手续费, 系统会根据用户指定的费率计算每笔交易的手续费
cost: OrderCost 对象
open_tax,买入时印花税 (只股票类标的收取,基金与期货不收)
close_tax,卖出时印花税 (只股票类标的收取,基金与期货不收)
open_commission,买入时佣金
close_commission,
卖出时佣金
close_today_commission,
平今仓佣金
min_commission, 最低佣金,不包含印花税
type: 股票、基金或金融期货,’stock’/ ‘fund’ / ‘index_futures’
默认与示例
set_order_cost(OrderCost(open_tax=0, close_tax=0.001, open_commission=0.0003, close_commission=0.0003, close_today_commission=0, min_commission=5), type='stock')
set_order_cost(OrderCost(open_tax=0, close_tax=0, open_commission=0.000023, close_commission=0.000023, close_today_commission=0.0023, min_commission=0), type='index_futures')
注:期货持仓到交割日会以当天结算价平仓, 没有手续费, 不会有交易记录.
set_slippage - 设置滑点
set_slippage(object)
设定滑点,回测/模拟时有效.
当您下单后, 真实的成交价格与下单时预期的价格总会有一定偏差, 因此我们加入了滑点模式来帮您更好的模拟真实市场的表现. 我们暂时只支持固定滑点
当您使用固定滑点的时候, 我们认为您的落单的多少并不会影响您最后的成交价格. 您只需要指定一个价差,
当您下达一个买单指令的时候, 成交的价格等于当时(您执行order函数所在的单位时间)的平均价格加上价差的一半;当您下达一个卖出指令的时候,卖出的价格等于当时的平均价格减去价差的一半.
价差可以设定为一个固定值或者按照百分比设定。
这个价差可以是一个固定的值(比如0.02元, 交易时加减0.01元), 设定方式为:FixedSlippage(0.02)
这个价差可以是是当时价格的一个百分比(比如0.2%, 交易时加减当时价格的0.1%), 设定方式为:PriceRelatedSlippage(0.002)
set_slippage(FixedSlippage(0.02))
set_slippage(PriceRelatedSlippage(0.002))
注:如果您没有调用 set_slippage 函数, 系统默认的滑点是 PriceRelatedSlippage(0.00246)
设置动态复权(真实价格)模式
set_option('use_real_price', value)
该设定必须在中调用
设置是否开启动态复权(真实价格)模式,默认是False(主要是为了让旧的策略不会出错).
value: True / Flase
set_option('use_real_price', True)
是否开启动态复权对于回测及模拟交易的影响:
开启,value 值为 True: 回测过程中:
每天看到的当天的价格都是真实的(不复权的)
使用真实的价格下单, 交易详情和持仓详情里看到的都是真实价格
为了让编写代码简单, 通过///.mavg/vwap 等API
拿到的都是基于当天日期的前复权价格. 比如: 回测运行到了这一天, 那么history(3, '1d', 'close')取得的就是你穿越到这一天所看到的前复权价格. 另一方面, 你在不同日期调用 ///.mavg/vwap 返回的价格可能是不一样的, 因为我们在不同日期看到的前复权价格是不一样的. 所以不要跨日期缓存这些API返回的结果.
每到新的一天, 如果持仓中有股票发生了拆合或者分红或者其他可能影响复权因子的情形, 我们会根据复权因子自动调整股票的数量, 如果调整后的数量是小数, 则向下取整到整数, 最后为了保证.portfolio.portfolio_value不变, .portfolio.cash可能有略微调整.
如上所说, 不要跨日期缓存//这些API返回的结果
开启真实价格回测之后, 回测结果可能会之前不一样, 因为交易时买入数量必须是100的倍数, 使用前复权价格和实际价格能买入的数量是不一样的.
如果想通过 history 拿到昨天的真实价格, 还是需要用取得价格除以factor, 因为可能今天发生了拆合分红, 导致拿到的昨天的价格是相对于今天的前复权价格.
s = '000001.XSHE'
df = attribute_history(s, 1, '1d', fields=['close', 'factor'])
real_close = df['close'][-1] / df['factor'][-1]
关闭,value 值为 False: 此选项的核心是选定一个日期作为基准, 保证这个日期的价格是真实价格, 然后调整其他日期的价格. 最终保证所有价格是连续的, 在回测或者模拟交易过程中不同日期看到的价格是一致的. 下面分回测和模拟交易单独做介绍:
回测: 基准日期是建立回测的日期, 回测过程中所看到的所有价格都是基于此日期的前复权价格. 比如说, 我昨天跑了一个回测, 那么回测过程所有价格都是在昨天所看到的前复权价格. 这会导致两个问题:
回测过程中使用了前复权价格下单, 这是违背真实场景的, 不能对接实盘的.
不同的日期建立的回测跑出来的结果可能会有差异, 因为如果这两次回测之间回测的股票发生了拆合或者分红, 会导致回测中看到前复权价格会不一致.
模拟交易: 基准日期是建立模拟交易的日期, 模拟交易过程所看到的所有价格都是基于此日期调整过的. 为了方便计算, 我举一个虚拟的例子: 某只股票在如下三个日期的实际价格和后复权因子分别是:
后复权因子
如果你在 09-01 建立了一个模拟交易, 你在不同日期看到的所有价格都是 1
如果你在 10-01 建立了一个模拟交易, 你在不同日期看到的所有价格都是 2
如果你在 11-01 建立了一个模拟交易, 你在不同日期看到的所有价格都是 4
为了更好的模拟, 建议大家都设成 True. 将来对接实盘交易时, 此选项会强制设成 True
注意: 设置 use_real_price 为 True之后, 如下的按天回测的代码是不对的:
def initialize(context):
g.cached_data = []
g.s = '000001.XSHE'
def handle_data(content, data):
g.cached_data.append(data)
if len(g.cached_data) & 1:
if g.cached_data[-1][g.s].close & g.cached_data[-2][g.s].close * 1.05:
order(g.s, 1000)
设置成交量比例
set_option('order_volume_ratio', value)
设定成交量比例,根据实际行情限制每个订单的成交量.
value: value 是一个 float 值, 根据实际行情限制每个订单的成交量.
对于每一笔订单:
如果是市价单, 成交量不超过: 每日成交量 * value
如果是限价单, 时设定分价表中每一个价格的成交量的比率, 假设某一分钟分价表如下:
撮合时, 按价格 10.0 成交 10 * value 股, 按价格 10.1 成交 11 * value 股, 按价格 10.2 成交 12 * value 股
set_option('order_volume_ratio', 0.25)
set_commission(已废弃)
set_commission(object)
指定每笔交易要收取的手续费, 系统会根据用户指定的费率计算每笔交易的手续费
object: 一个PerTrade对象
PerTrade.buy_cost,买入时手续费
PerTrade.sell_cost,卖出时手续费
PerTrade.min_cost,最少的手续费
默认:PerTrade(buy_cost=0.0003, sell_cost=0.0013, min_cost=5)
每笔交易时的手续费是, 买入时万分之三,卖出时万分之三加千分之一印花税, 每笔交易最低扣5块钱
set_universe(已废弃)
set_universe(security_list)
设置或者更新此策略要操作的股票池. 请注意:
该函数已废弃,现在只用于设定history函数的默认security_list, 除此之外并无其他用处。
当前持仓的股票仍然会在股票池里, 所以最终的股票池包括security_list和持仓股票
可以通过context.universe拿到当前的股票池, 如上所述, 调用set_universe之后, context.universe不一定等于security_list
security_list: 股票列表
set_universe(['000001.XSHE', '600000.XSHG'])
取数据函数
get_price - 获取历史数据
get_price(security, start_date=None, end_date=None, frequency='daily', fields=None, skip_paused=False, fq='pre', count=None)
获取一支或者多只股票的行情数据, 按天或者按分钟,这里请在使用时注意防止未来函数
关于停牌: 因为此API可以获取多只股票的数据, 可能有的股票停牌有的没有, 为了保持时间轴的一致, 我们默认没有跳过停牌的日期, 停牌时使用停牌前的数据填充(请看
的 paused 属性). 如想跳过, 请使用 skip_paused=True 参数, 同时只取一只股票的信息
security: 一支股票代码或者一个股票代码的list
count: 与 start_date 二选一,不可同时使用. 数量, 返回的结果集的行数, 即表示获取 end_date 之前几个 frequency 的数据
start_date: 与 count 二选一,不可同时使用. 字符串或者 / 对象, 开始时间.
如果 count 和 start_date 参数都没有, 则 start_date 生效, 值是 ‘’. 注意:
当取分钟数据时, 时间可以精确到分钟, 比如: 传入 datetime.datetime(, 10, 0, 0) 或者 ' 10:00:00'.
当取分钟数据时, 如果只传入日期, 则日内时间是当日的 00:00:00.
当取天数据时, 传入的日内时间会被忽略
end_date: 格式同上, 结束时间, 默认是’’, 包含此日期. 注意: 当取分钟数据时, 如果 end_date 只有日期, 则日内时间等同于 00:00:00, 所以返回的数据是不包括 end_date 这一天的.
frequency: 单位时间长度, 几天或者几分钟, 现在支持’Xd’,’Xm’, ‘daily’(等同于’1d’), ‘minute’(等同于’1m’), X是一个正整数, 分别表示X天和X分钟(不论是按天还是按分钟回测都能拿到这两种单位的数据), 注意, 当X & 1时, fields只支持[‘open’, ‘close’, ‘high’, ‘low’, ‘volume’, ‘money’]这几个标准字段. 默认值是daily
fields: 字符串list, 选择要获取的行情数据字段, 默认是None(表示[‘open’, ‘close’, ‘high’, ‘low’, ‘volume’, ‘money’]这几个标准字段), 支持里面的所有基本属性,,包含:[‘open’, ’ close’, ‘low’, ‘high’, ‘volume’, ‘money’, ‘factor’, ‘high_limit’,’
low_limit’, ‘avg’, ’ pre_close’, ‘paused’]
skip_paused: 是否跳过不交易日期(包括停牌, 未上市或者退市后的日期). 如果不跳过, 停牌时会使用停牌前的数据填充(具体请看SecurityUnitData的paused属性), 上市前或者退市后数据都为 nan, 但要注意:
默认为 False
当 skip_paused 是 True 时, 只能取一只股票的信息
fq: 复权选项:
'pre': 前复权(根据’use_real_price’选项不同含义会有所不同, 参见), 默认是前复权
None: 不复权, 返回实际价格
'post': 后复权
请注意, 为了方便比较一只股票的多个属性, 同时也满足对比多只股票的一个属性的需求, 我们在security参数是一只股票和多只股票时返回的结构完全不一样
如果是一支股票, 则返回对象, 行索引是对象, 列索引是行情字段名字, 比如’open’/’close’. 比如: get_price('000300.XSHG')[:2] 返回:
如果是多支股票, 则返回对象, 里面是很多对象, 索引是行情字段(open/close/…), 每个的行索引是对象, 列索引是股票代号. 比如get_price(['000300.XSHG', '000001.XSHE'])['open'][:2]返回:
000300.XSHG
000001.XSHE
df = get_price('000001.XSHE')
df = get_price('000001.XSHE', start_date='', end_date=' 23:00:00', frequency='minute', fields=['open', 'close'])
df = get_price('000001.XSHE', count = 2, end_date='', frequency='daily', fields=['open', 'close'])
df = get_price('000001.XSHE', start_date=' 14:00:00', end_date=' 12:00:00', frequency='1m')
get_price(get_index_stocks('000903.XSHG'))
df_open = panel['open']
df_volume = panel['volume']
df_open['000001.XSHE']
history ? - 获取历史数据
history(count, unit='1d', field='avg', security_list=None, df=True, skip_paused=False, fq='pre')
回测环境/模拟专用API
查看历史的行情数据。
关于停牌: 因为获取了多只股票的数据, 可能有的股票停牌有的没有, 为了保持时间轴的一致, 我们默认没有跳过停牌的日期, 停牌时使用停牌前的数据填充(请看的paused属性). 如想跳过, 请使用 skip_paused=True 参数
当取天数据时, 不包括当天的, 即使是在收盘后
count: 数量, 返回的结果集的行数
unit: 单位时间长度, 几天或者几分钟, 现在支持’Xd’,’Xm’, X是一个正整数, 分别表示X天和X分钟(不论是按天还是按分钟回测都能拿到这两种单位的数据), 注意, 当X & 1时, field只支持[‘open’, ‘close’, ‘high’, ‘low’, ‘volume’, ‘money’]这几个标准字段.
field: 要获取的数据类型, 支持里面的所有基本属性,,包含:[‘open’, ’ close’, ‘low’, ‘high’, ‘volume’, ‘money’, ‘factor’, ‘high_limit’,’
low_limit’, ‘avg’, ’ pre_close’, ‘paused’]
security_list: 要获取数据的股票列表, None表示universe中选中的所有股票
df: 若是True, 返回, 否则返回一个dict, 具体请看下面的返回值介绍. 默认是True.
我们之所以增加df参数, 是因为创建和操作速度太慢, 很多情况并不需要使用它. 为了保持向上兼容, df默认是True, 但是如果你的回测速度很慢, 请考虑把df设成False.
skip_paused: 是否跳过不交易日期(包括停牌, 未上市或者退市后的日期). 如果不跳过, 停牌时会使用停牌前的数据填充(具体请看SecurityUnitData的paused属性), 上市前或者退市后数据都为 nan, 但要注意:
默认为 False
如果跳过, 则行索引不再是日期, 因为不同股票的实际交易日期可能不一样
fq: 复权选项:
'pre': 前复权(根据’use_real_price’选项不同含义会有所不同, 参见), 默认是前复权
None: 不复权, 返回实际价格
'post': 后复权
对象, 行索引是对象, 列索引是股票代号. 比如: 如果当前时间是, universe是[‘000300.XSHG’, ‘000001.XSHE’], history(2, '1d', 'open')将返回:
000300.XSHG
000001.XSHE
关于numpy和pandas, 请看下面的第三方库介绍
dict, key是股票代码, 值是一个numpy数组, 对应上面的DataFrame的每一列, 例如history(2, '1d', 'open', df=False)将返回:
'000300.XSHG': array([ 3566.09,
3608.43]),
'000001.XSHE': array([ 13.21,
h = history(5, security_list=['000001.XSHE', '000002.XSHE'])
h['000001.XSHE']
h['000001.XSHE'][-1]
h.iloc[-1]
h.iloc[-1]['000001.XSHE']
set_universe(['000001.XSHE'])
history(5)
history(5, '1m')
history(5, '1m', 'price')
history(5, '1m', 'volume')
history(5, '1m', 'price', ['000001.XSHE'])
h = history(5, security_list=['000001.XSHE', '000002.XSHE'], df=False)
h['000001.XSHE']
h['000001.XSHE'][0]
h['000001.XSHE'][-1]
h['000001.XSHE'].sum()
h['000001.XSHE'].mean()
attribute_history
? - 获取历史数据
attribute_history(security, count, unit='1d',
fields=['open', 'close', 'high', 'low', 'volume', 'money'],
skip_paused=True, df=True, fq='pre')
回测环境/模拟专用API
查看某一支股票的历史数据, 可以选这只股票的多个属性, 默认跳过停牌日期.
当取天数据时, 不包括当天的, 即使是在收盘后
security: 股票代码
count: 数量, 返回的结果集的行数
unit: 单位时间长度, 几天或者几分钟, 现在支持 ‘Xd’, ‘Xm’, X是一个正整数, 分别表示X天和X分钟(不论是按天还是按分钟回测都能拿到这两种单位的数据), 注意, 当 X & 1 时, field 只支持 [‘open’, ‘close’, ‘high’, ‘low’, ‘volume’, ‘money’] 这几个标准字段.
fields: 股票属性的list, 支持里面的所有基本属性,包含:[‘open’, ’ close’, ‘low’, ‘high’, ‘volume’, ‘money’, ‘factor’, ‘high_limit’,’
low_limit’, ‘avg’, ’ pre_close’, ‘paused’]
skip_paused: 是否跳过不交易日期(包括停牌, 未上市或者退市后的日期). 如果不跳过, 停牌时会使用停牌前的数据填充(具体请看的paused属性), 上市前或者退市后数据都为 nan, 默认是True
df: 若是True, 返回, 否则返回一个dict, 具体请看下面的返回值介绍. 默认是True.我们之所以增加df参数, 是因为创建和操作速度太慢, 很多情况并不需要使用它. 为了保持向上兼容, df默认是True, 但是如果你的回测速度很慢, 请考虑把df设成False.
fq: 复权选项:
'pre': 前复权(根据’use_real_price’选项不同含义会有所不同, 参见), 默认是前复权
None: 不复权, 返回实际价格
'post': 后复权
对象, 行索引是对象, 列索引是属性名字. 比如: 如果当前时间是, attribute_history('000300.XSHG', 2)将返回:
dict, key是股票代码, 值是一个numpy数组, 对应上面的DataFrame的每一列, 例如attribute_history('000300.XSHG', 2, df=False)将返回:
'volume': array([
'money': array([
'high': array([ 3669.04,
3683.23]),
'low': array([ 3551.51,
3587.23]),
'close': array([ 3641.54,
3641.06]),
'open': array([ 3566.09,
stock = '000001.XSHE'
h = attribute_history(stock, 5, '1d', ('open','close', 'volume', 'factor'))
h['close'][-1]
h['open'].mean()
h['open']['']
h['open'][datetime.date(2015, 1, 5)]
h['open'][datetime.datetime(2015, 1, 5)]
h.iloc[-1]
h.iloc[-1]['open']
h.loc['']['open']
h = h[h['volume'] & 1000000]
h['open'] = h['open']/h['factor']
h['close'] = h['close']/h['factor']
get_current_data
? - 获取当前时间数据
get_current_data()
回测环境/模拟专用API
获取当前单位时间(当天/当前分钟)的涨跌停价, 是否停牌,当天的开盘价等。
回测时, 通过 API 获取到的是前一个单位时间(天/分钟)的数据, 而有些数据, 我们在这个单位时间是知道的, 比如涨跌停价, 是否停牌, 当天的开盘价. 我们添加了这个API用来获取这些数据.
现在不需要传入, 即使传入了, 返回的 dict 也是空的, dict 的 value 会按需获取.
一个dict, 其中 key 是股票代码, value 是拥有如下属性的对象
high_limit: 涨停价
low_limit: 跌停价
paused: 是否停止或者暂停了交易, 当停牌、未上市或者退市后返回 True
is_st: 是否是 ST(包括ST, *ST),是则返回 True,否则返回 False
day_open: 当天开盘价
name: 股票现在的名称, 可以用这个来判断股票当天是否是 ST, *ST, 是否快要退市
industry_code: 股票现在所属行业代码, 参见
为了加速, 返回的 dict 里面的数据是按需获取的, dict 初始是空的, 当你使用 current_data[security] 时(假设 current_data 是返回的 dict), 该 security 的数据才会被获取.
返回的结果只在当天有效, 请不要存起来到隔天再用
def handle_data(context, data):
current_data = get_current_data()
print current_data
print current_data['000001.XSHE']
print current_data['000001.XSHE'].paused
print current_data['000001.XSHE'].day_open
get_extras - 获取基金净值/期货结算价等
get_extras(info, security_list, start_date='', end_date='', df=True, count=None)
得到多只标的在一段时间的如下额外的数据:
is_st: 是否是ST,是则返回 True,否则返回 False
acc_net_value: 基金累计净值
unit_net_value: 基金单位净值
futures_sett_price: 期货结算价
futures_positions: 期货持仓量
info: [‘is_st’, ‘acc_net_value’, ‘unit_net_value’, ‘futures_sett_price’, ‘futures_positions’] 中的一个
security_list: 股票列表
start_date/end_date: 开始结束日期, 同
df: 返回对象还是一个dict, 同
count: 数量, 与 start_date 二选一, 不可同时使用, 必须大于 0. 表示取 end_date 往前的 count 个交易日的数据
对象, 列索引是股票代号, 行索引是, 比如get_extras('acc_net_value', ['510300.XSHG', '510050.XSHG'], start_date='', end_date='')返回:
510300.XSHG
510050.XSHG
get_extras('is_st', ['000001.XSHE', '000018.XSHE'], start_date='', end_date='')返回:
000001.XSHE
000018.XSHE
一个dict, key是基金代号, value是, 比如get_extras('acc_net_value', ['510300.XSHG', '510050.XSHG'], start_date='', end_date='', df=False) 返回:
u'510050.XSHG': array([ 3.119,
u'510300.XSHG': array([ 1.395 ,
get_fundamentals - 查询财务数据
get_fundamentals(query_object, date=None, statDate=None)
查询财务数据,详细的数据字段描述请点击查看
date和statDate参数只能传入一个:
传入date时, 查询指定日期date收盘后所能看到的最近(对市值表来说, 最近一天, 对其他表来说, 最近一个季度)的数据, 我们会查找上市公司在这个日期之前(包括此日期)发布的数据, 不会有未来函数.
传入statDate时, 查询 statDate 指定的季度或者年份的财务数据. 注意:
由于公司发布财报不及时, 一般是看不到当季度或年份的财务报表的, 回测中使用这个数据可能会有未来函数, 请注意规避.
由于估值表每天更新, 当按季度或者年份查询时, 返回季度或者年份最后一天的数据
对于年报数据, 我们目前只有现金流表和利润表, 当查询其他表时, 会返回该年份最后一个季报的数据
当 date 和 statDate 都不传入时, 相当于使用 date 参数, date 的默认值下面会描述.
query_object: 一个sqlalchemy.orm.query.Query对象(), 可以通过全局的 query 函数获取 Query 对象
date: 查询日期, 一个字符串(格式类似’’)或者/对象, 可以是None, 使用默认日期. 这个默认日期在回测和研究模块上有点差别:
回测模块: 默认值会随着回测日期变化而变化, 等于 context.current_dt 的前一天(实际生活中我们只能看到前一天的财报和市值数据, 所以要用前一天)
研究模块: 使用平台财务数据的最新日期, 一般是昨天.
如果传入的 date 不是交易日, 则使用这个日期之前的最近的一个交易日
statDate: 财报统计的季度或者年份, 一个字符串, 有两种格式:
季度: 格式是: 年 + ‘q’ + 季度序号, 例如: ‘2015q1’, ‘2013q4’.
年份: 格式就是年份的数字, 例如: ‘2015’, ‘2016’.
返回一个 , 每一行对应数据库返回的每一行(可能是几个表的联合查询结果的一行), 列索引是你查询的所有字段
1. 为了防止返回数据量过大, 我们每次最多返回10000行
2. 当相关股票上市前、退市后,财务数据返回各字段为空
q = query(
valuation.code == '000001.XSHE'
df = get_fundamentals(q, '')
(df['market_cap'][0])
df = get_fundamentals(query(
valuation, income
valuation.code.in_(['000001.XSHE', '600000.XSHG'])
), date='')
df = get_fundamentals(query(
valuation.code, valuation.market_cap, valuation.pe_ratio, income.total_operating_revenue
valuation.market_cap & 1000,
valuation.pe_ratio & 10,
income.total_operating_revenue & 2e10
).order_by(
valuation.market_cap.desc()
), date='')
from sqlalchemy.sql.expression import or_
get_fundamentals(query(
valuation.code
valuation.market_cap & 1000,
valuation.pe_ratio & 10
q = query(
income.statDate,
income.code,
income.basic_eps,
balance.cash_equivalents,
cash_flow.goods_sale_and_service_render_cash
income.code == '000001.XSHE',
rets = [get_fundamentals(q, statDate='2014q'+str(i)) for i in range(1, 5)]
q = query(
income.statDate,
income.code,
income.basic_eps,
cash_flow.goods_sale_and_service_render_cash
income.code == '000001.XSHE',
ret = get_fundamentals(q, statDate='2014')
gfdata.run_query - 查询广发大数据
from jqdata.tp.db import gfdata
gfdata.run_query(query_object)
查询广发大数据
query_object: 一个sqlalchemy.orm.query.Query对象(), 可以通过全局的query函数获取Query对象
返回一个, 每一行对应数据库返回的每一行, 列索引是你查询的所有字段
1. 为了防止返回数据量过大, 我们每次最多返回3000行
2. 不能进行连表查询,即同时查询多张表内数据
from jqdata.tp.db import gfdata
df = gfdata.run_query(query(gfdata.stock_valuation).limit(10))
get_index_stocks - 获取指数成份股
get_index_stocks(index_symbol, date=None)
获取一个指数给定日期在平台可交易的成分股列表,请点击查看指数信息
index_symbol: 指数代码
date: 查询日期, 一个字符串(格式类似’’)或者/对象, 可以是None, 使用默认日期. 这个默认日期在回测和研究模块上有点差别:
回测模块: 默认值会随着回测日期变化而变化, 等于context.current_dt
研究模块: 默认是今天
返回股票代码的list
stocks = get_index_stocks('000300.XSHG')
get_industry_stocks - 获取行业成份股
get_industry_stocks(industry_code, date=None)
获取在给定日期一个行业的所有股票,行业分类列表见数据页面-。
industry_code: 行业编码
date: 查询日期, 一个字符串(格式类似’’)或者/对象, 可以是None, 使用默认日期. 这个默认日期在回测和研究模块上有点差别:
回测模块: 默认值会随着回测日期变化而变化, 等于context.current_dt
研究模块: 默认是今天
返回股票代码的list
stocks = get_industry_stocks('I64')
get_concept_stocks - 获取概念成份股
get_concept_stocks(concept_code, date=None)
获取在给定日期一个概念板块的所有股票,概念板块分类列表见数据页面-。
concept_code: 概念板块编码
date: 查询日期, 一个字符串(格式类似’’)或者/对象, 可以是None, 使用默认日期. 这个默认日期在回测和研究模块上有点差别:
回测模块: 默认值会随着回测日期变化而变化, 等于context.current_dt
研究模块: 默认是今天
返回股票代码的list
stocks = get_concept_stocks('GN036')
get_all_securities - 获取所有标的信息
get_all_securities(types=[], date=None)
获取平台支持的所有股票、基金、指数、期货信息
types: list: 用来过滤securities的类型, list元素可选: ‘stock’, ‘fund’, ‘index’, ‘futures’, ‘etf’, ‘lof’, ‘fja’, ‘fjb’. types为空时返回所有股票, 不包括基金,指数和期货
date: 日期, 一个字符串或者 / 对象, 用于获取某日期还在上市的股票信息. 默认值为 None, 表示获取所有日期的股票信息
, 比如:get_all_securities()[:2]返回:
display_name
start_date
000001.XSHE
000002.XSHE
display_name: 中文名称
name: 缩写简称
start_date: 上市日期
end_date: 退市日期,如果没有退市则为
type: 类型,stock(股票),index(指数),etf(ETF基金),fja(分级A),fjb(分级B)
def initialize(context):
(get_all_securities())
(get_all_securities(['stock']))
stocks = list(get_all_securities(['stock']).index)
get_all_securities(['index'])
df = get_all_securities(['fund'])
get_all_securities(['futures'])
df = get_all_securities(['etf'])
df = get_all_securities(['lof'])
df = get_all_securities(['fja'])
df = get_all_securities(['fjb'])
get_all_securities(date='')
get_all_securities(['etf', 'lof'], '')
get_security_info(code)
获取股票/基金/指数的信息.
code: 证券代码
一个对象, 有如下属性:
display_name: 中文名称
name: 缩写简称
start_date: 上市日期,
end_date: 退市日期,
类型, 如果没有退市则为
type: 类型,stock(股票),index(指数),etf(ETF基金),fja(分级A),fjb(分级B)
parent: 分级基金的母基金代码
assert get_security_info('502050.XSHG').parent == '502048.XSHG'
jqdata模块
我们新增了 jqdata 模块用来提供更多数据, 如果要使用下面的 API 请先导入 jqdata 模块, 如下所示:
from jqdata import *
get_all_trade_days - 获取所有交易日
get_all_trade_days()
获取所有交易日, 不需要传入参数, 返回一个包含所有交易日的 , 每个元素为一个
get_trade_days - 获取指定范围交易日
get_trade_days(start_date=None, end_date=None, count=None)
获取指定日期范围内的所有交易日, 返回 , 包含指定的 start_date 和 end_date, 默认返回至 datatime.date.today() 的所有交易日
start_date: 开始日期, 与 count 二选一, 不可同时使用. str// 对象
end_date: 结束日期, str// 对象, 默认为 datetime.date.today()
count: 数量, 与 start_date 二选一, 不可同时使用, 必须大于 0. 表示取 end_date 往前的 count 个交易日,包含 end_date 当天。
get_mtss - 获取融资融券信息
get_mtss(security_list, start_date=None, end_date=None, fields=None, count=None)
获取一只或者多只股票在一个时间段内的融资融券信息
security_list: 一只股票代码或者一个股票代码的 list
start_date: 开始日期, 与 count 二选一, 不可同时使用. 一个字符串或者 / 对象, 默认为平台提供的数据的最早日期
end_date: 结束日期, 一个字符串或者 / 对象, 默认为 datetime.date.today()
count: 数量, 与 start_date 二选一,不可同时使用, 必须大于 0. 表示返回 end_date 之前 count 个交易日的数据, 包含 end_date
fields: 字段名或者 list, 可选. 默认为 None, 表示取全部字段, 各字段含义如下:
fin_buy_value
融资买入额
fin_refund_value
融资偿还额
sec_sell_value
融券卖出额
sec_refund_value
融券偿还额
fin_sec_value
融资融券余额
对象,默认的列索引为取得的全部字段. 如果给定了 fields 参数, 则列索引与给定的 fields 对应.
get_mtss('000001.XSHE', '', '')
get_mtss('000001.XSHE', '', '', fields=["date", "sec_code", "fin_value", "fin_buy_value"])
get_mtss('000001.XSHE', '', '', fields="sec_sell_value")
get_mtss(['000001.XSHE', '000002.XSHE', '000099.XSHE'], '', '')
get_mtss(['000001.XSHE', '000002.XSHE', '000099.XSHE'], '', '', fields=["date", "sec_code", "sec_value", "fin_buy_value", "sec_sell_value"])
get_mtss('000001.XSHE', end_date="", count=20)
get_mtss('000001.XSHE', count=20)
get_money_flow - 获取资金流信息
get_money_flow(security_list, start_date=None, end_date=None, fields=None, count=None)
获取一只或者多只股票在一个时间段内的资金流向数据
security_list: 一只股票代码或者一个股票代码的 list
start_date: 开始日期, 与 count 二选一, 不可同时使用, 一个字符串或者 / 对象, 默认为平台提供的数据的最早日期
end_date: 结束日期, 一个字符串或者 / 对象, 默认为 datetime.date.today()
count: 数量, 与 start_date 二选一,不可同时使用, 必须大于 0. 表示返回 end_date 之前 count 个交易日的数据, 包含 end_date
fields: 字段名或者 list, 可选. 默认为 None, 表示取全部字段, 各字段含义如下:
change_pct
net_amount_main
主力净额(万)
主力净额 = 超大单净额 + 大单净额
net_pct_main
主力净占比(%)
主力净占比 = 主力净额 / 成交额
net_amount_xl
超大单净额(万)
超大单:大于等于50万股或者100万元的成交单
net_pct_xl
超大单净占比(%)
超大单净占比 = 超大单净额 / 成交额
net_amount_l
大单净额(万)
大单:大于等于10万股或则20万元且小于50万股或者100万元的成交单
大单净占比(%)
大单净占比 = 大单净额 / 成交额
net_amount_m
中单净额(万)
中单:大于等于2万股或者4万元且小于10万股或则20万元的成交单
中单净占比(%)
中单净占比 = 中单净额 / 成交额
net_amount_s
小单净额(万)
小单:小于2万股或者4万元的成交单
小单净占比(%)
小单净占比 = 小单净额 / 成交额
对象,默认的列索引为取得的全部字段. 如果给定了 fields 参数, 则列索引与给定的 fields 对应.
get_money_flow('000001.XSHE', '', '')
get_money_flow('000001.XSHE', '', '', fields="change_pct")
get_money_flow(['000001.XSHE'], '', '', ["date", "sec_code", "change_pct", "net_amount_main", "net_pct_l", "net_amount_m"])
get_money_flow(['000001.XSHE', '000040.XSHE', '000099.XSHE'], '', '')
get_money_flow(['000001.XSHE', '000040.XSHE', '000099.XSHE'], '', '')
get_money_flow('000001.XSHE', end_date="", count=20)
get_money_flow('000001.XSHE', count=20)
提示:所有下单函数可以在 handle_data中 与
的 time 参数为 “every_bar”, “open”, “morning”, “night” 时使用。
order - 按股数下单
order(security, amount, style=None, side='long', pindex=0)
买卖标的。调用成功后, 您将可以调用取得所有未完成的交易, 也可以调用取消交易
security: 标的代码
amount: 交易数量, 正数表示买入, 负数表示卖出
style: 参见, None代表MarketOrder
side: ‘long’/’short’,开空单还是多单。默认为多单,股票、基金暂不支持开空单。
pindex: 在使用set_subportfolios创建了多个仓位时,指定subportfolio 的序号, 从 0 开始, 比如 0 指定第一个 subportfolio, 1 指定第二个 subportfolio,默认为0。
Order对象或者None, 如果创建订单成功, 则返回Order对象, 失败则返回None
order('000001.XSHE', 100)
order('000001.XSHE', 100, MarketOrderStyle())
order('000001.XSHE', 100, LimitOrderStyle(10.0))
可能的失败原因:
股票数量经调整后变成0 (请看下面的说明)
股票未上市或者退市
股票不存在
为股票、基金开了空单
选择了不存在的仓位号,如没有建立多个仓位,而设定pindex的数大于0
对于原因4, 我们会抛出异常停止运行, 因为我们认为这是您代码的bug.
因为下列原因, 有时候实际买入或者卖出的股票数量跟您设置的不一样,这个时候我们会在您的log中添加警告信息。
买入时会根据您当前的现金来限制您买入的数量
卖出时会根据您持有股票的数量来限制您卖出的数量
我们会遵守A股交易规则: 每次交易数量只能是100的整数倍, 但是卖光所有股票时不受这个限制
根据交易所规则, 每天结束时会取消所有未完成交易
order_target - 目标股数下单
order_target(security, amount, style=None, side='long', pindex=0)
买卖标的, 使最终标的的数量达到指定的amount
security: 标的代码
amount: 期望的最终数量
style: 参见, None代表MarketOrder
side: ‘long’/’short’,平空单还是多单。默认为多单,股票、基金暂不支持开空单。
pindex: 在使用set_subportfolios创建了多个仓位时,指定subportfolio 的序号, 从 0 开始, 比如 0为 指定第一个 subportfolio, 1 为指定第二个 subportfolio,默认为0。
Order对象或者None, 如果创建委托成功, 则返回Order对象, 失败则返回None
order_target('000001.XSHE', 0)
order_target('000001.XSHE', 100)
order_value - 按价值下单
order_value(security, value, style=None, side='long', pindex=0)
买卖价值为value的股票,金融期货暂不支持该API
security: 股票名字
value: 股票价值
style: 参见, None代表MarketOrder
side: ‘long’/’short’,平空单还是多单。默认为多单,股票、基金暂不支持开空单。
pindex: 在使用set_subportfolios创建了多个仓位时,指定subportfolio 的序号, 从 0 开始, 比如 0为 指定第一个 subportfolio, 1 为指定第二个 subportfolio,默认为0。
Order对象或者None, 如果创建委托成功, 则返回Order对象, 失败则返回None
order_value('000001.XSHE', -10000)
order_value('000001.XSHE', 10000)
order_target_value - 目标价值下单
order_target_value(security, value, style=None, side='long', pindex=0)
调整股票仓位到value价值,金融期货暂不支持该API
security: 股票名字
value: 期望的股票最终价值
style: 参见, None代表MarketOrder
side: ‘long’/’short’,平空单还是多单。默认为多单,股票、基金暂不支持开空单。
pindex: 在使用set_subportfolios创建了多个仓位时,指定subportfolio 的序号, 从 0 开始, 比如 0为 指定第一个 subportfolio, 1 为指定第二个 subportfolio,默认为0。
Order对象或者None, 如果创建委托成功, 则返回Order对象, 失败则返回None
order_target_value('000001.XSHE', 0)
order_target_value('000001.XSHE', 10000)
cancel_order - 撤单
cancel_order(order)
order: 对象或者order_id
Order对象或者None, 如果取消委托成功, 则返回Order对象, 委托不存在返回None
def after_trading_end(context):
orders = get_open_orders()
for _order in orders.values():
cancel_order(_order)
get_open_orders - 获取未完成订单
get_open_orders()
获得当天的所有未完成的订单
返回一个dict, key是order_id, value是对象
def after_trading_end(context):
orders = get_open_orders()
for _order in orders.values():
(_order.order_id)
get_orders - 获取订单信息
get_orders()
获取当天的所有订单
返回一个dict, key是order_id, value是对象
def after_trading_end(context):
orders = get_orders()
for _order in orders.values():
(_order.order_id)
get_trades - 获取成交信息
get_trades()
获取当天的所有成交记录, 一个订单可能分多次成交
返回一个dict, key是trade_id, value是对象
def after_trading_end(context):
trades = get_trades()
for _trade in trades.values():
(_trade.trade_id)
run_monthly
run_weekly
def initialize(context):
run_monthly(func, monthday, time='open', reference_security)
run_weekly(func, weekday, time='open', reference_security)
run_daily(func, time='open', reference_security)
回测环境/模拟专用API
指定每月, 每周或者每天要运行的函数, 可以在具体每月/周的第几个交易日(或者倒数第几天)的某一分钟执行. 可以在任意时间运行.
调用这些函数后, handle_data可以不实现
func: 一个函数, 此函数必须接受一个参数, 就是 context
monthday: 每月的第几个交易日, 可以是负数, 表示倒数第几个交易日
weekday: 每周的第几个交易日, 可以是负数, 表示倒数第几个交易日
time: 日内执行时间, 具体到分钟, 一个字符串, 可以是具体执行时间, 比如 “10:00”, 或者 “every_bar”, “open”, “before_open” 和 “after_close”, 他们的含义是:
every_bar: 在每一个 bar 结束后调用. 按天会在每天的开盘时调用一次,按分钟会在每天的每分钟运行,可以在该时段下单
open: 开盘的第一分钟(等同于”9:30”),可以在该时段下单
before_open: 开盘前(等同于”9:20”, 但是请不要使用直接使用此时间, 后续可能会调整)
after_close: 收盘后(半小时内运行)
morning: 早上 8:00 运行,可以在该时段下单
night: 晚上 20:00 运行,可以在该时段下单
注:当time不等于 every_bar/open/before_open/after_close/morning/night 时, 必须使用分钟级回测
reference_security: 时间的参照标的。如参照’000001.XSHG’,交易时间为9:30-15:00。如参照’IF1512.CCFX’,之后的交易时间为9:30-15:00,在此之前为9:15-15:15。
参数 func 必须是一个全局的函数, 不能是类的成员函数, 示例:
def on_week_start(context):
class MyObject(object):
def on_week_start2(self, context):
def initialize(context):
run_weekly(on_week_start, 1)
run_weekly(MyObject().on_week_start2, 1)
当 time 指定具体的几点几分时必须使用分钟级回测
通过/取天数据时, 是不包括当天的数据的(即使在15:00和after_close里面也是如此), 要取得当天数据, 只能取分钟的
这些函数可以重复调用, 比如下面的代码可以在每周的第一个交易日和最后一个交易日分别调用两个函数:
def on_week_start(context):
def on_week_end(context):
def initialize(context):
run_weekly(on_week_start, 1)
run_weekly(on_week_end, -1)
每次调用这些函数都会产生一个新的定时任务, 如果想修改或者删除旧的定时任务, 请先调用
来删除所有定时任务, 然后再添加新的.
在一月/一周交易日数不够以致于monthday/weekday无法满足时, 我们会找这周内最近的一个日期来执行, 比如, 如果某一周只有4个交易日:
若 weekday == 5, 我们会在第4个交易日执行
若 weekday == -5, 我们会在第1个交易日执行
如果要避免这样的行为, 您可以这样做:
def initialize(context):
run_weekly(weekly, 1)
def weekly(context):
if context.current_dt.isoweekday() != 1:
def weekly(context):
print 'weekly %s %s' % (context.current_dt, context.current_dt.isoweekday())
def monthly(context):
print 'monthly %s %s' % (context.current_dt, context.current_dt.month)
def daily(context):
print 'daily %s' % context.current_dt
def initialize(context):
run_monthly(monthly, 1, 'open')
run_weekly(weekly, -1, 'before_open')
run_daily(daily, 'after_close')
run_daily(daily, '10:00')
run_daily(daily, '14:00')
取消所有定时运行
unschedule_all()
画图函数record
record(**kwargs)
回测环境/模拟专用API
我们会帮您在图表上画出收益曲线和基准的收益曲线,您也可以调用record函数来描画额外的曲线。
因为我们是按天展现的,如果您使用按分钟回测,我们画出的点是您最后一次调用record的值。
很多key=&value形式的参数,key曲线名称,value为值
record(price=d.price, open=d.open, close=d.close)
record(price=100)
发送自定义消息
send_message(message, channel='weixin')
回测环境/模拟专用API
给用户自己发送消息, 暂时只支持微信消息.
message: 消息内容. 字符串.
channel: 消息渠道, 暂时只支持微信: weixin. 默认值是 weixin
True/False, 表示是否发送成功. 当发送失败时, 会在日志中显示错误信息.
要使用功能, 必须开启模拟交易的 .
此功能只能在 模拟交易 中使用, 回测中使用会直接忽略, 无任何提示.
微信消息每人每天不超过 5 条, 超出会失败.
微信消息主页只显示前 200 个字符, 点击详情可查看全部消息, 全部消息不得超过 10000 个字符.
send_message("测试消息")
log.error(content)
log.warn(content)
log.debug(content)
print content1, content2, ...
分级别打log,跟python的logging模块一致
print输出的结果等同于, 但是print后面的每一个元素会占用一行
参数可以是字符串、对象等
(history(10))
("Selling %s, amount=%s", security, amount)
print history(10), data, context.portfolio
设定log级别:log.set_level
log.set_level(name, level)
设置不同种类的log的级别, 低于这个级别的log不会输出. 所有log的默认级别是debug
name: 字符串, log种类, 必须是’order’, ‘history’, ‘strategy’中的一个, 含义分别是:
order: 调用order系列API产生的log
history: 调用history系列API(history/attribute_history/get_price)产生的log
strategy: 您自己在策略代码中打的log
level: 字符串, 必须是’debug’, ‘info’, ‘warning’, ‘error’中的一个, 级别: debug & info & warning & error
log.set_level('order', 'error')
write_file - 写文件
write_file(path, content, append=False)
写入内容到研究模块path文件, 写入后, 您可以立即在研究模块中看到这个文件
path: 相对路径, 相对于您的私有空间的根目录的路径
content: 文件内容, str或者unicode, 如果是unicode, 则会使用UTF-8编码再存储.可以是二进制内容.
append: 是否是追加模式, 当为False会清除原有文件内容,默认为False.
如果写入失败(一般是因为路径不合法), 会抛出异常
write_file("test.txt", "hello world")
import json
write_file('HS300.stocks.json', json.dumps(get_index_stocks('000300.XSHG')))
df = attribute_history('000001.XSHE', 5, '1d')
write_file('df.csv', df.to_csv(), append=False)
read_file - 读文件
read_file(path)
读取你的私有文件(您的私有文件可以在研究模块中看到)
path: 相对路径, 相对于您的私有空间的根目录的路径
返回文件的原始内容, 不做任何decode.
import json
content = read_file('HS300.stocks.json')
securities = json.loads(content)
(securities)
import pandas as pd
from six import StringIO
body=read_file("open.csv")
data=pd.read_csv(StringIO(body))
自定义python库
您可以在把.py文件放在’研究’的根目录, 然后在回测中就可以通过import的方式来引用此文件. 比如
研究根目录/mylib.py:
#-*- coding: utf-8 -*-
# 如果你的文件包含中文, 请在文件的第一行使用上面的语句指定你的文件编码
# 用到回测API请加入下面的语句
from kuanke.user_space_api import *
my_stocks = get_index_stocks('000300.XSHG')
在策略代码中:
from mylib import *
def initialize(context):
(my_stocks)
注意: 暂时只能import研究根目录下的.py文件, 还不能import子目录下的文件(比如通过 import a.b.c 来引用a/b/c.py)
研究中创建回测函数
create_backtest(algorithm_id, start_date, end_date, frequency="day", initial_cash=10000, initial_positions=None, extras=None, name=None)
通过一个策略ID从研究中创建回测,暂不支持期货回测
algorithm_id: 策略ID,从策略编辑页的 url 中获取, 比如 ‘/algorithm/index/edit?algorithmId=xxxx’,则策略ID为 xxxx
start_date: 回测开始日期
end_date: 回测结束日期
frequency: 数据频率,支持 day,minute
initial_cash: 初始资金
extras: 额外参数,一个 dict, 用于设置全局的 g 变量,如 extras={‘x’:1, ‘y’:2},则回测中 g.x = 1, g.y = 2,需要注意的是,该参数的值是在 initialize 函数执行之后才设置给 g 变量的,所以这会覆盖掉 initialize 函数中 g 变量同名属性的值
name: 回测名, 用于指定回测名称, 如果没有指定则默认采用策略名作为回测名
initial_positions: 初始持仓。持仓会根据价格换成现金加到初始资金中,如果没有给定价格则默认获取股票最近的价格。格式如下:
initial_positions = [
'security':'000001.XSHE',
'amount':'100',
'security':'000063.XSHE',
'amount':'100',
'avg_cost': '1.0'
一个字符串, 即 backtest_id
algorithm_id = "xxxx"
extra_vars = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
initial_positions = [
'security':'000001.XSHE',
'amount':'100',
'security':'000063.XSHE',
'amount':'100',
'avg_cost': '1.0'
params = {
"algorithm_id": algorithm_id,
"start_date": "",
"end_date": "",
"frequency": "day",
"initial_cash": "1000000",
"initial_positions": initial_positions,
"extras": extra_vars,
created_bt_id = create_backtest(**params)
print(created_bt_id)
研究中获取回测信息
gt = get_backtest(backtest_id)
gt.get_status():获取回测状态. 返回一个字符串,其含义分别为:
none: 未开始
running: 正在进行
done: 完成
failed: 失败
canceled: 取消
paused: 暂停
deleted: 已删除
gt.get_params():获得回测参数. 返回一个 dict, 包含调用 create_backtest 时传入的所有信

我要回帖

更多关于 xshe 的文章

 

随机推荐