Python告诉你,这样买的股票才有灵魂

之前听过一句话:要想赚大钱必须学会长线持仓,但如果要赚快钱就要学会日内交易。如今的量化交易范围之广令人惊叹,各种交易策略层出不穷,其中最为流行的就是日内交易策略。
日内交易是一种快进快出的交易方式,由于可以控制隔夜风险的特点,得到了很多交易者的推崇和接受。为了帮助大家了解日内交易,丰富策略仓库,本节我们将深入了解商品期货中最为流行的日内策略之一日内高低点突破策略。

什么是日内交易

日内交易的目的是以更小的损失,来获取当天市场微小的价格波动所带来的利润。它是指开仓和平仓在同一天内或同一交易时间段内完成的交易方式,开仓和平仓可以是单次,也可以是多次,只要是开平仓在同一个交易日前结束就行。理论上日内交易不承担隔夜的跳空风险,相对来说是一种较完美的低风险交易策略,但实际上并非如此,虽然日内交易回避了跳空所带来的风险,同时也错失了跳空所带来的利润。但如果以正确的方式交易,通过配合不同的交易规则,日内交易往往也能产生丰厚的回报。

策略逻辑

我们知道判断上涨趋势最简单的方法是,当前低点比前一个低点更高,当前高点也比前一个高点更高;同理下跌趋势最简单的方法是,当前低点比前一个低点更低,当前高点也比前一个高点更低。但如果仅仅以高低点的比较去判断趋势的涨跌,这未免太过简陋,因为价格可能在一个点上来回跳动几十次甚至上百次,从而导致交易过于频繁。所以我们需要设定一个价格区间来过滤这些日常杂波,来对简单的高低点突破策略进行完善。我们可以根据历史行情所出现的最高价和最低价,组成一个包含上轨和下轨的通道。根据顺势交易的原则,当价格突破上轨时多头开仓,当价格突破下轨时空头开仓。多头开仓:当前无持仓,时间是在开盘与收盘前10分钟之间,并且价格大于上轨空头开仓:当前无持仓,时间是在开盘与收盘前10分钟之间,并且价格小于下轨多头平仓:当前持多单,价格小于下轨,或者时间大于14:50空头平仓:当前持空单,价格大于上轨,或者时间大于14:50有人统计过,大部分的窄幅止损都是无效的,小空间的止损会频繁打脸,所以我们要做的就是设计一个宽幅止损:如果多头开仓后,价格不升反跌,我们所要做的不是立即止损,而是等待观望,直到价格跌破下轨才止损出局;空头开仓后也是如此,当价格不跌反升,继续等待价格是否会自我修正,直到跌破上轨才止损出局。

策略编写

1. 导入time库

import time

因为日内策略在编写的时候,要判断当前的时间来控制开平仓逻辑,这个策略在设计的时候是:只能在9点30分之14点50分之间开仓,14点50分之后全部平仓,其余的时间都过滤掉了。所以就需要引入time时间库。2. 编写策略框架

# 策略主函数
def onTick():
    pass

# 程序入口
def main():
    while True:  # 进入无限循环模式
        onTick()  # 执行策略主函数
        Sleep(1000)# 休眠1秒

编写策略就像盖房子一样,先把地基和框架搭建好,再往里面填充东西。我们这里用了两个函数,一个是main主函数,另一个是onTick函数,程序会先从main函数执行代码,在main函数中,我们用了一个无限循环模式,重复执行onTick函数。
3. 设置全局变量

mp = on_line = under_line = 0

在全局变量中,mp主要用于控制虚拟持仓,判断持仓一般分为两种,一种是真实的账户持仓,另一种就是虚拟持仓,还有一种是真实持仓和虚拟持仓联合判断。实盘时我们只使用真实持仓就足够了,但这里为了简化策略,作为演示使用虚拟持仓。on_line和under_line分别记录上轨和下轨。
4. 处理时间

def can_time(hour, minute):
    hour = str(hour)
    minute = str(minute)
    if len(minute) == 1:
        minute = "0" + minute
    return int(hour + minute)

_C(exchange.SetContractType, "MA888")  # 订阅期货品种
bar_arr = _C(exchange.GetRecords)  # 获取K线列表
if len(bar_arr) < 10:
    return
time_new = bar_arr[-1]['Time']  # 获取当根K线的时间戳
time_local_new = time.localtime(time_new / 1000)  # 处理时间戳
hour_new = int(time.strftime("%H", time_local_new))  # 获取小时
minute_new = int(time.strftime("%M", time_local_new))# 获取分钟
day_new = int(time.strftime("%d", time_local_new))# 当前K线日期
time_previous = bar_arr[-2]['Time']  # 获取上根K线的时间戳
previous = time.localtime(time_previous / 1000)  # 处理时间戳
day_previous = int(time.strftime("%d", previous))  # 上根K线日期

注意:处理时间一共用于两个地方:一个是判断当前时间是否在我们规定的交易时间内,如果当前是在这个时间之内,并且已经达到了开仓条件就开仓,如果不是在这个时间之内,并且当前有持仓就平掉所有持仓,达到收盘前平仓的目的。另一个是判断当前K线是不是最新交易日的K线,因为我们的策略逻辑是每当新的一天K线出现时,就重置上下轨。通过对比两个K线的时间戳来重置on_line和under_line的值,也就是说上下轨通道是在不断变化的。
5. 计算高低点上下轨

global mp, on_line, under_line  # 引入全局变量
high = bar_arr[-2]['High']  # 获取上根K线的最高价
low = bar_arr[-2]['Low']  # 获取上根K线的最低价
if day_new != day_previous:  # 如果是最新一根K线
    on_line = high * up # 重置上轨
    under_line = low * down  # 重置下轨
can_trade = can_time(hour_new, minute_new)
if can_trade < 930:  # 如果不是在规定交易的时间内
    if high > on_line:  # 如果上根K线最高价大于上轨
        on_line = high * up  # 重置上轨
    if low < under_line:  # 如果上根K线最低价小于下轨
        under_line = low * down  # 重置上轨
if on_line - under_line < 10:  # 如果上轨与下轨的差小于10
    return

计算高低点上下轨的逻辑其实非常简单:如果当前是第一根K线,那么on_line和under_line的值分别是最高价和最低价,如果当前K线是最新交易日的K线,就重置on_line和under_line的值为最高价和最低价;一旦在规定的交易时间内,on_line和under_line的值就固定不变了,除非在这个时间之外并且如果上根K线最高价大于on_line就重置为最新的最高价;如果上根K线最低价小于under_line就重置为最新的最低价。5. 下单交易在下单交易之前,我们先获取当前最新价格,因为在下单时需要在函数中传入下单价格。然后使用if语句,根据之前设计的交易逻辑,先是判断当前的持仓状态,然后再判断当前时间状态,以及最新价格与上下轨的相互位置关系,最后下单交易并重置虚拟持仓状态。

close_new = bar_arr[-1]['Close']  # 获取最新价格(卖价),用于开平仓
# 如果持多单,并且价格小于下轨或者非规定的交易时间
if mp > 0 and (close_new < under_line or can_trade > 1450):
    exchange.SetDirection("closebuy")  # 设置交易方向和类型
    exchange.Sell(close_new - 1, 1)  # 平多单
    mp = 0  # 设置虚拟持仓的值,即空仓
# 如果持空单,并且价格大于上轨或者非规定的交易时间
if mp < 0 and (close_new > on_line or can_trade > 1450):
    exchange.SetDirection("closesell")  # 设置交易方向和类型
    exchange.Buy(close_new, 1)  # 平空单
    mp = 0  # 设置虚拟持仓的值,即空仓
if mp == 0 and 930 < can_trade < 1450: # 如果当前无持仓且在交易时间内
    if close_new > on_line:  # 如果价格大于上轨
        exchange.SetDirection("buy")  # 设置交易方向和类型
        exchange.Buy(close_new, 1)  # 开多单
        mp = 1  # 设置虚拟持仓的值,即有多单
    elif close_new < under_line: # 如果价格小于下轨
        exchange.SetDirection("sell")  # 设置交易方向和类型
        exchange.Sell(close_new - 1, 1)  # 开空单
       mp = -1  # 设置虚拟持仓的值,即有空单`</pre>

预测今天下午的天气是很容易的,但是要想预测这个月内的天气却很难。日内交易不需要较长的持仓周期,所承受的市场波动风险较低,尽管这种交易方式不符合每个人的风格,但对于那些风险较为敏感的交易者来说,日内交易还是相当值得深入研究。

6. 完整策略代码

下面是完整的策略代码和注释,你也可以在这个https://www.fmz.com/strategy/175316链接中,进入该策略主页面,完整复制该策略代码包括默认参数,并进行在线回测。

# 导入库
import time

# 定义全局变量:虚拟持仓、上轨、下轨
mp = on_line = under_line = 0

# 处理时间函数
def can_time(hour, minute):
    hour = str(hour)
    minute = str(minute)
    if len(minute) == 1:
        minute = "0" + minute
    return int(hour + minute)

def onTick():
    _C(exchange.SetContractType, "MA888")  # 订阅期货品种
    bar_arr = _C(exchange.GetRecords)  # 获取K线列表
    if len(bar_arr) < 10:
        return
    time_new = bar_arr[-1]['Time']  # 获取当根K线的时间戳
    time_local_new = time.localtime(time_new / 1000)  # 处理时间戳
    hour_new = int(time.strftime("%H", time_local_new))  # 获取小时
    minute_new = int(time.strftime("%M", time_local_new))# 获取分钟
    day_new = int(time.strftime("%d", time_local_new))# 当前K线日期
    time_previous = bar_arr[-2]['Time']  # 获取上根K线的时间戳
    previous = time.localtime(time_previous / 1000)  # 处理时间戳
    day_previous = int(time.strftime("%d", previous))  # 上根K线日期
    global mp, on_line, under_line  # 引入全局变量
    high = bar_arr[-2]['High']  # 获取上根K线的最高价
    low = bar_arr[-2]['Low']  # 获取上根K线的最低价
    if day_new != day_previous:  # 如果是最新一根K线
        on_line = high * up # 重置上轨
        under_line = low * down  # 重置下轨
    can_trade = can_time(hour_new, minute_new)
    if can_trade < 930:  # 如果不是在规定交易的时间内
        if high > on_line:  # 如果上根K线最高价大于上轨
            on_line = high * up  # 重置上轨
        if low < under_line:  # 如果上根K线最低价小于下轨
            under_line = low * down  # 重置上轨
    if on_line - under_line < 10:  # 如果上轨与下轨的差小于10
        return
 close_new = bar_arr[-1]['Close']  # 获取最新价格(卖价),用于开平仓
    # 如果持多单,并且价格小于下轨或者非规定的交易时间
    if mp > 0 and (close_new < under_line or can_trade > 1450):
        exchange.SetDirection("closebuy")  # 设置交易方向和类型
        exchange.Sell(close_new - 1, 1)  # 平多单
        mp = 0  # 设置虚拟持仓的值,即空仓
    # 如果持空单,并且价格大于上轨或者非规定的交易时间
    if mp < 0 and (close_new > on_line or can_trade > 1450):
        exchange.SetDirection("closesell")  # 设置交易方向和类型
        exchange.Buy(close_new, 1)  # 平空单
        mp = 0  # 设置虚拟持仓的值,即空仓
    if mp == 0 and 930 < can_trade < 1450: # 如果当前无持仓且在交易时间内
        if close_new > on_line:  # 如果价格大于上轨
            exchange.SetDirection("buy")  # 设置交易方向和类型
            exchange.Buy(close_new, 1)  # 开多单
            mp = 1  # 设置虚拟持仓的值,即有多单
        elif close_new < under_line: # 如果价格小于下轨
            exchange.SetDirection("sell")  # 设置交易方向和类型
            exchange.Sell(close_new - 1, 1)  # 开空单
            mp = -1  # 设置虚拟持仓的值,即有空单

def main():
    while True:
        onTick()
        Sleep(1000)`</pre>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容