本研究主要是对均线理论的内容作了分析,并详细解释了相关API的应用。
主要内容:基于均线理论的策略\n短期均线为3、中期7、长期30\n短期均线向上穿过中期均线,买入。短期均线向下穿过中期均线卖出。\n'
我们选择上证50TEF指数作为标的,是为了规避带来的风险。 初始化函数的使用: initialize 初始化函数 initialize(context) 存放当前账户/股票的持仓信息
run_daily/run_weekly/run_monthly def initialize(context): #func自己定义的函数 #按月运行 run_monthly(func,monthday,time='9:30',reference_security) #按周运行 run_weekly(func,weekday,time=' ',reference_security) #每天内何时运行 run_daily(func,time=' ',reference_security)
run_daily函数可以确定交易函数的运行周期,确定周期内的具体运行时间,具体到每天的每个时间点上,同时还可以根据参照标的来确定运行时间日级模拟中使用时,如果设置time='9:30',策略的实际运行时间在9:27-9:30之间。策略内获取到的逻辑时间(context.current_dt)仍然是9:30.主义只有在使用相同的参照标的时,定时运行函数的优先级别为:run_monthly>run_weekly>run_daily且与函数被注册的顺序无关;handle_data与handle_tick的执行顺序与前述函数无关。制定策略时候不应该依赖于这些计划任务执行的顺序。调用这些函数后,handle_data可以不实现。
参数
monthday 每月的第几个交易日,可以是负数,表示倒数第几个。开始策略的那个月会运行,开始这个月第几个交易日不是从当月第一天开始,是从开始运行当天计算,但是不会影响下个月的时间。如果超出总交易日个数,则取临近交易日。
weekday 同上
time (1)24小时内任意时间,如"10:00","1:00";(2)time="every_bar",只能在run_daily 中调用,运行时间和设置的频率一致,按天会在交易日开盘时运行一次,按分钟则会在交易时间每分钟运行。
reference_security 时间的参考标代码,字符串类型,默认为"000300.XHSG"。如参照'000300.XSHG',交易时间为9:00-15:00;如果参考'IF9999.CCFX',2016-01-01之后的交易时间为9:30-15:00,再次之前为9:15-15:15;如操劳’A9999.XDCE'.因为有夜盘,因此开始时间为21:00,结束时间为15:00.期货策略一定要修改参考指标。建议修改为对应的主力合约。
参数func必须是一个全局的函数,不能使类的成员函数
每次调用这些函数都会产生一个新的定时任务,如果想修改或者删除,需要先调用 unschedule_all 来删除所有定时任务,然后添加新的。
在一月/一周交易日不够以致于monthday/weekday无法满足时,会寻找这周最近的一个交易日来执行,比如,如果一周只有4个交易日: 若weekday==5,我们会在第4个交易日执行 若weekday==-5,我们会在第1个交易日执行
如果要避免这种行为可以:
def initialize(context): run_weekly(weekly,1) 1代表每周第一天 def weekly(context): if context.current_dt.isoweekday()!=1: #不在周一,跳过执行 return
isoweekday()判定是否在周几的某天
#导入技术指标库from jqlib.technical_analysis import *## 初始化函数,设定要操作的股票、基准等等def initialize(context): # 定义一个全局变量, 保存要操作的股票#上证50g.security = '510050.XSHG'
set_benchmark(security),默认设置沪深300为基准,如果不想设置基准,可以使用set_benchmark({"000001.XSHG":0}),策略可以正常运行,同样,security可以是一个字典,包含每只股票的权重。
set_benchmark({510050.XSHG:0.5,610099.XSHG:0.5})
# 设定上证50为基准set_benchmark('510050.XSHG')
set_option() 该函数用于多种模式:
设定动态复权模式set_option('use_real_price',True)默认为True,开启复权
set_option('order_volume_ratio', value),value为下单成交量比例值,成交量不超过全市场的百分比成交量。
set_option('match_with_order_book', value) 设定盘口撮合模式,只对模拟盘有效。value值True使用撮合模式,默认为False关闭。
还用于融资融券、期货等场景。如设定保证金比率、设定利率等。
# True为开启动态复权模式,使用真实价格交易set_option('use_real_price', True)# 设定成交量比例set_option('order_volume_ratio', 1)
股票交易手续费设置函数 set_order_cost #设置佣金/印花税 set_order_cost(cost,type,ref=None)
参数: cost: OrderCost对象 open_tax, 买入时印花税(只有股票类的收取,基金与期货不收) close_tax,卖出时的印花税(只股票类收取,基金和期货不收) open_commission,买入时佣金,申购场外仅仅的手续费 close_commision,卖出时的佣金,赎回场内基金的手续费 close_tody_commision,平今仓佣金 min_commission,最低佣金,不包括印花税
type;股票、场内基金、场内交易的货币基金、分级A基金、分级B基金、分级母基金、金融期货、期货、债券基金、股票基金、QDII基金、场外交易的货币基金、混合基金、场外基金,'stock'/'fund'/'mmf'/'fja'/'fjb'/'fjm'/'index_futures'/futures'/'bond_fund'/ 'stock_fund'/QDII_fund'/'money_market_fund'/'mixturen_fund'/open_fund'
ref:参考代码,针对特定的交易品种类别设置手续费是,必须将ref设为None:若针对特定的交易品种或者标的,需要将type设置为对应的交易品种类别,将ref设置为对应的交易品种或者标的
# 股票类交易手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱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')
# 运行函数run_daily(trade, 'every_bar')
## 交易程序def trade(context):security = g.security# 设定均线窗口长度,当前n,短期n1,中期n2,长期n3,得到当前时间current_dt=context.current_dtn1 = 3n2 = 7n3= 30
近N日内均线指标MA的获取方法 MA参数可以从jq的因子库中调用,因此需要先导入technical_analysis库 from jqdata.technical_analysis import * MA(security_list, check_date, timeperiod=5) 参数:security_list是股票列表,check_data固定日期,timeperiod确定MA均线长度 返回值是一个dict,因此在调用MA的返回值是要用ma[security]返回一个值
# 获取均价,利用MA(security_list, check_date, timeperiod=5)获取MA均线ma_n1=MA(security,current_dt,timeperiod=3)ma_n2=MA(security,current_dt,timeperiod=7)ma_n3=MA(security,current_dt,timeperiod=30)
context对象包含策略、时间、账户等信息,简单先学习我目前常用的部分。 context.protfolio,总账户信息,包括如下参数
inout_cash:累计出入金
*aliable_cash:可用资金
transferable_cash:可取资金,不包括今日卖出获利
locked-cash:挂单锁住资金
margin:保证金,股票、基金都是100%
total_value:总资产
return:总权益累计收益
context.protfolio.positions
key:账户持有证券代码 返回列表 context.protfolio.positions.vlaue value:持有某个标的的信息
context.universe :股票池 previous_date 前一个交易日 datetime.date current_dt :当前单位时间开始时间 datetime.datetime
context.subportfolio:子账号信息
# 取得当前的现金cash = context.portfolio.cash
如果短期内均价高于中期均价买入,如短期内均价低于中期均价卖出。order_value() 按价值下单
order_value(security, value, style=None, side='long', pindex=0, close_today=False)
参数:
security 为标的代码
style 为下单方式,默认我市价下单,也有限价下单, limit_price
side 默认为多单,long/short
pridex:下单子账户,默认为0
close_data:平仓字段,TRUE只平今仓,False,只平昨仓
仅对上海国际能源中心,上海期货交易所,中金所生效,其他交易所将会报错
order_target() 目标股数下单
order_value(security, amount, style=None, side='long', pindex=0, close_today=False)
参数:
amount为下单数量。
# 如果当前有余额,并且ma_n1>ma_n2,买入if ma_n1[security] > ma_n2[security]:# 用所有 cash 买入股票order_value(security, cash)# 记录这次买入log.info("Buying %s" % (security))# 如果n1日均线小于n2日均线,并且目前有头寸elif ma_n1[security] < ma_n2[security] and context.portfolio.positions[security].closeable_amount > 0:# 全部卖出order_target(security, 0)# 记录这次卖出log.info("Selling %s" % (security))
日志
log.error()
log.warn()
log.info()
log.debug()
log.set_level(name, level)
name是log种类,必须是'order', 'history', 'strategy'中的一个, 含义分别是:
order: 调用order系列API产生的log
history: 调用history系列API(history/attribute_history/get_price)产生的log
strategy: 您自己在策略代码中打的log
system:系统日志,除以上三类之外的日志
level是字符串,是error warn info debug 中的一个,debug<info<warn<error
本社区仅针对特定人员开放
查看需注册登录并通过风险意识测评
5秒后跳转登录页面...
移动端课程