量化交易_1

量化交易

  • 量化交易基础
  • 框架介绍
  • 策略编写

量化交易基础

  • 量化交易:量化交易是指借助现代统计学和数学方法,利用计算机技术来进行交易的证券投资方式。
  • 量化交易的分类
    • 按照投资技术分类
      • 趋势性交易
      • 市场中性
      • 高频交易
    • 按照金融产品分类
      • 股票
      • 期货
  • 量化交易历史:产生与上世纪60年代,兴起于70-80年代,繁荣于90年代。中国因为90年代才开市,所以2010年之后才兴起起来。

  • 量化交易流程

    • 获取数据
      • 公司财务,新闻数据
      • 基本行情数据
    • 数据挖掘
      • 传统分析方法,机器学习,数据挖掘方法
      • 数据处理,标准化,去极值,中性化分组回测,行业分布
    • 构建策略
      • 获取历史行情,历史持仓信息,调仓记录
      • 止盈止损单,限价单,市价单
    • 策略回测
      • 股票涨跌停,停复牌处理
      • 市场冲击,交易滑点,手续费
    • 策略分析
      • 订单分析,成交分析,持仓分析
    • 模拟交易
      • 接入实时行情,实时获取成交回报
      • 实时监控,实时归因分析
    • 实盘交易
      • 接入真实的券商账户

框架介绍

  • 本地化要钱且麻烦,一般使用云端量化分析平台
  • 国内使用米筐(RiceQuant)和聚宽(JoinQuant)

  • 为什么不自己实现量化回测框架

    • 1.本地没有完整的交易数据
    • 2.回测平台只是一个载体,重点在于快速验证策略
    • 3.证券投资机构各自使用的回测框架不同,没有通用的框架
  • 使用米筐解决方案可以做什么?

    • 1.策略研究
    • 2.历史回测
    • 3.模拟交易
    • 4.获取金融数据
  • 快速入门

    • 创建策略–》ini函数和handle_bar函数的编写–》编译策略-》运行回测查看详细回测信息

    • 设置

      • 起始日期,终止日期
      • 股票初始虚拟资金
      • 回测频率
      • 基准合约:对于回测效果的对象
      • 撮合方式:以哪种情况下的价格进行交易
      • 滑点:滑点为价格一定比例对最终成交价进行恶化。例如,0.1 的滑点将使原本10元买入的成交变成以 11 元成交

策略编写

  • 策略主体,四个函数

    • init(必须使用)
      • 初始化
      • 在整个回测期间只运行一次
    • before_trading(选择使用)
      • 做一些准备工作,如获取当前账户金额,获取股票交易数据,财务数据等
      • 每个交易日运行一次
    • handlie_bar(必须使用)
      • 买卖股票
      • 每个交易频次运行一次
    • after_trading(选择使用)
      • 收尾处理
      • 每个交易日运行一次
  • context对象,bar_dict对象

    • context对象
      • 相当于全局对象,可以在每个函数之间传递数据
      • 内置一些信息,如protfolio(投资组合信息),或者stock_account(账户信息),或者future_account(期货的账户信息),通过.信息名获得,如context.protfolio
      • 可以通过.属性名=value的形式给context对象添加新的属性信息,在各个函数之间传递
    • bar_dict对象
      • 可以展示当天的股票的数据
      • 如:bar_dict['context.pinganyinhang'].close,就会返回当日的平安银行的收盘价
  • 策略配置,主体详解

    • 配置参数
      • 基准合约:对比
      • 撮合方式:以何种方式的价格交易:当前收盘价/下一个开盘价
      • 回测日期,一般选择近5-10年
    • 数据查询函数
      • 获取指定行业,板块,指数成分股列表
        • industry(code)
        • sector(code)
        • index_components(order_book_id, date)
      • history_bars:某一合约的历史数据
        • 不能在init中调用
        • 参数:
        • order_book_id:合约代码
        • bar_count:获取的历史数据数量(天数)
      • get_fundamentals:查询财务数据
        • 参数(query, entry_date=None, interval=’1d’, report_quarter=False)
        • query:SQLAlchmey的Query对象。
        • entry_date:查询财务数据的基准日期,应早于策略当前日期。默认为策略当前日期的前一天
        • interval:chacun财务数据的间隔,默认为’1d’。
    • 定期执行机制
    • 如果在策略的执行中,并不想频繁的获取这些指标,想更改为一周更新一次,一个月更新一次?
    • 使用scheduler定时器解决这个问题
      • 种类:
        • scheduler.run_daily:每天运行
        • scheduler.run_weekly:每周运行
        • scheduler.run_monthly:每月运行
      • 注意点:
        • 1.必须在init函数中定义
        • 2.参数必须传function
        • 3.function的参数必须是:(context, bar_dict)
      • 执行顺序:
        • init
        • before_trading
        • 定时器的function
        • handle_bar
        • after_trading
    • 交易与注意事项
    • 常用交易函数
      • order_shares():指定股数交易
      • order_target_percent():目标比例下单
    • 市单价和限单价

      • 市单价:直接以参考价加入滑点影响成交,成交数量不超过当前bar的25%
      • 限单价:如果买单价格>=参考价,或卖单价格<=参考价,以参考价加入滑点影响成交(买的更高,卖的更低)。限价单会一直在订单队列中等待下一个bar数据撮合成交,直到当日收盘。
      • 滑点的设置
        • 在策略编辑页面‘更多’选项下进行滑点设置,允许的范围值是[0,1].该设置将在一定程度使最后的成交价“恶化”,也就是买的更贵,卖的更便宜。滑点方式是按照最后成交价的一定比例进行恶化。例如,设置滑点为0.1,那么如果原本买入交易的成交价为10元,则设置之后的成交价将变成11元
      • 交易过程中无论盈利亏损,都会有费用
        • 佣金,手续费–券商
        • 印花税–国家
    • 投资组合

    • 包括仓位,账户和资金
    • context.portfolio:查看投资组合所有信息
    • cash:可用资金
    • market_value:所有股票的总市值
    • total_value:账户总价值
    • positions:仓位,有哪些股票
    • 回测评价
    • 收益指标
      • 回测收益
      • 年化收益
    • 风险指标
      • 最大回测率:20%-40%
      • 夏普比率
        • 以国债等低风险或者无风险的金融产品为基准,1.0可以接受,1.5已经很好
  • 案例:金叉死叉判断策略

# 可以自己import我们平台支持的第三方python模块,比如pandas、numpy等。
import talib
# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
def init(context):
    # 定义要进行交易判断的股票
    context.jiansheyinhang = "601939.XSHG"

    # 定义长短周期
    context.long = 60
    context.short = 20

# before_trading此函数会在每天策略交易开始前被调用,当天只会被调用一次
def before_trading(context):
    # 获取历史交易数据-收盘价
    data = history_bars(context.jiansheyinhang, context.long+1, "1d", "close")

    # 计算长短均线
    context.long_value = talib.SMA(data, context.long)
    context.short_value = talib.SMA(data, context.short)

    print("长线的值为:\n",context.long_value)
    print("断线的值为:\n",context.short_value)


# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
def handle_bar(context, bar_dict):
    print("handle_bar")
    # 金叉死叉的判断
    # 卖出:昨日:短线大于长线 今日:短线小于长线
    # 买入:昨日:短线小于长线 今日:短线大于长线
    if context.short_value[-2] > context.long_value[-2] and context.short_value[-1] < context.long_value[-1]:
        order_target_percent(context.jiansheyinhang, 0)
    if context.short_value[-2] < context.long_value[-2] and context.short_value[-1] > context.long_value[-1]:
        order_target_percent(context.jiansheyinhang, 0.25)


# after_trading函数会在每天交易结束后被调用,当天只会被调用一次
def after_trading(context):
    pass

你可能感兴趣的:(学习日志)