买卖一只股票
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. 注意,如果初始资金过大,那么交易数量会出现很多次。这是正常现象,因为
- 买股票一次用不完资金,会发出多次购买
- 一次也卖不完股票,会多次售卖。
- 由于金额过大,会导致股票价格受到影响, 出现滑点现象(成交价格和预期价格有偏差)
点击左边的Build Algorithm. 等待10分钟左右. 因为这是用分钟级别的数据做交易,比较慢.
这个时候,就可以看到右边的图表中出现RETURNS, ALPHA等指标.
6 运行完整回测程序
点击"Run Full Backtest", 再等一会儿,可以看到详细报表,包括各个交易发生的时间和价格等等.
以上是关于买卖一只股票的主要内容,如果未能解决你的问题,请参考以下文章
菜鸟系列 Golang 实战 Leetcode —— 买卖股票的最佳时机系列(121. 买卖股票的最佳时机买卖股票的最佳时机 II