美文网首页程序员
量化交易入门笔记-策略结构

量化交易入门笔记-策略结构

作者: 东南有大树 | 来源:发表于2018-10-03 21:33 被阅读15次

    今天是国庆节假期第三天,万分无聊,心想着不能白白虚度光阴,便想做点什么——做了一顿美食、和猫咪玩了一会、运动了半小时、看了会书,忽想起一直被搁浅的量化交易,心里实在忐忑不安。索性就认认真真的研究一番,也不枉这一半日的光阴。在此祝母国国运昌盛,也祝正在看本文章的你天天快乐^_^

    了解股票量化策略的组成(结构)

    单击菜单栏中的“我的策略”,然后单击“新建策略”,新建一个“股票策略”,然后进入代码编辑窗口中

    示例:

    # 导入函数库
    from jqdata import *
    
    # 初始化函数,设定基准等等
    def initialize(context):
        # 设定沪深300作为基准
        set_benchmark('000300.XSHG')
        # 开启动态复权模式(真实价格)
        set_option('use_real_price', True)
        # 输出内容到日志 log.info()
        log.info('初始函数开始运行且全局只运行一次')
        # 过滤掉order系列API产生的比error级别低的log
        # log.set_level('order', 'error')
        
        ### 股票相关设定 ###
        # 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
        set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
        
        ## 运行函数(reference_security为运行时间的参考标的;传入的标的只做种类区分,因此传入'000300.XSHG'或'510300.XSHG'是一样的)
          # 开盘前运行
        run_daily(before_market_open, time='before_open', reference_security='000300.XSHG') 
          # 开盘时运行
        run_daily(market_open, time='open', reference_security='000300.XSHG')
          # 收盘后运行
        run_daily(after_market_close, time='after_close', reference_security='000300.XSHG')
        
    ## 开盘前运行函数     
    def before_market_open(context):
        # 输出运行时间
        log.info('函数运行时间(before_market_open):'+str(context.current_dt.time()))
    
        # 给微信发送消息(添加模拟交易,并绑定微信生效)
        send_message('美好的一天~')
    
        # 要操作的股票:平安银行(g.为全局变量)
        g.security = '000001.XSHE'
        
    ## 开盘时运行函数
    def market_open(context):
        log.info('函数运行时间(market_open):'+str(context.current_dt.time()))
        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.available_cash
    
        # 如果上一时间点价格高出五天平均价1%, 则全仓买入
        if current_price > 1.01*MA5:
            # 记录这次买入
            log.info("价格高于均价 1%%, 买入 %s" % (security))
            # 用所有 cash 买入股票
            order_value(security, cash)
        # 如果上一时间点价格低于五天平均价, 则空仓卖出
        elif current_price < MA5 and context.portfolio.positions[security].closeable_amount > 0:
            # 记录这次卖出
            log.info("价格低于均价, 卖出 %s" % (security))
            # 卖出所有股票,使这只股票的最终持有量为0
            order_target(security, 0)
     
    ## 收盘后运行函数  
    def after_market_close(context):
        log.info(str('函数运行时间(after_market_close):'+str(context.current_dt.time())))
        #得到当天所有成交记录
        trades = get_trades()
        for _trade in trades.values():
            log.info('成交记录:'+str(_trade))
        log.info('一天结束')
        log.info('##############################################################')
    

    上例是自动生成的代码,其基本的结构为:

    • 导入聚宽函数库 import jqdata
    • 初始化函数 initialize
    • 开盘前运行函数 before_market_open
    • 开盘时运行函数 market_open
    • 收盘后运行函数 after_market_close

    初始化函数(initialize)

    平台代码:

    # 初始化函数,设定基准等等
    def initialize(context):
        # 设定沪深300作为基准
        set_benchmark('000300.XSHG')
        # 开启动态复权模式(真实价格)
        set_option('use_real_price', True)
        # 输出内容到日志 log.info()
        log.info('初始函数开始运行且全局只运行一次')
        # 过滤掉order系列API产生的比error级别低的log
        # log.set_level('order', 'error')
        
        ### 股票相关设定 ###
        # 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
        set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
        
        ## 运行函数(reference_security为运行时间的参考标的;传入的标的只做种类区分,因此传入'000300.XSHG'或'510300.XSHG'是一样的)
          # 开盘前运行
        run_daily(before_market_open, time='before_open', reference_security='000300.XSHG') 
          # 开盘时运行
        run_daily(market_open, time='open', reference_security='000300.XSHG')
          # 收盘后运行
        run_daily(after_market_close, time='after_close', reference_security='000300.XSHG')
    

    initialize(context),即初始化函数,在整个回测或实盘中开始执行一次用于初始化一些全局变量。参数context是一个Context对象,用以存储当前账户或股票持仓信息

    开盘前运行函数(before_market_open)

    平台代码:

    ## 开盘前运行函数     
    def before_market_open(context):
        # 输出运行时间
        log.info('函数运行时间(before_market_open):'+str(context.current_dt.time()))
    
        # 给微信发送消息(添加模拟交易,并绑定微信生效)
        send_message('美好的一天~')
    
        # 要操作的股票:平安银行(g.为全局变量)
        g.security = '000001.XSHE'
    

    该函数的名称与行为可以自定义,它是在初始化函数中被run_daily(before_market_open, time='before_open', reference_security='000300.XSHG')调用,该函数会在每天开盘前运行

    开盘时运行函数(market_open)

    平台代码:

    ## 开盘时运行函数
    def market_open(context):
        log.info('函数运行时间(market_open):'+str(context.current_dt.time()))
        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.available_cash
    
        # 如果上一时间点价格高出五天平均价1%, 则全仓买入
        if current_price > 1.01*MA5:
            # 记录这次买入
            log.info("价格高于均价 1%%, 买入 %s" % (security))
            # 用所有 cash 买入股票
            order_value(security, cash)
        # 如果上一时间点价格低于五天平均价, 则空仓卖出
        elif current_price < MA5 and context.portfolio.positions[security].closeable_amount > 0:
            # 记录这次卖出
            log.info("价格低于均价, 卖出 %s" % (security))
            # 卖出所有股票,使这只股票的最终持有量为0
            order_target(security, 0)
    

    该函数名称可以自定义,它是在初始化函数中被run_daily(market_open, time='open', reference_security='000300.XSHG')调用,会在每个交易日的开盘的整个时间内运行

    收盘后运行函数

    平台代码:

    def after_market_close(context):
        log.info(str('函数运行时间(after_market_close):'+str(context.current_dt.time())))
        #得到当天所有成交记录
        trades = get_trades()
        for _trade in trades.values():
            log.info('成交记录:'+str(_trade))
        log.info('一天结束')
        log.info('##############################################################')
    

    该函数名称可自定义,它是在初始化函数中被run_daily(after_market_close, time='after_close', reference_security='000300.XSHG')调用,会在收盘后运行

    本节内容先了解编写一个策略的框架,粗略的读一下平台的代码,以作了解

    注:本文章为个人学习笔记,参考了一些书籍与官方教程,不作任何商业用途!

    相关文章

      网友评论

        本文标题:量化交易入门笔记-策略结构

        本文链接:https://www.haomeiwen.com/subject/ijjtaftx.html