请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  数理科学 帖子:3364764 新帖:2

均线策略研究,与相关代码学习

不做外汇索罗斯发表于:5 月 10 日 03:05回复(1)

本研究主要是对均线理论的内容作了分析,并详细解释了相关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() 该函数用于多种模式:

  1. 设定动态复权模式set_option('use_real_price',True)默认为True,开启复权

  2. set_option('order_volume_ratio', value),value为下单成交量比例值,成交量不超过全市场的百分比成交量。

  3. set_option('match_with_order_book', value) 设定盘口撮合模式,只对模拟盘有效。value值True使用撮合模式,默认为False关闭。

  4. 还用于融资融券、期货等场景。如设定保证金比率、设定利率等。

    # 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,总账户信息,包括如下参数

  1. inout_cash:累计出入金

  2. *aliable_cash:可用资金

  3. transferable_cash:可取资金,不包括今日卖出获利

  4. locked-cash:挂单锁住资金

  5. margin:保证金,股票、基金都是100%

  6. total_value:总资产

  7. return:总权益累计收益

context.protfolio.positions

  1. 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

全部回复

0/140

量化课程

    移动端课程