楼主: _wallstreetcat_
1146 1

[交易策略] ATR指标 [推广有奖]

  • 0关注
  • 36粉丝

已卖:114份资源

讲师

9%

还不是VIP/贵宾

-

威望
0
论坛币
88 个
通用积分
41.5574
学术水平
14 点
热心指数
13 点
信用等级
13 点
经验
6402 点
帖子
257
精华
0
在线时间
235 小时
注册时间
2017-3-16
最后登录
2024-10-20

楼主
_wallstreetcat_ 企业认证  发表于 2021-12-1 19:03:07 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

真实波幅(TR)


公式:

其中:High是指当日最高价,Low为当日最低价,pre_close是指前一日收盘价。公式看上去很复杂,其实它要表达的就是昨日收盘以后标的的最大波幅,让我们来看看K线图里真实波幅具体指哪一部分。

从图片中我们可以很容易的看出,真实波幅就是昨天收盘后股票的最大振幅,也就是图片中最长的那一根箭头所表示的位置。

平均真实波幅(ATR)

平均真实波幅其实就是真实波幅的一个移动平均值

策略实现

指标计算:
  • 中轨:收盘价的25日移动平均值
  • 通道宽度:平均真实波幅*2
  • 上轨:中轨+通道宽度
  • 下轨:中轨-通道宽度

交易逻辑:
  • 当价格突破上轨,进场买入,建多仓
  • 当价格突破下轨,进场卖出,建空仓
  • 一个完整的交易系统需要包括仓位管理和资金配置,这里不做介绍,小编多年的期货产品管理经验(😢😢😢)认为,期货交易系统只要具备出场逻辑(这样的系统也称为正反手系统),那么无需再加止盈止损模块。

  1. # 1. 策略基本参数
  2. def prepare(context):
  3.     # 策略比较参考标准,以沪深300为例
  4.     benchmark = '000300.INDX'
复制代码
  1. # 初始化虚拟账户状态,只在第一个交易日运行
  2. def initialize(context):
  3.     # 设置是否是结算模式
  4.     context.set_need_settle(False)
  5.     # 设置手续费,PerContract 说明是每手手续费多少,分别是开仓、平昨、平今
  6.     context.set_commission(equities_commission=None, futures_commission=None) # 手续费按系统默认手续费设置
  7.     # 设置最大杠杆
  8.     context.set_max_leverage(0.6, 'fill_amap') # 这里能够设置最大杠杆
  9.     context.observation = 30
  10.     context.width = 2
  11.     context.ma_length = 25
  12.    
  13. def handle_data(context, data):
  14.    
  15.     if context.trading_day_index < context.observation: # 在30个交易日以后才开始真正运行
  16.         return
  17.     today = data.current_dt.strftime('%Y-%m-%d') # 当前交易日期
  18.     instrument = context.future_symbol(context.instruments[0]) # 交易标的
  19.     curr_po=context.portfolio.positions[instrument] # 持仓
  20.     curr_position = curr_po.amount  # 持仓数量
  21.      
  22.     price = data.current(instrument, 'price')  # 当前价格
  23.     high_price= np.array(data.history(instrument, 'high', context.observation, '1d')) # high
  24.     low_price= np.array(data.history(instrument, 'low', context.observation, '1d')) # low
  25.     close_price= np.array(data.history(instrument, 'close', context.observation, '1d')) # close_price

  26.     # 判断获取的数据中多少天是缺失数据,如果全是缺失数据,是不能计算ATR指标的
  27.     nan_num = [k for k in [np.isnan(i) for i in close_price] if k == True]
  28.     if len(nan_num) == context.observation:
  29.         return

  30.     # 创建ATR买卖信号,包括最高价,最低价,收盘价和参数timeperiod
  31.     # 注意:ATR函数使用的price必须是narray
  32.     import talib
  33.     atr = talib.ATR(high_price,low_price,close_price, timeperiod=context.ma_length)[-1]
  34.     ma = data.history(instrument, 'high', context.ma_length, '1d').mean()
  35.     high_line = ma + context.width * atr # 上轨
  36.     low_line = ma - context.width * atr # 下轨

  37.     # 交易逻辑
  38.     if price >= high_line and curr_position <=0 and data.can_trade(instrument): # 开多
  39.         order_target(instrument,  5) # order_target的含义是本次下单使得最终的仓位为目标仓位,如果是正数,那么就是多头仓位
  40.         print(today, '买入开仓')

  41.     elif price <= low_line and curr_position >= 0 and data.can_trade(instrument): # 开空
  42.         order_target(instrument,  -5) # 下单后使得仓位为5手空单
  43.         print(today, '卖出开仓')
复制代码
  1. # 3. 启动回测
  2. # 策略回测接口: https://v2.bigquant.com/docs/module_trade.html
  3. m = M.trade.v4(
  4.     instruments= ['RU1809.SHF'],
  5.     start_date='2017-11-03',
  6.     end_date='2018-07-01',
  7.     prepare=prepare,
  8.     initialize=initialize,
  9.     handle_data=handle_data,
  10.     # 买入订单以开盘价成交
  11.     order_price_field_buy='open',
  12.     # 卖出订单以开盘价成交
  13.     order_price_field_sell='open',
  14.     capital_base=1000000,
  15.     benchmark='000300.SHA',
  16.     product_type = 'future',
  17.     m_deps=np.random.rand()
  18. )
复制代码




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:observation Instruments Instrument Commission positions

沙发
_wallstreetcat_ 企业认证  发表于 2021-12-2 10:08:57

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群
GMT+8, 2025-12-24 01:44