读取context中的数据与条件判断

读取context中的数据与条件判断

JointQuant量化课堂学习笔记。原文:读取context中的数据与条件判断

context的结构

  • context是一个回测系统所建立的Context类型的对象,其中存储来如当前策略运行的时间点、所持有的股票、数量、持仓成本等数据。

  • 对象可以理解为特殊类型的变量,对象的结构往往比我们之前见过的list和dict更复杂,被定义好的对象是有名字的,比如context是一个变量,它的变量类型是一个Context类型的对象,就像dict包括key和value,Context类型的对象也包括很多属性,而且可以嵌套另一种类型的对象,结构见下图。图中只包括来主要与常用的内容,详细介绍可参考API文档。

context中的数据取用方法

例如:

1
2
3
4
5
6
# 打印可用资金
print(context.portfolio.available_cash)
# 打印运行频率
print(context.run_params.frequency)
# 打印当前单位时间的开始时间
print(context.current_dt)

例如,下面的代码运行结构为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def initialize(context):
run_daily(period, time = 'every_bar')
g.security = '000001.XSHE'
def period(context):
# 打印可用资金
print(context.portfolio.available_cash)
# 打印运行频率
print(context.run_params.frequency)
# 打印当前单位时间的开始时间
print(context.current_dt)

### 运行结果:
2016-06-01 09:30:00 - INFO - 100000.0
2016-06-01 09:30:00 - INFO - day
2016-06-01 09:30:00 - INFO - 2016-06-01 09:30:00

当要获取的对象内的数据是另一种有结构的变量类型时,比如dict或list,正常按照该变量类型进一步取用数据即可。例如,context.port和folio.positions是一个dict,我们就可以用dict的用法来使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# context.positions的含义是仓位信息,所以为了让它有数据,需要取之前买入并持有股票。
def initialize(context):
run_daily(period, time = 'every_bar')
g.security = '000001.XSHE'

def period(context):
order(g.security, 100)
# 打印所有key:
print(context.portfolio.positions.keys())
# 打印所有values:
print(context.portfolio.positions.values())
# 打印g.security的开仓均价
print(context.portfolio.positions[g.security].avg_cost)

# 执行的日志内容:
2016-07-01 09:30:00 - INFO - ['000001.XSHE']
2016-07-01 09:30:00 - INFO - [UserPosition({'total_amount': 2100, 'closeable_amount': 2000, 'price': 8.44, 'avg_cost': 8.365714285714285, 'acc_avg_cost': 8.415714285714284, 'security': '000001.XSHE'})]
2016-07-01 09:30:00 - INFO - 8.36571428571

常见的context数据:

  1. 当前时间:context.current_dt
  2. 当前时间的年-月-日的字符串格式:context.current_dt.strftime(“%Y-%m-%d”)
  3. 前一个交易日:context.pervious_date
  4. 当前可用资金:context.portfolio.available_cash
  5. 持仓价值:context.positions_value
  6. 累计收益:context.portfolio.returns
  7. 当前持有股票:context.portfolio.positions.keys()
  8. 当前持有的某股票的开仓均价:context.portfolio.positions[‘xxxxxx.xxxx’].avg_cost
  9. 当前持有的某股票的可卖持仓量:context.portfolio.positions[‘xxxxxx.xxxx’].closeable_amount

止损

  • 狭义的止损是指当亏损达到一定幅度后下单卖出该股票的操作,目的是减少进一步的亏损。广义则指在狭义的思路上衍生的复杂的减少亏损的方法。
    例如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    def initialize(context):
    run_daily(period, time = 'every_bar')
    g.security = '000001.XSHE'

    def period(context):
    order(g.security, 100)
    # 获取股票持仓成本
    cost = context.portfolio.positions[g.security].avg_cost
    # 获取股票现价
    price = context.portfolio.positions[g.security].price
    # 计算收益率
    ret = price / cost - 1
    # 打印日志
    print('成本价:%s' % cost)
    print('现价:%s' % price)
    print('收益率:%s' % ret)
    # 如果收益率效益-0.01,即亏损达到1%,清仓
    if ret < -0.01:
    order_target(g.security, 0)
    print('触发止损!')

显然这个策略很不这么样。

# Python

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×