量化交易
- 量化交易基础
- 框架介绍
- 策略编写
量化交易基础
- 量化交易:量化交易是指借助现代统计学和数学方法,利用计算机技术来进行交易的证券投资方式。
- 量化交易的分类
- 按照投资技术分类
- 趋势性交易
- 市场中性
- 高频交易
- 按照金融产品分类
- 股票
- 期货
- 按照投资技术分类
量化交易历史:产生与上世纪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(选择使用)
- 收尾处理
- 每个交易日运行一次
- init(必须使用)
context对象,bar_dict对象
- context对象
- 相当于全局对象,可以在每个函数之间传递数据
- 内置一些信息,如protfolio(投资组合信息),或者stock_account(账户信息),或者future_account(期货的账户信息),通过.信息名获得,如context.protfolio
- 可以通过.属性名=value的形式给context对象添加新的属性信息,在各个函数之间传递
- bar_dict对象
- 可以展示当天的股票的数据
- 如:
bar_dict['context.pinganyinhang'].close
,就会返回当日的平安银行的收盘价
- context对象
策略配置,主体详解
- 配置参数
- 基准合约:对比
- 撮合方式:以何种方式的价格交易:当前收盘价/下一个开盘价
- 回测日期,一般选择近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