买卖一只股票

Posted 左手程序右手拳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了买卖一只股票相关的知识,希望对你有一定的参考价值。

1 目标

用Quantopian的Algorithm框架创建一个最简单的回测程序,从2018-06-29之后的12个交易日之内, 购买MPC股票,在价格合适的时候卖出

2 第一步,创建algorithm程序

选择页面上方的Research->Algorithms菜单进入Algorithm页面,点击右上角的"New Algorithm", 然后输入"buyThenSellOneTicker", Quantopian会自动创建algorithm程序,默认提供了模板代码。 不过在这个例子中力求简单,只需要保留initialize和handle_data函数即可。其余均可删除.

"""
This is a template algorithm on Quantopian for you to adapt and fill in.
"""
import quantopian.algorithm as algo


def initialize(context):
    """
    Called once at the start of the algorithm.
    """




def handle_data(context, data):
    """
    Called every minute.
    """
    pass  

3 第二步, 完成initialize函数

initialize函数只会被框架调用一次。我们要在此利用context对象存储全局变量, 比如要交易的股票和为了限制买卖次数为1次,需要增加两个bool变量.

def initialize(context):
    """
    Called once at the start of the algorithm.
    """
    context.stocks = symbol('MPC')
    context.isPurchased = False
    context.isSelled = False  

4 第三步,完成handle_data函数

handle_data函数每分钟会被框架调用一次

4.1 python2的语法

注意,quantopian仍然在使用python2, 有点郁闷. 比如从datetime对象中获取epoch需要这么写

now.strftime('%s')

4.2 获取当前时间

get_datetime是quantopian提供的全局函数,用来获取当前时间, 时区这里指定的是纽约,也就是美国纽交所所在时区.

now = get_datetime('America/New_York')
nowEpoch = int(now.strftime('%s'))   

4.3 判断是否是该交易的时间

这里写的比较粗糙,因为12个交易日并不是简单的在开始日期后面加上15个自然日。但是这个例子程序就是为了简单起见,不把细节搞得太复杂.

start = 1530302400
end = 1530302400 + 86400*15
if nowEpoch in range(start, end):
   # 做交易...

4.4 打印日志

使用Quantopian提供的log函数

log.info("now: , epoch: ".format(now, nowEpoch))   

4.5 判断当前时间是否可交易

if data.can_trade(security):   
   # 交易代码

4.6 获取当前时间的股票价格

security = context.stocks
price = data.current(security, 'price')   

4.7 购买股票

1表示用100%的持有资金购入股票

order_target_percent(security, 1)   

4.8 卖出股票

0表示将全部持有股票卖出

order_target_percent(security, 0)    

4.9 买卖股票的return为0的说明

order, order_target也可以买卖股票,但是在后面的backtest中return为0,原因不明。所以这里都只使用order_target_percent函数.

4.10 记录变量的值

record函数用于跟踪变量的值的变化,会出现在backtest的Activity的Custom Data

# Use the record() method to track up to five custom signals. 
# Record Apple's current price and the average price over the last 
# five days.
record(current_price=price)

4.11 完整代码

"""
This is a template algorithm on Quantopian for you to adapt and fill in.
"""
import quantopian.algorithm as algo


def initialize(context):
    """
    Called once at the start of the algorithm.
    """
    context.stocks = symbol('MPC')
    context.isPurchased = False
    context.isSelled = False



def handle_data(context, data):                              
    """                                                      
    Called every minute.                                     
    """                                                      
    now = get_datetime('America/New_York')                   
    nowEpoch = int(now.strftime('%s'))                       

    start = 1530302400                                       
    end = 1530302400 + 86400*15

    if nowEpoch in range(start, end):                        
        log.info("now: , epoch: ".format(now, nowEpoch)) 
        security = context.stocks                            
        price = data.current(security, 'price')
        record(current_price=price)
        if not context.isPurchased:                          
            if data.can_trade(security):                     
                order_target_percent(security, 1)            
                context.isPurchased = True                   
                log.info("buy: :f".format(price))          
        if context.isPurchased:                              
            if not context.isSelled:                         
                if price > 71.91:                            
                    if data.can_trade(security):             
                        order_target_percent(security, 0)    
                        context.isSelled = True              
                        log.info("sell: :f".format(price))    

5 运行程序

在右侧日期选择中设置开始日期为: 06/28/2018, 结束日期为: 08/30/2018, 初始资金为: 10000. 注意,如果初始资金过大,那么交易数量会出现很多次。这是正常现象,因为

  1. 买股票一次用不完资金,会发出多次购买
  2. 一次也卖不完股票,会多次售卖。
  3. 由于金额过大,会导致股票价格受到影响, 出现滑点现象(成交价格和预期价格有偏差)

点击左边的Build Algorithm. 等待10分钟左右. 因为这是用分钟级别的数据做交易,比较慢.

这个时候,就可以看到右边的图表中出现RETURNS, ALPHA等指标.

6 运行完整回测程序

点击"Run Full Backtest", 再等一会儿,可以看到详细报表,包括各个交易发生的时间和价格等等.

以上是关于买卖一只股票的主要内容,如果未能解决你的问题,请参考以下文章

某只股票每日大单买卖在哪里能看到?

LeetCode ---- 买卖股票系列问题思路与题解

LeetCode ---- 买卖股票系列问题思路与题解

菜鸟系列 Golang 实战 Leetcode —— 买卖股票的最佳时机系列(121. 买卖股票的最佳时机买卖股票的最佳时机 II

代码随想录算法训练营第四十九天| 121 买卖股票的最佳时机 122 买卖股票的最佳时机II

122. 买卖股票的最佳时机 II