策略验证_买入口诀_双管齐下买进不怕

写在前面:
1. 本文中提到的“股票策略校验工具”的具体使用操作请查看该博文;
2. 文中知识内容来自书籍《同花顺炒股软件从入门到精通》
3. 本系列文章是用来学习技法,文中所得内容都仅仅只是作为演示功能使用

目录

解说

策略代码

结果


解说

        所谓“双管齐下”形态是由两条并列的长下影小实体组成。股价下跌到低位后,如果连续出现两条长下影小实体的K线,且下影线的最低点较为接近,称为“双管齐下”。它像两条长钢管扎向地下,使地基坚实可靠。该形态的出现,表明股价已进入了底部,或者离底部已经不远了,中长线投资者可开始建仓,短线也可以介入,后市获利一般可靠。

策略验证_买入口诀_双管齐下买进不怕_第1张图片

        出现“双管齐下” 的形态后,股票投资者需遵循以下操作原则。

        1)双管齐下形态可在底部行情中出现,也可在顶部行情和下降行情图中出现。在顶部行情或下降途中出现时,显示的多为卖出信号,极个别情况出现反弹走势,但多数是昙花一现,很难做出差价,最好不要介入。相反地,如果在底部行情出现,显示的均是买入信号,股票投资者可以放心地进行买入操作。

        2)“双管齐下”形态中两条K线的下影长度一般要达到K线实体部分的1倍以上,少于这一比率,有效性会降低。另外,对该图线两个低点之间的距离也有一定要求,一般来说,两者间的差距不能超过1%,而且越接近越好,过大的差距会影响判断的准确性。如果股票出现“双管齐下”形态,股民在这时买入股票,都可获得相当大的收益。

        3)如果个别股票在底部或在下降途中,连续出现多条长下影小实体的K线,其低点也十分接近,这种情况也可按“双管齐下”进行操作,只是取其下影低点最为接近的两条K线作为“双管齐下”的对象就行。

        4)在个别情况下,“双管齐下”形态出现后,股价有时会出现不涨反跌的走势,此时千万不要割肉出逃,应耐心守候。股价经过短暂的调整后,会反转向上,恢复正常走势,最终仍能获利。如果买进时的心态不够稳定,一遇到下跌走势就卖出股票,操作心态就会变得越来越坏,取胜的概率就会越来越低。

策略代码

自定义:

#
买入点 第二根K线后一个交易日
取买入点后第三个交易日的收盘价,如果涨跌幅为正,定义为胜
def excute_strategy(base_data,data_dir):
    '''
    买入口诀 - 双管齐下,买进不怕
    解析:
    1. 两条并列的长下影小实体组成,且下影线的最低点较为接近
    2. 下影长度一般要达到实体的1倍以上
    3. 两个低点之间的差距不超过1%
    自定义:
    1. 检查买进后,第三日的收盘价,如果收盘价比买进收盘价大,说明有效
    2. 胜率 = 有效的次数/总次数
    3. 买进时点 =》 双管齐下出现后下一交易日
    4. 小实体 =》 实体长度是昨日收盘价的0.5%到1.5%之间
    5. 差距不超过1% =》 两者最低价差值小于K线整体长度的1%
    只计算最近两年的数据
    :param base_data:股票代码与股票简称 键值对
    :param data_dir:股票日数据文件所在目录
    :return:
    '''
    import pandas as pd
    import numpy as np
    import talib,os
    from datetime import datetime
    from dateutil.relativedelta import relativedelta

    def res_pre_two_year_first_day():
        pre_year_day = (datetime.now() - relativedelta(years=2)).strftime('%Y-%m-%d')
        return pre_year_day
    caculate_start_date_str = res_pre_two_year_first_day()

    dailydata_file_list = os.listdir(data_dir)

    total_count = 0
    total_win = 0
    check_count = 0
    list_list = []
    detail_map = {}
    for item in dailydata_file_list:
        item_arr = item.split('.')
        ticker = item_arr[0]
        secName = base_data[ticker]
        file_path = data_dir + item
        df = pd.read_csv(file_path,encoding='utf-8')
        # 删除停牌的数据
        df = df.loc[df['openPrice'] > 0].copy()
        df['o_date'] = df['tradeDate']
        df['o_date'] = pd.to_datetime(df['o_date'])
        df = df.loc[df['o_date'] >= caculate_start_date_str].copy()
        # 保存未复权收盘价数据
        df['close'] = df['closePrice']
        # 计算前复权数据
        df['openPrice'] = df['openPrice'] * df['accumAdjFactor']
        df['closePrice'] = df['closePrice'] * df['accumAdjFactor']
        df['highestPrice'] = df['highestPrice'] * df['accumAdjFactor']
        df['lowestPrice'] = df['lowestPrice'] * df['accumAdjFactor']

        if len(df)<=0:
            continue

        # 开始计算
        df.reset_index(inplace=True)
        df['i_row'] = [i for i in range(len(df))]
        df['body_length'] = abs(df['closePrice']-df['openPrice'])
        df['small_body'] = 0
        df.loc[(df['body_length']/df['closePrice'].shift(1)>0.005) & (df['body_length']/df['closePrice'].shift(1)<0.015),'small_body'] = 1
        df['bottom_shadow_length'] = 0
        df.loc[df['openPrice']>df['closePrice'],'bottom_shadow_length'] = df['closePrice'] - df['lowestPrice']
        df.loc[df['openPrice']<=df['closePrice'],'bottom_shadow_length'] = df['openPrice'] - df['lowestPrice']

        df['long_bottom_shadow'] = 0
        df.loc[df['bottom_shadow_length']/df['body_length']>1,'long_bottom_shadow'] = 1
        df['two_have'] = 0
        df.loc[(df['small_body']==1) & (df['long_bottom_shadow']==1),'two_have'] = 1
        df['two_sort_yeah'] = 0
        df.loc[(df['two_have']==1) & (df['two_have'].shift(1)==1),'two_sort_yeah'] = 1
        df['final_yeah'] = 0
        df.loc[(df['two_sort_yeah']==1) & (abs(df['lowestPrice']-df['lowestPrice'].shift(1))/(df['highestPrice']-df['lowestPrice'])<=0.01),'final_yeah'] = 1

        df['three_chg'] = round(((df['close'].shift(-3) - df['close'])/df['close'])*100,4)
        df['three_after_close'] = df['close'].shift(-3)

        df_target = df.loc[df['final_yeah']==1].copy()

        node_count = 0
        node_win = 0
        duration_list = []
        table_list = []
        i_row_list = df_target['i_row'].values.tolist()
        for i,row0 in enumerate(i_row_list):
            row = row0 + 1
            if row >= len(df):
                continue
            date_str = df.iloc[row]['tradeDate']
            cur_close = df.iloc[row]['close']
            three_after_close = df.iloc[row]['three_after_close']
            three_chg = df.iloc[row]['three_chg']

            table_list.append([
                i,date_str,cur_close,three_after_close,three_chg
            ])
            duration_list.append([row-2,row+3])
            node_count += 1
            if three_chg>0:
                node_win +=1
            pass

        list_list.append({
            'ticker':ticker,
            'secName':secName,
            'count':node_count,
            'win':0 if node_count<=0 else round((node_win/node_count)*100,2)
        })
        detail_map[ticker] = {
            'table_list': table_list,
            'duration_list': duration_list
        }

        total_count += node_count
        total_win += node_win
        check_count += 1
        pass
    df = pd.DataFrame(list_list)

    results_data = {
        'check_count':check_count,
        'total_count':total_count,
        'total_win':0 if total_count<=0 else round((total_win/total_count)*100,2),
        'start_date_str':caculate_start_date_str,
        'df':df,
        'detail_map':detail_map
    }
    return results_data

结果

策略验证_买入口诀_双管齐下买进不怕_第2张图片 本文校验的数据是随机抽取的81个股票

 

你可能感兴趣的:(pandas基础与金融实例练习,金融,python)