量化交易开发之context与判断(五)

2024-01-29  本文已影响0人  北京不北

量化交易开发之context与判断(五)

通过前文的讲解,我们已经能理解最开始那个最简单的策略例子,如下:

    def initialize(context):
        run_daily(period, time = 'every_bar')
        g.security = '000001.XSHE'
    
    def period(context):
        order(g.security, 100)

下面我们看看什么是context。

一、context的结构

1706520776061.png

二、数据取用方法

    # 打印可用的资金
    print(context.portfolio.available_cash)
    # 打印运行的频率
    print(context.run_params.frequency)
    # 打印当前时间的开始时间
    print(context.current_dt)

    # 执行后日志内容如下
    # 1000000.0
    # day
    # 2016-06-01 09:30:00

1706520776061.png
# 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('触发止损')

五、未完待续

下章将继续介绍context中的数据和条件判断。

欢迎关注知乎:北京不北

欢迎+V:beijing_bubei

欢迎关注douyin:near.X (北京不北)

获得技术答疑,长期技术交流。
上一篇 下一篇

猜你喜欢

热点阅读