用Python编程借助现有量化平台编写股票交易策略和回测分析

434 篇文章 10 订阅
346 篇文章 4 订阅

一、简介

接下来笔者会给大家介绍股票交易中的常见几种交易策略实现思路和源码编写过程,如果大家听说过量化交易这个词语的话,对其中的交易策略或许了解过,大概意思就是在股票、加密货币或者金融衍生物在价格的波动过程中根据其交易策略进行不断的买入和卖出,不断的套利,降低持仓陈本,来达到收益最大化。

常见的交易策略有很多种,例如趋势型,网格型,剥头皮,概率法则,高频交易等,今天主要给大家介绍2种低频的交易策略,高抛低吸网格交易策略、日内做T策略。

二、需求分析&实现思路

每个交易日的股票都会上涨或者下跌,在这个过程中笔者们偶尔会想针对部分股票进行股价的涨跌幅进行监控,或者自动进行交易,在这个需求前提下,现有券商、股票分析软件都会带有机器人自动交易策略功能,大部分都需要收费或者部分策略不能满足自己的需求,笔者这边提供2种实现思路:

1、借助现有量化平台编写策略和回测分析,然后在券商软件层面进行策略执行。

2、自己编写功能代码来监控估价,对股价波动进行特殊处理满足特殊需求。

第一种实现成本较低,但功能受限于平台;第二种实现成本毋庸置疑相对较高,但是逻辑可以自己控制。

三、借助现有量化平台编写策略和回测分析

这里利用米筐量化实现和分析自己的交易策略,需要先注册个账号,然后进入到平台-笔者的策略中进行策略编写,平台的功能使用可以参考平台文档。

笔者这里贴出笔者自己写的2种策略代码,这个平台只支持使用Python脚本编写。

1)价差交易策略
平台截图:
在这里插入图片描述
部分代码如下,详细代码可以自己手撸实现,也可以在文末进行获取:

你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新

def handle_bar(context, bar_dict):
...
    if newPrice >= context.nextSellPrice:
        logger.info("执行高抛交易,对应价格:{}".format(newPrice))
        amount = context.portfolio.positions[context.s1].quantity
        if amount >= context.tradeNumber:
            logger.info("执行高抛交易,对应数量:{}".format(context.tradeNumber))
            order_shares(context.s1, -context.tradeNumber)
            plot("S", newPrice)
        elif amount >= 100:
            logger.info("执行高抛交易,对应数量:{}".format(amount))
            order_shares(context.s1, -amount)
            plot("S", newPrice) 
        
        calc_next_trade_price(context,newPrice)
        obj = {
            "nextSellPrice":context.nextSellPrice,
            "nextBuyPrice":context.nextBuyPrice,
            "curTradePrice":context.curTradePrice
        }
        context.buyTradeList.append(obj)

    if newPrice <= context.nextBuyPrice:
        logger.info("执行低吸交易,对应价格:{}".format(newPrice))
        amount = int(context.portfolio.cash / newPrice / 100.0)  * 100
        if amount >= context.tradeNumber:
            logger.info("执行低吸交易,对应数量:{}".format(context.tradeNumber))
            order_shares(context.s1, context.tradeNumber)
            plot("B", newPrice)

        calc_next_trade_price(context,newPrice)
       
        obj = {
            "nextSellPrice":context.nextSellPrice,
            "nextBuyPrice":context.nextBuyPrice,
            "curTradePrice":context.curTradePrice
        }
        context.sellTradeList.append(obj) 

选择回测时间段,点击右侧平台右侧按钮运行回测,结果页面如下
在这里插入图片描述
从结果中可以看到,对招商银行[600036]这只股票进行价差网格交易,其参数设置在上涨8%的时候卖出,下跌8%的时候买入,最大连续下跌买入次数为3次。

回测收益:13.628%

回测年化收益:17.096%

比基准年化收益-6%高出非常之大,这是在股价波动的过程中可以进行执行该策略来不断的降低持仓成本。从交易详情面板来看,这个策略可以通过参数调节交易频率,在上涨下跌比率较大的情况下,其交易次数是能控制的相对较少,结果图如下:
在这里插入图片描述
2)日内做T策略
同样的,只贴部分代码

# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
def handle_bar(context, bar_dict):
...
    newPrice = bar_dict[context.s1].last
    if newPrice >= context.nextSellPrice:
        context.lastTradeType = 1
        logger.info("执行高抛交易,对应价格:{}".format(newPrice))
        amount = context.portfolio.positions[context.s1].quantity
        #if amount - context.tradeNumber >= context.lockStockNumber:
        if amount - context.tradeNumber >= 0:
            logger.info("执行高抛交易,对应数量:{}".format(context.tradeNumber))
            order_shares(context.s1, -context.tradeNumber)
            plot("S", newPrice)
        else:
            logger.info("股票数量不足,无法执行高抛交易,对应数量:{}".format(amount))
            return    
        
        calc_next_trade_price(context,newPrice)

        obj = {
            "nextSellPrice":context.nextSellPrice,
            "nextBuyPrice":context.nextBuyPrice,
            "curTradePrice":context.curTradePrice
        }
        context.buyTradeList.append(obj)

    if newPrice <= context.nextBuyPrice:
        context.lastTradeType = 0
        logger.info("执行低吸交易,对应价格:{}".format(newPrice))
        amount = int(context.portfolio.cash / newPrice / 100.0)  * 100
        if amount >= context.tradeNumber:
            logger.info("执行低吸交易,对应数量:{}".format(context.tradeNumber))
            order_shares(context.s1, context.tradeNumber)
            plot("B", newPrice)
        else:
            logger.info("现金不足,无法执行低吸交易,对应数量:{}".format(amount))
            return    

        calc_next_trade_price(context,newPrice)
       
        obj = {
            "nextSellPrice":context.nextSellPrice,
            "nextBuyPrice":context.nextBuyPrice,
            "curTradePrice":context.curTradePrice
        }
        context.sellTradeList.append(obj)

你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新

def handle_bar(context, bar_dict):

newPrice = bar_dict[context.s1].last
if newPrice >= context.nextSellPrice:
context.lastTradeType = 1
logger.info(“执行高抛交易,对应价格:{}”.format(newPrice))
amount = context.portfolio.positions[context.s1].quantity
#if amount - context.tradeNumber >= context.lockStockNumber:
if amount - context.tradeNumber >= 0:
logger.info(“执行高抛交易,对应数量:{}”.format(context.tradeNumber))
order_shares(context.s1, -context.tradeNumber)
plot(“S”, newPrice)
else:
logger.info(“股票数量不足,无法执行高抛交易,对应数量:{}”.format(amount))
return

    calc_next_trade_price(context,newPrice)

    obj = {
        "nextSellPrice":context.nextSellPrice,
        "nextBuyPrice":context.nextBuyPrice,
        "curTradePrice":context.curTradePrice
    }
    context.buyTradeList.append(obj)

if newPrice <= context.nextBuyPrice:
    context.lastTradeType = 0
    logger.info("执行低吸交易,对应价格:{}".format(newPrice))
    amount = int(context.portfolio.cash / newPrice / 100.0)  * 100
    if amount >= context.tradeNumber:
        logger.info("执行低吸交易,对应数量:{}".format(context.tradeNumber))
        order_shares(context.s1, context.tradeNumber)
        plot("B", newPrice)
    else:
        logger.info("现金不足,无法执行低吸交易,对应数量:{}".format(amount))
        return    

    calc_next_trade_price(context,newPrice)
   
    obj = {
        "nextSellPrice":context.nextSellPrice,
        "nextBuyPrice":context.nextBuyPrice,
        "curTradePrice":context.curTradePrice
    }
    context.sellTradeList.append(obj)

总体来说,代码逻辑还是比较简单,就是对价格的涨跌进行处理,其参数设置在日内上涨2%的时候卖出,下跌2%的时候买入,初始买入资金比例7成,锁定最低仓位5成。然后运行回测,其结果如下
在这里插入图片描述
回测收益:5.501%

回测年化收益:6.839%

基准收益:19.26%

可以看到日内做T这种高频交易,在长期来看收益可能并不高,适合在短期价格内运行。

四、总结

这个量化平台在笔者的熟悉情况下,它可以很方便的回测你的交易策略,但是在股价盯盘上,或者自定义逻辑上支持的不是很完善,很多功能也是需要收费才能使用。本文基于Python,借助现有量化平台编写策略和回测分析,希望对大家的学习有所帮助。

最后

作为一个IT的过来人,我自己整理了一些python学习资料,都是别人分享给我的,希望对你们有帮助。

有问题可以扫描下面二维码——>添加csdn官方认证二维码探讨

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、Python必备开发工具

在这里插入图片描述

三、精品Python学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。在这里插入图片描述

六、Python练习题

检查学习结果。
在这里插入图片描述

七、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述
最后,千万别辜负自己当时开始的一腔热血,一起变强大变优秀。

股票回测量化交易中非常重要的一环,它可以通过历史数据对交易策略进行模拟和评估,从而评估策略的可行性和优劣性。在Python中,有很多开源的量化交易框架可以用来进行股票回测,如zipline、backtrader等。 下面是一个使用zipline框架进行简单交易策略回测的例子: 1. 安装zipline ```python pip install zipline ``` 2. 编写交易策略代码 ```python from zipline.api import order_target_percent, record, symbol def initialize(context): context.asset = symbol('AAPL') def handle_data(context, data): # 获取过去10天的收盘价 prices = data.history(context.asset, 'price', 10, '1d') # 计算平均价 mean_price = prices.mean() # 如果当前价格低于平均价,则买入 if data.current(context.asset, 'price') < mean_price: # 调整持仓比例至100% order_target_percent(context.asset, 1.0) # 否则卖出 else: # 调整持仓比例至0% order_target_percent(context.asset, 0.0) # 记录当前持仓比例 record(position=context.portfolio.positions[context.asset].amount) ``` 3. 运行回测 ```python from zipline import run_algorithm from zipline.api import symbol from datetime import datetime start = datetime(2016, 1, 1) end = datetime(2017, 1, 1) result = run_algorithm( start=start, end=end, initialize=initialize, capital_base=10000, handle_data=handle_data, bundle='quandl' ) ``` 在上述代码中,我们定义了一个简单的交易策略,即如果当前价格低于过去10天的平均价,则买入,否则卖出。然后我们使用zipline框架进行回测,设定回测开始和结束时间、初始资本、数据来源等参数,最终得到回测结果。 需要注意的是,这只是一个简单的例子,实际的交易策略可能会更加复杂,需要考虑更多的因素。另外,在进行股票回测时,也需要注意避免过度拟合或过度优化,以免出现回测虚高的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值