投资交易

聚宽读取Context中的数据与条件判断

https://www.yuque.com/docs/share/d0d547f0-f24d-4916-bf48-1516d7fb7d3c?#《聚宽Context对象》
聚宽Context对象 (1)
#聚宽简单的模板
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)

发表回复