https://www.yuque.com/docs/share/d0d547f0-f24d-4916-bf48-1516d7fb7d3c?#《聚宽Context对象》
#聚宽简单的模板
def initialize(context):
run_daily(period, time='every_bar')
g.security = '000001.XSHE'
def period(context):
order(g.security, 100)
print('-----------------context的结构------------------------')
'''
context是一个回测系统建立的Context类型的对象,其中存储了如当前策略运行的时间点,所持有的股票数量、持仓成本等数据
对象可以理解为特殊类型的变量,结构要比list、dict更复杂,
定义好的对象是有名字的,比如context是一个变量,它的变量类型是Context类型的对象
就如同dict包含key和value,Context类型的对象也包含很多属性,而且可以嵌套另一种类型的对象
'''
'''
context包含:
portfolio (账户信息)(portfolio对象)
current_dt (当前单位时间的开始时间)
previous_date (前一个交易日)
run_params (此次运行的函数) (它是一个简单的对象)
universe (股票池)
portfolio包含:
positions(仓位信息)(它是一个dict)
available_cash(可用资金)
total_value(总的权益)
returns (总权益的累计收益)
starting_cash (初始资金)
position_value (持仓价值)
positions包含:
key(标的代码)
value(标的信息)(它是一个position对象)
value包含:
security(标的代码)
price (最新行情价格)
avg_cost (开仓平均)
init_time (建仓时间)
transact_time (最后交易时间)
total_amount (总仓位,但不包括挂单冻结仓位)
closeable_amount (可卖出的仓位)
value (标的价值)
run_params包含:
start_date (开始日期)
end_date (结束日期)
type (运行方式)
frequency (运行频率)
'''
print('-----------------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()) #positions是仓位信息,是一个字典
#打印所有值
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
print('-----------------常用的context数据写法-------------------------')
context.current_dt #当前时间
context.current_dt.strftime("%Y-%m-%d") #当前时间的"年-月-日"的字符串格式
context.previous_date #前一个交易日
context.portfolio.available_cash #当前可用资金
context.portfolio.positions_value #持仓价值
context.portfolio.returns #累计收益
context.portfolio.positions.keys() #当前持有的股票
context,portfolio.positions['XXXXXX.XXXX'].avg_cost #当前持有的某股票的开仓均价
context.portfolio.positions['XXXXXX.XXXX'].closeable_amount #当前持有某股票的可卖持仓量
print('-------------------条件判断-------------------------')
'''能够获取context的数据后,我们会考虑利用这些数据丰富策略的逻辑,但在此之前我们还需要学习if条件判断语句'''
#如果当前是2022-10-21,则下单买入100股平安银行
date=context.current_dt.strftime("%Y-%m-%d")
if date=='2022-10-21':
order('00000.XSHE',100)
'''条件判断语句比较简单,但还是要说明条件写法中用到的运算符'''
# 写条件常用运算符:
# < 小于
# > 大于
# <= 小于等于
# >= 大于等于
# == 等于
# != 不等于
# and 与,即and两边条件同为真,则真
# or 或,即or两边条件任意一个为真,则真
# not 非,即not右侧条件为真,则假,not右侧条件为假,则真
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%则卖出股票
if ret<0.01:
order_target('000001.XSHE',0)
print('触发止损')
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('触发止损')
print('-------------------聚宽实例:在指定日期买卖指定数量的股票-------------------')
# 初始化函数,设定基准
def initialize(context):
# 设定沪深300作为基准
set_benchmark('002466.XSHE')
run_daily(period, time='every_bar')
g.security = '002466.XSHE'
def period(context):
# 在指定日期买卖指定数量的股票
date = context.current_dt.strftime("%Y-%m-%d") # 设置日期格式
if date == '2021-06-18':
order_value(g.security, 60000) # 买入6万元的股票
if date == '2021-08-30':
order_target(g.security, 100) # 调整至100股
# order(g.security,100)
# 打印可用资金
print('可用资金', context.portfolio.available_cash)
# 打印运行频率
print('运行频率', context.run_params.frequency)
# 打印当前单位时间的开始时间
print('打印当前单位时间的开始时间金', context.current_dt)
# 打印可用资金
print('---------------------循环、多股票策略-----------------------')
def initialize(context):
run_daily(period, time='every_bar')
#将股票代码作为list存储进security中
g.security=['000001.XSHE','000002.XSHE']
def period(context):
#每个股票买入100股
for stk in g.security:
print(stk)
order(stk,100)
print('---止损模块---')
#获得股票持仓成本
cost=context.portfolio.positions[stk].avg_cost
#获得股票现价
price=context.portfolio.positions[stk].price
#计算收益率
ret=price/cost-1
#如果亏损10%则卖出股票
if ret<-0.1:
order_target(stk,0)
print(stk,'触发止损')
print('-----------------盈利加仓策略---------------------------')
def initialize(context):
run_daily(period, time='every_bar')
# 将股票代码作为list存储进security中
g.security = ['002466.XSHE', '002738.XSHE', '000001.XSHE', '000002.XSHE', '000651.XSHE']
'''初始资金100万,每只股票每天买入1万,收益率达到30%止盈,亏损10%止损,
只要盈利就会不断加仓,亏损达到10%则重新开始定投'''
def period(context):
# 每个股票买入10000元
for stk in g.security:
print(stk)
order_value(stk, 10000)
print('---止盈止损模块---')
# 获得股票持仓成本
cost = context.portfolio.positions[stk].avg_cost
# 获得股票现价
price = context.portfolio.positions[stk].price
# 计算收益率
if cost > 0:
ret = price / cost - 1
# 如果亏损10%则卖出股票
if ret < -0.1:
order_target(stk, 0)
print(stk, '触发止损')
# 止盈
if cost > 0:
ret = price / cost - 1
# 如果亏损10%则卖出股票
if ret > 0.3:
order_target(stk, 0)
print(stk, '止盈')
print('总的权益:', context.portfolio.total_value)
print('总的权益的收益:', context.portfolio.returns)