精华内容
下载资源
问答
  • 2022-04-20 14:46:40

    一、量化策略

    1、中长线趋势型

    通过量化方法从多个角度进行测评,分析价格中长线的趋势,判断是上升的概率更大还是下跌的概率更大,并始终坚持做大概率成功的投资。

    2、相对价值型

    通过筛选分析历史数据,获取证券或者证券组合之间的价格差异,通过反复买卖来获得价差收益,就是套利交易。

    二、交易频率

    1、高频交易

    • 1、交易量巨大
    • 2、持仓时间很短(进入微秒、毫秒级别),日内交易次数多

    2、低频交易

    • 1、成熟的交易理念
    • 2、随着资金量的增长,交易成本低
    • 3、价值投资

             高频交易者通过快人一步捕捉市场的量价信息来赚取收益,低频交易者通过对股票的深入研究,根据股票的价值和价格的偏离来进行交易。当市场价格高于价值,卖出;价格低于价值,买入。和“价值投资”默契相关。

    三、常用策略

    1、套利策略

    利用同一商品(或相似商品)在不同市场上的差价,进行低买高卖的交易行为

    量化投资中的套利策略,强调的是买入低估的同时卖出高估的。
    即买入一个投资标的的同时,一定会卖空一个投资标的。
    
    套利策略的最大优势是同时买入和卖空了相同或相似的标的,
    从而几乎没有单边敞口,不会造成单边持仓的风险,
    对市场的涨跌不敏感,所以套利策略风险较低且与市场相关性很低。

       只要市场没有达到强有效的状态,套利空间就一直存在,随着市场越来越有效,套利空间越来越小


    2、Alpha策略

    全市场所有投资者的Alpha收益的总和约为0,近似零和博弈

    • 交易成本会使全市场的Alpha收益之和偏负
    • 分红会使全市场的Alpha收益之和偏正
    Alpha策略以获取Alpha收益为主,主用金融衍生品对冲掉Beta风险
    一般做法是,买入一篮子股票,同时卖空等量的股指期货对冲指数下跌的风险。
    
    股指期货对冲了指数涨跌的风险,因此Alpha策略的收益与大盘的Beta收益无关,
    是一种比较稳健的策略模型。
    

    3、多因子策略策略

    多因子策略模型建立的流程

    多因子模型是量化选股中最重要的一类模型,基本思想是找到某些和收益率最相关的指标,
    并根据该指标构建一个股票组合,期望该组合在未来的一段时间跑赢或跑输指数。
    
    如果跑赢,则可以做多该组合,同时做空期指,赚取正向阿尔法收益;
    如果是跑输,则可以组多期指,融券做空该组合,赚取反向阿尔法收益。
    
    多因子模型的关键是找到因子与收益率之间的关联性。
    主要考虑夏普比率、年化收益、最大回撤、换手率等因素。

    4、选股策略

    选股策略可以仅仅以股票作为投资标的

    从运作逻辑和投资目标上,可以把选股策略分两类:
    
    相对收益型(指数增强):一般满仓运作,与指数的波动基本同一量级,以战胜指数为目标。
    绝对收益型:以盈利为目标,需要通过某些方式来控制风险,如择时。
    
    选股策略属于高风险策略,即使是绝对收益型的选股策略,回撤也可以达到10%以上,
    而指数增强型的选股策略,最大回撤甚至可能超过50%。
    
    

    5、CTA策略

    CTA(Commodity Trading Advisors):商品交易顾问。

    原来是指通过为客户提供期货、期权方面交易建议
        或通过受理期货账户直接参与交易来获取收益的投资者。
    现在泛指投资各类期货、期权品种的策略。
        它主要包括趋势跟踪、套利、中性、高频等。
    
    趋势跟踪就是所谓的追涨杀跌,即买入已经开始上涨的标的并期望它继续上涨,
    卖空已经开始下跌的标的,并期望它继续下跌。
    为什么?
    
    1、市场参与者对信息的反应存在初始时刻的反应不足以及后续的反应过度,
       这种行为偏差是导致价格行为出现趋势的直接原因。
    2、趋势就如同历史轮回一样周而复始,而趋势跟踪者便是利益的收割者
    
    关键环节:投资标的的选取、买入卖出信号的产生、资金管理方法等。

    6、海龟交易策略

    和CTA策略的一样,名称不同,都是趋势跟踪性,跟涨杀跌。 

    海龟交易策略是一套非常完整的趋势跟随型的自动化交易策略。
    这个复杂的策略在入场条件、仓位控制、资金管理、止损止盈等各个环节,都进行了详细的设计,
    这基本上可以作为复杂交易策略设计和开发的模板

    7、人工智能

    人工智能的核心是算法,而这与量化投资所依赖的模型相吻合。把对历史数据的分析,应用于深度学习算法,逐渐训练一个愈加完善的模型,从而达到战胜市场的目的。

    优点:
    人工智能模型具有自适应特性
    人工智能可以充分利用快速升级的硬件和算法,深入挖掘市场深处的机遇
    
    缺点:
    人工智能擅长处理信息透明的完全博弈,这与金融市场有关本质的不同
    人工智能模型的基础是复杂的数学问题,不易理解,需要高超的使用技能
    

    四、参考 

    行业轮动(股票) - 经典策略 - 掘金量化 (myquant.cn)

    量化基金投资常用策略简介

    更多相关内容
  • 博文《Python量化交易策略及回测系统》详细的介绍了Python量化交易策略编写的全过程,包括: 1、数据的获取 2、量化交易策略回测系统的编写 3、量化交易策略的设计 4、使用量化交易策略及回测系统对多个股票进行回测...
  • 量化交易策略—利用量化分析技术创造盈利交易程序的电子文档资料供大家学习参考,文件名:量化交易策略—利用量化分析技术创造盈利交易程序.pdf
  • 重磅干货:万字长文解析全球商品期货量化交易策略
  • Python定量交易策略包括MACD,Pair Trading,Heikin-Ashi,London Breakout,Awesome,Dual Thrust,Parabolic SAR,Bollinger Bands,RSI,Pattern Recognition
  • js代码-量化交易策略

    2021-07-16 12:13:32
    js代码-量化交易策略
  • 本书的 写作目也正在于此我愿尽绵薄之力为有志学习读者 提供一个可以参考的 量化交易策略研发框架 ,希望大家在初入门径时少走弯路 。
  • 介绍量化交易的主要策略
  • 基于峰度(kurtosis)和偏度(skewness)的交易策略,这是一个基于数据分布的峰度(kurtosis)和偏度(skewness)的交易策略。当数据呈现趋势性,并且潜在趋势为正时,我们做多。当数据呈现趋势性,并且潜在趋势为负...
  • Python量化交易策略及回测系统

    千次阅读 热门讨论 2022-03-11 20:30:37
    目录前言:行文思路1、模块导入2、数据获取3、股票数据类型转换4、策略编写5、回测系统编写6、实例化策略非面向对象的编程 前言:行文思路 由于本文篇幅较长,而且文中关于python数据分析的知识点、python金融量化的...

    前言:行文思路

    由于本文篇幅较长,而且文中关于python数据分析的知识点、python金融量化的知识点较多,因此在文章的开头先给出本文整体思路,以便读者能够拥有较为清晰的脉络通读全文。
    第一部分:模块导入,主要是将后面需要用到的模块进行导入(简单,非重点)
    第二部分:数据获取,鉴于在网络上股票数据不易找到,Wind金融终端等数据库数据收费,通过多方查找,终于让我找到了能够免费下载股票数据的模块,建议大家收藏(简单,非重点)
    第三部分:将股票数据转化为新的数据类型,通过上面的方法下载下来的数据类型是我们常见的DataFrame,虽然pandas的功能已经很强大了,但是为了加入新的数据指标以及方便下一步操作,最好还是将DataFrame数据转化为一种新的数据类型(较难,非重点)
    第四部分:策略编写,也就是利用代码将我们在股票市场中的交易原则表达出来(较难,重点)
    第五部分:回测系统编写,股票回测即是基于历史已经发生过的真实行情数据,在历史上某一段时间内,模拟真实金融市场中股票的买入、卖出,得出这个时间段内的盈利率等数据(较难,重点)
    第六部分:实例化策略并回测得到收益,继承一个策略类,得到一个实际的例子,利用股票数据回测得出结果(简单,重点)

    1、模块导入

    import akshare as ak
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from collections import namedtuple
    from collections import OrderedDict
    from collections.abc import Iterable
    from functools import reduce
    from abc import ABC, abstractmethod
    

    akshare:用于下载股票的交易数据(前复权)
    collections:对基本数据类型做进一步处理,实现特定的数据类型
    abc:主要定义了基本类和最基本的抽象方法,可以为子类定义共有的接口API,不需要具体实现

    2、数据获取

    # 获取某一只股票一段时间的数据
    stock_sz300750_df = ak.stock_zh_a_daily(symbol="sz300750", start_date="20200103", end_date="20211231", adjust="qfq")
    # list_date = list(stock_sz300750_df['date'])
    # stock_sz300750_df.index = list_date
    stock_sz300750_df.head()
    

    在这里插入图片描述
    函数ak.stock_zh_a_daily()用于获取A股股票数据
    symbol为股票代码,sh为上交所股票,sz为深交所股票;strat_date、end_date分别为股票数据开始时间、结束时间;adjust默认为不复权的数据, qfq是返回前复权后的数据,hfq是 返回后复权后的数据

    3、股票数据类型转换

    由于后面写了两个量化交易策略,而且策略中的有部分指标不相同,所以在这一部分以及下面回测系统两部分面向对象编程,有部分函数只用于策略一,有部分只用于策略二。

    # 将股票数据转化为新的数据类型
    class StockTradeDays(object):
        def __init__(self, price_array, date_array=None):
            self.price_array = price_array
            self.date_array = self._init_days(date_array)
            self.change_array = self._init_change()
            self.s_short = self._init_sma_short(price_array)
            self.s_long = self._init_sma_long(price_array)
            self.stock_dict = self._init_stock_dict()
    
        def _init_change(self):
            # 收益率
    
            change_array = self.price_array.pct_change(periods=1)
            return change_array
    
        def _init_days(self, date_array):
            # 日期序列
            
            date_array = [str(date) for date in date_array]
            return date_array
    
        def _init_sma_short(self, price_array):
            # 5日移动平均线
            
            s_short = price_array.rolling(window=5, min_periods=5).mean()
            return s_short
        
        def _init_sma_long(self, price_array):
            # 30日移动平均线
            
            s_long = price_array.rolling(window=30, min_periods=30).mean()
            return s_long
        
        def _init_stock_dict(self):
            # 将股票的日期、收盘价、涨跌幅转化为一个新的数据类型
    
            stock_namedtuple = namedtuple('stock', ('date', 'price', 'change', 's_short', 's_long'))
    
            # 使用以被赋值的date_array等进行OrderedDict的组装
            stock_dict = OrderedDict((date, stock_namedtuple(date, price, change, s_short, s_long)) for date, price, change, s_short, s_long 
                                     in zip(self.date_array, self.price_array, self.change_array, self.s_short, self.s_long))
            return stock_dict
    
       
        def filter_stock(self, want_up=True, want_calc_sum=False):
            # 判断交易日股票是上涨还是下跌
            # Python中的三目表达式的写法
            filter_func = (lambda p_day: p_day.change > 0) if want_up else (lambda p_day: p_day.change < 0)
            # 使用filter_func做筛选函数
            want_days = list(filter(filter_func, self.stock_dict.values()))
    
            if not want_calc_sum:
                return want_days
    
            # 需要计算涨跌幅和
            change_sum = 0.0
            for day in want_days:
                change_sum += day.change
            return change_sum    
    

    相同指标:date、price、change
    策略一:s_short、s_long分别为5日移动平均线和30日移动平均线;可以根据自己的需求更改参数数据
    策略二:函数filter_stock(),用于判断交易日股票是上涨还是下跌

    最后将DataFrame数据转换为自定义数据类型OrderedDict

    trade_days = StockTradeDays(stock_sz300750_df['close'], stock_sz300750_df['date'])
    if isinstance(trade_days, Iterable) :
        for day in trade_days:
            print(day) 
    

    在这里插入图片描述

    4、回测系统编写

    class TradeStrategyBase(ABC, object):   # 只能被继承,不能实例化
         # 交易策略抽象基类
    
        @abstractmethod
        def buy_strategy(self, *args, **kwargs):
            # 买入策略基类
            pass
    
        @abstractmethod
        def sell_strategy(self, *args, **kwargs):
            # 卖出策略基类
            pass
    
    
    class TradeLoopBack(object):
        # 交易回测系统
    
        def __init__(self, trade_days, trade_strategy):
            """
            使用上面封装的StockTradeDays类和编写的交易策略类
            TradeStrategyBase类初始化交易系统
            :param trade_days: StockTradeDays交易数据序列
            :param trade_strategy: TradeStrategyBase交易策略
            """
            self.trade_days = trade_days
            self.trade_strategy = trade_strategy
            # 交易盈亏结果序列
            self.profit_array = []
    
        def execute_trade(self):
            # 执行交易回测
            
            for ind, day in enumerate(self.trade_days):
            # 以时间驱动,完成交易回测
                
                if self.trade_strategy.keep_stock_day == 1 or self.trade_strategy.keep_stock_day > 0:
                    # 如果有持有股票,加入交易盈亏结果序列
                    self.profit_array.append(day.change)
    #                 print("日期:{},持有中".format(day.date))
    
                # hasattr: 用来查询对象有没有实现某个方法
                if hasattr(self.trade_strategy, 'buy_strategy'):
                    # 买入策略执行
                    self.trade_strategy.buy_strategy(ind, day, self.trade_days)
    #                 if self.trade_strategy.keep_stock_day == 1:
    #                     print("日期:{},买入策略执行".format(day.date))
    
                if hasattr(self.trade_strategy, 'sell_strategy'):
                    # 卖出策略执行
                    self.trade_strategy.sell_strategy(ind, day, self.trade_days)
    #                 if self.trade_strategy.keep_stock_day == 0:
    #                     print("日期:{},卖出策略执行".format(day.date))
    

    execute_trade()函数中,利用循环遍历整一个交易时段,将获得的每日股票数据传给交易策略进行判断,最终确定是买入、卖出还是持有

    5、策略编写

    class TradeStrategy1(TradeStrategyBase):
        """
            交易策略1: 利用5日移动平均线与30日移动平均线交叉点进行股票买卖
            当5日移动平均线从下往上穿过30日移动平均线时,买入股票并持有
            当5日移动平均线从上往下穿过30日移动平均线时,卖出股票
        """
        def __init__(self, stock_df):        
            self.keep_stock_day = -1
    
        def buy_strategy(self, trade_ind, trade_day, trade_days):
            if not pd.isna(trade_days[trade_ind - 1].s_long):
            # 只有当长期移动平均线的数据有了,才能进行下一步操作    
                
                # 今日移动平均线值
                today_short = trade_day.s_short
                today_long = trade_day.s_long
    
                # 昨日移动平均线值
                yesterday_short = trade_days[trade_ind - 1].s_short
                yesterday_long = trade_days[trade_ind - 1].s_long
    
                if today_short > today_long and yesterday_short < yesterday_long:
                    # 买入条件成立:
                    self.keep_stock_day = 1
    
        def sell_strategy(self, trade_ind, trade_day, trade_days):
            if not pd.isna(trade_days[trade_ind - 1].s_long):
            # 只有当长期移动平均线的数据有了,才能进行下一步操作            
                
                # 今日移动平均线值
                today_short = trade_day.s_short
                today_long = trade_day.s_long
    
                # 昨日移动平均线值
                yesterday_short = trade_days[trade_ind - 1].s_short
                yesterday_long = trade_days[trade_ind - 1].s_long
    
                if today_short < today_long and yesterday_short > yesterday_long:
                    # 卖出条件成立:
                    self.keep_stock_day = 0
    

    移动平均线是将一定时期内的股票价格加以平均,把不同时间的平均值连接起来形成一根MA,利用长短期的移动平均线交叉点观察股票价格变动趋势的一种技术指标。因此,只有到了第30天才可以获得30日移动平均值,才可能进行买卖。
    判断买入条件:当短期移动平均线从下往上穿过长期移动平均线时,可以认为短期内股价的趋势向上,股价可能会上涨
    判断卖出条件:当短期移动平均线从上往下穿过长期移动平均线时,可以认为短期内股价的趋势向下,股价可能会下跌

    class TradeStrategy2(TradeStrategyBase):
        """
            交易策略2: 追涨杀跌策略,当股价连续两个交易日上涨
            且上涨幅度超过阀值默认s_buy_change_threshold(),买入股票并持有
            当股价连续两个交易日下跌
            且下跌幅度超过阀值默认s_sell_change_threshold(),卖出股票
        """
        def __init__(self):
            self.keep_stock_day = 0
            self.s_buy_change_threshold = 0.05      # 上涨买入阀值
            self.s_sell_change_threshold = -0.05   #下跌卖出阀值
    
        def buy_strategy(self, trade_ind, trade_day, trade_days):
            if self.keep_stock_day == 0 and trade_ind >= 1:
                """
                    当没有持有股票的时候self.keep_stock_day == 0 并且
                    trade_ind >= 1, 不是交易开始的第一天,因为需要yesterday数据
                """
                # trade_day.change > 0 bool:今天是否股价上涨
                today_down = trade_day.change > 0
                # 昨天是否股价上涨
                yesterday_down = trade_days[trade_ind - 1].change > 0
                # 两天总涨幅
                down_rate = trade_day.change + trade_days[trade_ind - 1].change
                if today_down and yesterday_down and down_rate > self.s_buy_change_threshold:
                    # 买入条件成立:连涨两天,涨幅超过s_buy_change_threshold
                    self.keep_stock_day += 1
    
        def sell_strategy(self, trade_ind, trade_day, trade_days):
            # trade_day.change < 0 bool:今天是否股价下跌
            today_down = trade_day.change < 0
            # 昨天是否股价下跌
            yesterday_down = trade_days[trade_ind - 1].change < 0
            # 两天总跌幅
            down_rate = trade_day.change + trade_days[trade_ind - 1].change
            if today_down and yesterday_down and down_rate < self.s_sell_change_threshold:
                # 卖出条件成立:连跌两天,跌幅超过s_sell_change_threshold
                self.keep_stock_day = 0
    
        @property
        def s_buy_change_threshold(self):
            # getter获取属性函数
            return self.__s_buy_change_threshold
    
        @s_buy_change_threshold.setter
        def s_buy_change_threshold(self, s_buy_change_threshold):
            # setter属性赋值
            if not isinstance(s_buy_change_threshold, float):
                """
                    上涨阀值需要为float类型
                """
                raise TypeError('buy_change_threshold must be float!')
            # 上涨阀值只取小数点后两位
            self.__s_buy_change_threshold = round(s_buy_change_threshold, 2)
    
        @property
        def s_sell_change_threshold(self):
            # getter获取属性函数
            return self.__s_sell_change_threshold
    
        @s_sell_change_threshold.setter
        def s_sell_change_threshold(self, s_sell_change_threshold):
            # setter属性赋值
            if not isinstance(s_sell_change_threshold, float):
                """
                    上涨阀值需要为float类型
                """
                raise TypeError('buy_change_threshold must be float!')
            # 上涨阀值只取小数点后两位
            self.__s_sell_change_threshold = round(s_sell_change_threshold, 2)
    

    策略二可以认为是非理性人在股票市场中交易时,遇到多日上涨且上涨幅度较大时,会认为股票有继续上涨的趋势,为了获利所以买入股票;但当某一股票连续下跌且下跌幅度超过心理预期时,会认为股票又继续下跌的趋势,为了止损卖出股票。
    策略二中买入股票条件为:当股价连续两个交易日上涨且上涨幅度超过0.05,买入股票并持有
    卖出条件为:当股价连续两个交易日下跌且下跌幅度超过-0.05,卖出股票
    相关参数可以根据需求修改

    6、实例化策略

    # 实例化策略1
    trade_strategy1 = TradeStrategy1(stock_sz300750_df)
    trade_loop_back = TradeLoopBack(trade_days, trade_strategy1)
    trade_loop_back.execute_trade()
    print('回测策略1总盈亏为:{}%'.format(reduce(lambda a, b: a + b, trade_loop_back.profit_array) * 100))
    plt.plot(np.array(trade_loop_back.profit_array).cumsum())
    

    经过前面的所有步骤之后,就可以实例化一个交易策略,利用交易数据进行回测,可得到相应的结果:
    在这里插入图片描述

    # 实例化策略2
    trade_strategy2 = TradeStrategy2()
    trade_loop_back = TradeLoopBack(trade_days, trade_strategy2)
    trade_loop_back.execute_trade()
    print('回测策略2总盈亏为:{}%'.format(reduce(lambda a, b: a + b, trade_loop_back.profit_array) * 100))
    plt.plot(np.array(trade_loop_back.profit_array).cumsum())
    

    结果:
    在这里插入图片描述

    非面向对象的编程

    由于对面向对象编程不太擅长,所以我对两个策略又分别写了新的程序,以判断上文面向对象程序是否正确

    changes_list_1 = []
    flag = -1
    for ind, day in enumerate(trade_days):
        short2 = day.s_short
        long2 = day.s_long
        short1 = trade_days[ind - 1].s_short
        long1 = trade_days[ind - 1].s_long
        if pd.isna(long1):
            continue
        if flag == 1:
            changes_list_1.append(day.change)
            print("日期:{},持有中".format(day.date))
        if short2 > long2 and short1 < long1:
            flag = 1
            print("日期:{},买入策略执行".format(day.date))
        if short2 < long2 and short1 > long1:
            flag = 0
            print("日期:{},卖出策略执行".format(day.date))
            
    print('回测策略1总盈亏为:{}%'.format(reduce(lambda a, b: a + b, changes_list_1) * 100))
    plt.plot(np.array(changes_list_1).cumsum())
    

    结果:
    在这里插入图片描述

    # 策略2
    changes_list_2 = []
    flag = 0
    for ind, day in enumerate(trade_days):
        today_down = day.change
        yesterday_down = trade_days[ind - 1].change
        if flag > 0:
            changes_list_2.append(day.change)
            print("日期:{},持有中".format(day.date))
        if today_down > 0 and yesterday_down > 0 and today_down + yesterday_down > 0.01:
            flag += 1
            print("日期:{},买入策略执行".format(day.date))
        if today_down < 0 and yesterday_down < 0 and today_down + yesterday_down < -0.01:
            flag = 0
            print("日期:{},卖出策略执行".format(day.date))
            
    print('回测策略2总盈亏为:{}%'.format(reduce(lambda a, b: a + b, changes_list_2) * 100))
    plt.plot(np.array(changes_list_2).cumsum())
    

    结果:
    在这里插入图片描述

    分析总结

    以上策略只用于量化分析,并不适合用于实际交易,之所以有较高的盈利,得益于宁王领衔的新能源板块的强势,大家也可以试试其他的股票,比如药明康德(代码:SH603259)
    在这里插入图片描述
    在这里插入图片描述
    可以看出策略对该股票进行回测交易时,获得的盈利并不客观,甚至出现较大的亏损,因此,需要对相关策略进行参数调整修改,或者发掘其他更为有效的策略……

    最后,大家如果觉得文章写的不错的话,可以点赞、收藏、关注三连哦~文中出现的所有代码已经打包上传至我的资源了,可以下载下来研究分析和运行查看

    展开全文
  • python实现量化交易策略

    千次阅读 多人点赞 2021-11-17 17:43:27
    python实现量化交易策略 1 前言 相信大家都听说过股票,很羡慕那些炒股大佬,觉得量化投资非常高深,本文教大家用python实现简单的量化交易策略。 2 构建策略 炒股是一个概率游戏,强如巴菲特也没办法保证这只股票...

    python实现量化交易策略

    1 前言

    相信大家都听说过股票,很羡慕那些炒股大佬,觉得量化投资非常高深,本文教大家用python实现简单的量化交易策略。在这强调一下,本文仅供交流学习参考,不构成任何投资建议。炒股有风险,投资需谨慎。

    2 构建策略

    炒股是一个概率游戏,强如巴菲特也没办法保证这只股票一定能涨。我们能做的是买入上涨概率高的股票,不碰那些下跌概率高的股票。在股票市场中有很多上市公司,有些公司是领导者,有些是追随者,比如白酒行业中贵州茅台(600519)、新能源概念中宁德时代(300750)等都是领导者。我们可以观察这些股票的走势,来判断同行业同概念中其他公司股票价格的走势。基于这种思想,我们用相关性来构建策略。
    本文用沪深300成分股构建股票池,样本期是2020年1月1日到2020年12月31日,数据来源于tushare数据库,官网链接:https://tushare.pro

    import tushare as ts
    import pandas as pd
    import numpy as np
    import copy
    
    pro = ts.pro_api('你的token')
    #1 获取沪深300成分股日线行情数据
    def hqsj_hs():
        df1 = pro.index_weight(index_code='399300.SZ', trade_date='20201231')
        df=pd.DataFrame()
        for i in range(len(df1)):
            df2 = pro.daily(ts_code=df1.iloc[i,1], start_date='20200101', end_date='20201231')
            df=pd.concat([df,df2],axis=0)
        df.to_excel('股票数据.xlsx',index=False)
    hqsj_hs()
    

    这里得到了沪深300成分股的日线行情数据,需要手动将excel表按股票代码和交易日期升序。有些股票在样本期某天停牌,需要剔除该股票数据。这里用A股票当天收益率和其他股票昨天收益率计算相关性。

    #2 计算相关性
    def xgx():
        df=pd.read_excel('股票数据.xlsx',engine='openpyxl')
        result={}
        for i in range(len(df)):
            key=df.iloc[i,0]
            if result.get(key,False):
                result[key].append(df.iloc[i,-3])
            else:
                result[key] = [df.iloc[i,-3]]
    
        result1=copy.deepcopy(result)
        for i in result:
            if len(result[i])!=243:
                del result1[i]
    
        for i in result1:
            result1[i].append([result1[i][1:],result1[i][:-1]])
    
        result2={}
        for i in result1:
            aa = {}
            now=pd.Series(result1[i][-1][0])
            for j in result1:
                pre=pd.Series(result1[j][-1][1])
                xgx=now.corr(pre)
                aa[j]=abs(xgx)
            result2[i]=aa
        #print(result2)
    
        result3={}
        for i in result2:
            result3[i]={max(zip(result2[i].values(), result2[i].keys()))[1]:max(zip(result2[i].values(), result2[i].keys()))[0]}
    
        xxx=[]
        for i in result3:
            for j in result3[i]:
                xxx.append(result3[i][j])
        b=sorted(xxx,reverse = True)[:1] #取相关性最大的
    
        result4={}
        for i in result3:
            for j in result3[i]:
                for x in b:
                    if x==result3[i][j]:
                        result4[i]={j:x}
        print(result4)
        return result4
    

    我们取相关性最大的股票组,得到结果是上海临港(600848)和民生银行(600016),相关性为0.4156。也就是说民生银行(600016)今天跌了,那么上海临港(600848)明天大概率要跌。我们可以在尾盘观察民生银行(600016),如果涨了,则买入上海临港(600848)。到这里就构建了我们的策略。

    3 买股方案

    前文根据2020年1月1日到2020年12月31日的数据构建策略,用于2021年1月1日到2021年3月31日交易。

    #3 获取21年数据
    def test_data():
        result4=xgx()
        ts_code=[]
        for i in result4:
            for j in result4[i]:
                ts_code.append(j)
        df = pd.DataFrame()
        for i in ts_code:
            df1 = pro.daily(ts_code=i, start_date='20210101', end_date='20210331')
            df = pd.concat([df, df1], axis=0)
        df.to_excel('股票数据1.xlsx', index=False)
    test_data()
    
    #4 买股方案
    def mgfa():
        df=pd.read_excel('股票数据1.xlsx',engine='openpyxl')
        timeseries=df['trade_date'].tolist()
        timetime=list(set(timeseries))
        timetime1=sorted(timetime)
        result4=xgx()
        ts1=[] #昨天
        ts2=[] #今天
        for i in result4:
            ts2.append(i)
            for j in result4[i]:
                ts1.append(j)
    
        result1={}
        for i in range(len(df)):
            time=df.iloc[i,1]
            if result1.get(time,False):
                aa.append(df.iloc[i,-3])
            else:
                aa=[]
                aa.append(df.iloc[i,-3])
            result1[time]=aa
    
        result2={}
        for i in result1:
            if i!=20210331:
                aaa=[]
                for j in result1[i]:
                    if j >0:
                        aaa.append(ts2[result1[i].index(j)])
                result2[timetime1[timetime1.index(i)+1]]=aaa
        print(result2)
        return result2
    mgfa()
    

    我们得到了2021年1月1日到2021年3月31日的买股方案,结果为2021年1月5日空仓,2021年1月6日空仓,2021年1月7日买入上海临港(600848)等等。

    4 评估策略

    上文我们得到了买股方案,最后需要进行回测,我们用收益率,夏普率,最大回撤等指标来评估策略的优劣性,收益率和夏普率越大越好,最大回撤越小越好。

    #5 获取测试数据
    def cssj():
        result4=xgx()
        ts_code=[]
        for i in result4:
            ts_code.append(i)
        df = pd.DataFrame()
        for i in ts_code:
            df1 = pro.daily(ts_code=i, start_date='20210101', end_date='20210331')
            df = pd.concat([df, df1], axis=0)
        df.to_excel('股票数据2.xlsx', index=False)
    cssj()
    
    #6 评估策略
    def jssy():
        result2=mgfa()
        result4=xgx()
        df=pd.read_excel('股票数据2.xlsx',engine='openpyxl')
        zdf=[]
        for i in result2:
            if len(result2[i]) == 1:
                for j in result2[i]:
                    for x in range(len(df)):
                        if df.iloc[x, 0] == j and df.iloc[x, 1] == i:
                            zdf.append(df.iloc[x, -3])
            else:
            	zdf.append(0)
        bbb=1
        for i in zdf:
            bbb=bbb*(1+i/100)
        bb=(bbb-1)*100
        print('总收益率/%:',bb)
        print('夏普率:', np.mean(zdf)/np.std(zdf,ddof=1))
        ccc=1
        hc=1
        max_hc=[]
        for i in zdf:
            kk=ccc*(1+i/100)
            if kk<ccc:
                hc=hc*(1+i/100)
            else:
                hc=(hc-1)*100
                max_hc.append(hc)
                hc=1
            ccc=copy.deepcopy(kk)
        print('最大回撤/%:',abs(min(max_hc)))
    jssy()
    

    得到结果是收益率5.858%,夏普率0.108,最大回撤2.26%。与沪深300指数相比,2021年1月1日到2021年3月31日沪深300的收益率是-3.13%,可以看出,策略收益领先沪深300指数。

    5 总结

    本文用相关性构建一个简单的交易策略,但还有许多工作没有完成,有兴趣的读者可以进行改善。比如调参,本文用1年数据来测试1个季度,读者们可以用2年数据测试1个季度,用1年数据测试1个月等等。或者用今天和前天数据计算相关性,或者用所有上市公司代替沪深300,或者取相关性最大的5组股票等等。一个好的策略是需要不断调参不断测试的。本文的策略虽然在2020年第一季度中收益率为5.858%,但没有考虑交易费用,实际收益大约4%。再次强调,本文仅供交流学习参考,不构成任何投资建议。炒股有风险,投资需谨慎。

    完整代码

    import tushare as ts
    import pandas as pd
    import numpy as np
    import copy
    
    pro = ts.pro_api('你的token')
    #1 获取沪深300成分股日线行情数据
    def hqsj_hs():
        df1 = pro.index_weight(index_code='399300.SZ', trade_date='20201231')
        df=pd.DataFrame()
        for i in range(len(df1)):
            df2 = pro.daily(ts_code=df1.iloc[i,1], start_date='20200101', end_date='20201231')
            df=pd.concat([df,df2],axis=0)
        df.to_excel('股票数据.xlsx',index=False)
    hqsj_hs()
    #股票数据.xlsx需要手动将excel表按股票代码和交易日期升序
    #2 计算相关性
    def xgx():
        df=pd.read_excel('股票数据.xlsx',engine='openpyxl')
        result={}
        for i in range(len(df)):
            key=df.iloc[i,0]
            if result.get(key,False):
                result[key].append(df.iloc[i,-3])
            else:
                result[key] = [df.iloc[i,-3]]
    
        result1=copy.deepcopy(result)
        for i in result:
            if len(result[i])!=243:
                del result1[i]
    
        for i in result1:
            result1[i].append([result1[i][1:],result1[i][:-1]])
    
        result2={}
        for i in result1:
            aa = {}
            now=pd.Series(result1[i][-1][0])
            for j in result1:
                pre=pd.Series(result1[j][-1][1])
                xgx=now.corr(pre)
                aa[j]=abs(xgx)
            result2[i]=aa
        #print(result2)
    
        result3={}
        for i in result2:
            result3[i]={max(zip(result2[i].values(), result2[i].keys()))[1]:max(zip(result2[i].values(), result2[i].keys()))[0]}
    
        xxx=[]
        for i in result3:
            for j in result3[i]:
                xxx.append(result3[i][j])
        b=sorted(xxx,reverse = True)[:1] #取相关性最大的
    
        result4={}
        for i in result3:
            for j in result3[i]:
                for x in b:
                    if x==result3[i][j]:
                        result4[i]={j:x}
        print(result4)
        return result4
    #3 获取21年数据
    def test_data():
        result4=xgx()
        ts_code=[]
        for i in result4:
            for j in result4[i]:
                ts_code.append(j)
        df = pd.DataFrame()
        for i in ts_code:
            df1 = pro.daily(ts_code=i, start_date='20210101', end_date='20210331')
            df = pd.concat([df, df1], axis=0)
        df.to_excel('股票数据1.xlsx', index=False)
    test_data()
    
    #4 买股方案
    def mgfa():
        df=pd.read_excel('股票数据1.xlsx',engine='openpyxl')
        timeseries=df['trade_date'].tolist()
        timetime=list(set(timeseries))
        timetime1=sorted(timetime)
        result4=xgx()
        ts1=[] #昨天
        ts2=[] #今天
        for i in result4:
            ts2.append(i)
            for j in result4[i]:
                ts1.append(j)
    
        result1={}
        for i in range(len(df)):
            time=df.iloc[i,1]
            if result1.get(time,False):
                aa.append(df.iloc[i,-3])
            else:
                aa=[]
                aa.append(df.iloc[i,-3])
            result1[time]=aa
    
        result2={}
        for i in result1:
            if i!=20210331:
                aaa=[]
                for j in result1[i]:
                    if j >0:
                        aaa.append(ts2[result1[i].index(j)])
                result2[timetime1[timetime1.index(i)+1]]=aaa
        print(result2)
        return result2
    mgfa()
    #5 获取测试数据
    def cssj():
        result4=xgx()
        ts_code=[]
        for i in result4:
            ts_code.append(i)
        df = pd.DataFrame()
        for i in ts_code:
            df1 = pro.daily(ts_code=i, start_date='20210101', end_date='20210331')
            df = pd.concat([df, df1], axis=0)
        df.to_excel('股票数据2.xlsx', index=False)
    cssj()
    
    #6 评估策略
    def jssy():
        result2=mgfa()
        result4=xgx()
        df=pd.read_excel('股票数据2.xlsx',engine='openpyxl')
        zdf=[]
        for i in result2:
            if len(result2[i]) == 1:
                for j in result2[i]:
                    for x in range(len(df)):
                        if df.iloc[x, 0] == j and df.iloc[x, 1] == i:
                            zdf.append(df.iloc[x, -3])
            else:
                zdf.append(0)
        bbb=1
        for i in zdf:
            bbb=bbb*(1+i/100)
        bb=(bbb-1)*100
        print('总收益率/%:',bb)
        print('夏普率:', np.mean(zdf)/np.std(zdf,ddof=1))
        ccc=1
        hc=1
        max_hc=[]
        for i in zdf:
            kk=ccc*(1+i/100)
            if kk<ccc:
                hc=hc*(1+i/100)
            else:
                hc=(hc-1)*100
                max_hc.append(hc)
                hc=1
            ccc=copy.deepcopy(kk)
        print('最大回撤/%:',abs(min(max_hc)))
    jssy()
    
    
    展开全文
  • 海龟交易法则属于趋势交易,首先建立唐奇安通道(下文会具体解释),即确定上突破线和下突破线,如果价格突破上线,则做多,如果价格突破下线就平仓或做空。
  • 主要运用于长期投资虚拟币或量化交易策略。在海龟策略基础上进行了优化。欢迎同行批评指正。【短线勿扰】
  • 使用R语言实现金融量化交易,介绍了相关策略
  • 3.量化交易策略基本框架

    千次阅读 2021-03-09 18:42:56
    摘要策略编写的基本框架及其实现回测的含义及其实现初步学习解决代码错误周期循环的开始时间自测与自学通过前文对量化交易有了一个基本认识之后,我们开始学习做量化交易。毕竟就像学游泳,有些东西讲是讲不懂,做过...

    摘要

    策略编写的基本框架及其实现

    回测的含义及其实现

    初步学习解决代码错误

    周期循环的开始时间

    自测与自学

    通过前文对量化交易有了一个基本认识之后,我们开始学习做量化交易。毕竟就像学游泳,有些东西讲是讲不懂,做过就会懂。

    从一个非常简单的交易策略开始

    先看一个非常简单的交易策略:

    每天买100股的平安银行。

    为了让这个策略能让计算机执行,首先,要使策略符合“初始化+周期循环”框架,像这样:

    初始化:选定要交易的股票为平安银行

    每天循环:买100股的平安银行

    什么是“初始化+周期循环”框架?

    为了将投资灵感高效地转化成计算机可执行的量化策略,必须基于一种模式来写,框架就是指这种模式。而此框架包含两个部分即初始化与周期循环:

    初始化即指策略最开始运行前要做的事。比如,准备好要交易的股票。

    周期循环即指策略开始后,随着时间一周期一周期地流逝时,每个周期要做的事。如例中,周期为天,周期循环的则是每天买100股的平安银行。

    能帮助你理解这一框架的是,其实人本身日常做交易就是符合“初始化+周期循环”框架的,初始化就是已存在人脑的交易思想与知识,周期循环就是每天或每分钟地查看行情、判断、下单等行为。

    如何把策略变成计算机可执行的程序?

    通过编程将策略写成计算机可识别的代码,具体说,我们这里是用python这门编程语言。

    另外可以用聚宽的向导式策略生成器,这种方法是不需编程的,但灵活性上难免是远不如写代码的。

    那么如何将策略写成代码?

    这并非三言两语就能说清,尤其是对于没有编程基础的人。所以我们将通过后续的内容逐步地介绍。首先我们将学习“初始化+周期循环”框架代码的写法。

    写法一

    def initialize(context):

    这里是用来写初始化代码的地方,例子中就是选定要交易的股票为平安银行

    def handle_data(context,data):

    这里是用来写周期循环代码的地方,例子中就是买100股的平安银行

    写法二

    def initialize(context):

    run_daily(period,time='every_bar')

    这里是用来写初始化代码的地方,例子中就是选定要交易的股票为平安银行

    def period(context):

    这里是用来写周期循环代码的地方,例子中就是买100股的平安银行

    代码应该往哪里写?

    来到聚宽网站后,通过导航栏-我的策略-我的策略进入策略列表,点击新建策略-

    db4a31251b639b7f9e1ddc93c42e1668

    进入策略编辑页,左侧就是策略代码编辑区域,初始会默认给你提供代码模板,全删除后写入我们的代码就好了。

    88b68d191aa903ebffb80748652cca83

    两种写法用哪个好?

    写法一是从前的老写法,将逐步弃用,写法二是聚宽系统改进后的新写法,推荐使用写法二。

    def、context等都是什么意思?

    其实是在调用聚宽提供好的函数,展开讲很复杂,不理解的话先记住,后面的学习内容会让你理解。

    框架写成代码了,那例子的完整的代码该怎么写呢?

    剩下的两行代码这么写。完全理解需要学习后续的内容,此处不要求理解。知道大概什么样子往哪里写即可。

    选定要交易的股票为平安银行:

    g.security = '000001.XSHE'

    买100股的平安银行(市价单写法):

    order(g.security, 100)

    以写法二为例把剩下的代码补上后,完整代码为:

    def initialize(context):

    run_daily(period,time='every_bar')

    g.security = '000001.XSHE'

    def period(context):

    order(g.security, 100)

    那么现在这些代码就可以运行了吗?

    是的。以写法二为例,如图把代码写到策略编辑区,设置好初始资金与起止时间(比如初始资金100000元,起止时间20160601-20161231),频率设置成天。点击编译运行,运行结束后就可以看到结果了。

    cdec0ebc16c4154f2a2c3afefd4380ea

    可以看到,若你20160601有初始资金100000元,每个交易日尝试买100股的平安银行,到20161231,你的收益曲线将如图中蓝线般增长。图中红线是基准收益(默认是沪深300指数,代表整个市场增长水平)

    接下来,点击运行回测,运行结束后就可以看到更为详细的结果,包括下单记录、持仓记录等。

    84e79235cc475cc440167b3187ef0e74

    策略出错不能运行?

    策略不能运行时,日志中会报错并给出一定的提示信息,像这样:

    b727983b0d591574cb72347335087937

    首先注意,右上角的箭头按钮能展开运行日志。看到日志中,最后一行是错误的提示信息:

    SyntaxError: invalid syntax

    汉义是 语法错误:不合法的语法。

    最后一行之前的是错误的位置信息,一般只看后面就行。

    File "user_code.py", line 1

    def initialize(context)

    ^

    意思是文件user_code.py(就是你的策略代码)的第一行,“^”符号指向的位置有错。你到代码中的这个位置看下,会发现少个冒号。

    为了顺利运行策略,需要耐心解决错误,但错误的原因极度的复杂多样(所以日志的报错信息也多种多样,不止图上一种),故在此只针对例子讲下新手容易犯的错误:

    符号要用英文输入法。下图,代码第一行的冒号是中文的,所以出错

    746647f439f6886eebb672575b7e6183

    拼写不要错。下图,security拼写错了

    751cebab4fc1aba8c657abf492d58693

    缩进要对齐。下图,缩进没对齐。缩进的时候可以按键盘tab键或四个空格。

    a186b7520ce9f441cb3f4d4b5df3ebf9

    编程界往往把错误叫bug,而不断调试去除错误的过程叫debug,做量化时也是时常听到的说法,大家应该知道下。

    而且debug通常就是要耗费不低于写bug写代码的时间的,所以会debug是很重要的能力,大家平时debug的时候不妨多思考下,如何更有效率的debug。当然,我们后续也会介绍些debug的技巧。

    回测、编译运行、运行回测都是什么意思?

    像刚刚那样,用一段时间内的历史的真实行情数据,来验证一个确定的交易策略在这段时间表现如何,这个过程叫回测。

    运行回测就是是字面意思,让计算机运行这次回测,运行后会告诉你策略在这段时间表现情况,比如收益率、年化收益率、最大回撤、夏普比率等指标,而且一般也会包括下单记录、持仓记录等。

    编译运行其实也是让计算机运行这次回测,不过相比于点击运行回测,编译运行的结果比运行回测要简单,只有收益率等指标,因此也速度更快。所以,当还不必要得到详细的结果时,或只是想调试下策略的代码,看是否无误可运行时,编译运行就比运行回测更方便。

    周期循环具体是什么时候开始的呢?

    如果策略频率为天,是每个交易日开始生效,从9:30直到15:00(从股市开市到收市),所以例子中是每个交易日9:30开市循环就开始,一天一次地循环执行买入股票的操作。

    如果策略频率为分钟,是每个分钟开始时执行,所以例子中的买入股票的操作是每个交易日从9:30:00开始,然后9:31:00,直到14:59:00。接着下一天9:30:00,如此一分钟一次地循环执行的。

    de883feec9064e658d40b2e4b3031e08

    虽然频率只有为分钟和每天可选,但通过不同的代码可以实现按周按月周期循环,而且分钟级别里下单时间也是可以自己选的,不过代码的写法则与写法一和写法二那样略有不同,后面会讲到。

    自测与自学

    按教程实践下。

    通过搜索自学K线、bug、debug的含义。

    展开全文
  • 策略交易逻辑:当价格触及布林线上轨的时候进行卖出,当触及下轨的时候,进行买入。回测收益率99.77%,最大回撤:32.04%,夏普比率:0.43
  • 揭秘人人都能学的量化思维投资数字货币在上一篇中,我们介绍了量化交易的一般流程、基本概念以及一些基本的策略设计思路,在这一篇中,我们将要利用上述成果,手把手教您构建第一个量化交易策略!我们以比特币作为...
  • 作者:悠悠做神仙 来源: 恒生LIGHT云社区 上一篇文章 量化交易入门系列1:编程语言与数据源 ,介绍了关于量化交易的基本概念,以及要做量化交易的编程语言选择,和量化交易的一些数据源获取工具。那么,本篇将介绍...
  • 编程语言-股票量化交易策略的研究及MATLAB的实现.pdf
  • 作者:悠悠做神仙 来源: 恒生LIGHT云社区 ...
  • 博文《【实战】——基于GUI编程的python股票量化交易策略之双均线策略》利用GUI编程开发用户操作界面,以此来绘制动态的K线及双均线,实现界面动态交互效果。 学习完该实战项目后,你将掌握基于tkinter程序包开发...
  • 它以滞后性的代价获得了平滑性,比如,在一轮牛市行情后,只有当价格出现大幅度的回撤之后才会在移动平均线上有所体现,而对于投资者而言则大大增加了交易成本。如果使用双均线策略,就可以在考虑长周期趋势的同时,...
  • 量化交易策略设计实战教材.pptx
  • 量化交易策略干货收集

    千次阅读 2020-05-28 16:42:07
    量化交易策略 =========================== 价值投资 成长股内在价值投资:http://www.joinquant.com/post/541 三一投资管理公司价值选股法:http://www.joinquant.com/post/556 低估价值选股策略:...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼策略名称:横盘突破策略策略思路:日内交易策略,收盘平仓;横盘突破在过去30根K线的高低点围绕中轴上下0.5%的范围内波动时;上轨=过去30根K线的最高价;下轨=过去30根...
  • 基于python的量化交易策略毕业设计报告.doc
  • 一、常见的features (一)time lags (二) (三) (四)CCI CCI = (Typical price - MA of Typical price) / (0.015 * Standard deviation of Typical price) (五)Ease of Movement(EVM) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,692
精华内容 6,676
关键字:

量化交易策略