本文是量化交易零基础入门教程中的一篇,点击蓝字链接可查看该系列详情。
通过前文的讲解,我们已经能理解最开始的那个简单的策略例子,如下:
def initialize(context):
run_daily(period,time='every_bar')
g.security = '000001.XSHE'
def period(context):
order(g.security, 100)
context是一个回测系统建立的Context类型的对象,其中存储了如当前策略运行的时间点、所持有的股票、数量、持仓成本等数据。
对象可以理解为特殊类型的变量,对象的结构往往比我们之前见过的list与dict更复杂,被定义好的对象是有名字的,比如context是一个变量,它的变量类型是一个Context类型的对象,就像dict包括key与value,Context类型的对象也包括很多属性,而且可以嵌套另一个种类型的对象,结构见下图。图中只包括了主要与常用的内容,详细介绍可以看API文档:Context对象
获取对象类型变量内包含的数据方法是用英文句号隔开,而当包含的是另一个对象时,只需在应用英文句号隔开即可,例子如下:
# 打印可用资金
print(context.portfolio.available_cash)
# 打印运行频率
print(context.run_params.frequency)
# 打印当前单位时间的开始时间
print(context.current_dt)
# 执行后日志内容如下
# 1000000.0
# day
# 2016-06-01 09:30:00
当要获取的对象内的数据是另一种有结构的变量类型时,比如dict或list,正常按照该变量类型进一步取用数据即可。例如context.portfolio.positions是一个dict,我们就可以应用之前讲过的dict 的用法来使用它,例子如下,这次给出了完整代码。
# context.portfolio.positions的含义是仓位信息,所以为了让它有数据,需要在取之前买入并持有股票。
def initialize(context):
run_daily(period,time='every_bar')
g.security = '000001.XSHE'
def period(context):
order(g.security, 100)
# 打印所有键
print(context.portfolio.positions.keys())
# 打印所有值
print(context.portfolio.positions.values())
# 打印g.security的开仓均价
print(context.portfolio.positions[g.security].avg_cost)
# 执行后日志内容如下
# ['000001.XSHE']
# [UserPosition({'avg_cost': 8.539999999999997, 'security': '000001.XSHE', 'closeable_amount': 0, 'price': 8.53, 'total_amount': 100})]
# 8.54
常用的context数据写法如下,推荐自己动手试下。
能够获取context的数据后,我们会考虑利用这些数据丰富策略的逻辑,但在此之前我们还要学习if条件判断语句,如下:
# 如果 条件1成立为 True 将执行代码块1
# 如果 条件1不成立为False,将判断条件2
# 如果 条件2成立为 True 将执行代码块2
# 如果 条件2还不成立为False,将执行代码块3
if 条件1:
代码块1
elif 条件2:
代码块2
else:
代码块3
# 注意
# elif 可以有多个连续写
# 且elif和else都可以省略
# 条件判断语句中可以嵌套条件判断语句
举几个例子:
# 打印a、b中最大值
if a>=b:
print(a)
else:
print(b)
# 判断a的正负性
if a>0:
print('正')
elif a<0:
print('负')
elif a==0:
print('零')
# 如果当前是2018-05-04,则下单买入100股平安银行
date=context.current_dt.strftime("%Y-%m-%d")
if date=='2018-05-04':
order('000001.XSHE',100)
# 判断a大小情况
if a>0:
if a<1:
print('a大于0且小于1')
else:
print('a大于等于1')
else:
print('a小于等于0')
条件判断语句比较简单,但还需说明的是条件的写法中用到的运算符:
# 写条件常用运算符:
# < 小于
# > 大于
# <= 小于等于
# >= 大于等于
# == 等于
# != 不等于
# and 与,即and两边条件同为真,则真
# or 或,即or两边条件任意一个为真,则真
# not 非,即not右侧条件为真,则假,not右侧条件为假,则真
# 以判断a是否为0的几个写法为例
# 写法1
if a!=0:
print('否')
else:
print('是')
# 写法2
if a>0 or a<0:
print('否')
else:
print('是')
# 写法2
if a>=0 and a=<0:
print('是')
else:
print('否')
# 写法3
if not a==0:
print('否')
else:
print('是')
通过context的数据可以得到持有股票的成本和现价,从而可以算出该股票的盈亏情况,运用条件判断语句根据盈亏情况从而决定是否卖出股票,从而实现止损操作,代码如下:
def initialize(context):
run_daily(period,time='every_bar')
g.security = '000001.XSHE'
def period(context):
# 买入股票
order(g.security, 100)
# 获得股票持仓成本
cost=context.portfolio.positions['000001.XSHE'].avg_cost
# 获得股票现价
price=context.portfolio.positions['000001.XSHE'].price
# 计算收益率
ret=price/cost-1
# 打印日志
print('成本价:%s' % cost)
print('现价:%s' % price)
print('收益率:%s' % ret)
# 如果收益率小于-0.01,即亏损达到1%则卖出股票,幅度可以自己调,一般10%
if ret<-0.01:
order_target('000001.XSHE',0)
print('触发止损')
查看下一篇
本社区仅针对特定人员开放
查看需注册登录并通过风险意识测评
5秒后跳转登录页面...
移动端课程