Example #1
0
def MACDcode(code,
             label='Close',
             fee=0.0003,
             longd=26,
             shortd=12,
             difd=9,
             position='Case4',
             plot=True):
    """
    code:     上海交易所和深圳交易所的股票代码
    label:    Close
    fee:      手续费,0.0003
    longd:    慢周期,26
    shortd:   快周期,12
    difd:     DIF 的周期时间,9,
    position: 判断买入的方式,Case1 以位置,Case2 为交叉,Case3 MACD柱行图
    """
    try:
        df = wt.get_k_data(code)
        MACDdf(df, label, fee, longd, shortd, difd, position, plot)
    except:
        if len(code) == 6:
            if code[0] == '0' or code[0] == '3':
                code = 'YAHOO/SZ_' + code
            elif code[0] == '6':
                code = 'YAHOO/SS_' + code
        elif len(code) == 4:
            code = 'YAHOO/HK_' + code
        df = wq.quandlyd(code)
        MACDdf(df, label, fee, longd, shortd, difd, position, plot)
    return
Example #2
0
def KDJcode(code, label='Close', fee=0.0003, window=5, plot=True):
    """
    """
    if len(code) == 6:
        if code[0] in ['0', '3', '2', '6', '9']:
            df = wt.get_k_data(code)
            KDJdf(df, label, fee, window, plot)
        else:
            sys.exit()
    elif len(code) == 4:
        code = 'YAHOO/HK_' + code
        df = wq.quandlyd(code)
        KDJdf(df, label, fee, window, plot)
    return
Example #3
0
def Tutlecode(code,label='Close',N1=20,N2=10,fee=0.0005,path='',plot=True):

    try:
        df=wt.get_k_data(code)
        d=Tutledf(df,label,N1,N2,fee,path,plot)
    except:
        if len(code)==6:
            if code[0]=='0' or code[0]=='3':
                code='YAHOO/SZ_'+code
            elif code[0]=='6':
                code='YAHOO/SS_'+code
        elif len(code)==4:
            code='YAHOO/HK_'+code
        df=wq.quandlyd(code)
        d=Tutledf(df,label,N1,N2,fee,path,plot)
    return
Example #4
0
def RSIcode(code, label='Close', fee=0.0003, longd=26, shortd=12, plot=True):

    try:
        df = wt.get_k_data(code)
        RSIdf(df, label, fee, longd, shortd, plot)
    except:
        if len(code) == 6:
            if code[0] == '0' or code[0] == '3':
                code = 'YAHOO/SZ_' + code
            elif code[0] == '6':
                code = 'YAHOO/SS_' + code
        elif len(code) == 4:
            code = 'YAHOO/HK_' + code
        df = wq.quandlyd(code)
        RSIdf(df, label, fee, longd, shortd, plot)
    return
Example #5
0
def ChaikinADcode(code,
                  label='Close',
                  fee=0.0005,
                  M=5,
                  N=10,
                  path='',
                  plot=True):

    try:
        df = wt.get_k_data(code)
        d = ChaikinADdf(df, label, fee, M, N, path, plot)
    except:
        if len(code) == 6:
            if code[0] == '0' or code[0] == '3':
                code = 'YAHOO/SZ_' + code
            elif code[0] == '6':
                code = 'YAHOO/SS_' + code
        elif len(code) == 4:
            code = 'YAHOO/HK_' + code
        df = wq.quandlyd(code)
        d = ChaikinADdf(df, label, fee, M, N, path, plot)
    return
Example #6
0
    return df


def ChaikinADcode(code,
                  label='Close',
                  fee=0.0005,
                  M=5,
                  N=10,
                  path='',
                  plot=True):

    try:
        df = wt.get_k_data(code)
        d = ChaikinADdf(df, label, fee, M, N, path, plot)
    except:
        if len(code) == 6:
            if code[0] == '0' or code[0] == '3':
                code = 'YAHOO/SZ_' + code
            elif code[0] == '6':
                code = 'YAHOO/SS_' + code
        elif len(code) == 4:
            code = 'YAHOO/HK_' + code
        df = wq.quandlyd(code)
        d = ChaikinADdf(df, label, fee, M, N, path, plot)
    return


if __name__ == "__main__":
    df = wt.get_k_data('000039')
    d = ChaikinADdf(df)
Example #7
0
def ChaikinADv2_code(code="",
                     label='Close',
                     fee=0.0005,
                     M=5,
                     N=10,
                     path='',
                     plot=True,
                     Wr=False):

    if code == "":
        sys.exit()
    elif isinstance(code, str):
        if len(code) == 6:
            df = wt.get_k_data(code)
        elif len(code) == 4:
            df = wq.quandlyd(code)
            df = df.iloc[-640:, ]
        else:
            sys.exit()

    df = df.sort_index(ascending=True)
    #print(df)
    df = df.drop_duplicates()
    df = df.reset_index()
    df = df.rename(columns=lambda x: str(x).lower())
    label = label.lower()
    if 'p_change' not in df.columns:
        df.loc[:, 'p_change'] = df[label] / df[label].shift(1) - 1

    df.loc[:, 'volume_log'] = df['volume'].apply(np.log10)

    df.loc[:, 'AD_m'] = pd.Series.rolling(
        (2 * df[label] - df['high'] - df['low']) / (df['high'] - df['low']) *
        df['volume_log'],
        window=M).mean()
    df.loc[:, 'AD_n'] = pd.Series.rolling(
        (2 * df[label] - df['high'] - df['low']) / (df['high'] - df['low']) *
        df['volume_log'],
        window=N).mean()
    df.loc[:, 'Chaikin'] = df['AD_m'] - df['AD_n']

    buyi = df[(df['Chaikin'] > df['Chaikin'].shift(1)) |
              ((df['Chaikin'] > 0) & (df['Chaikin'].shift(1) < 0))].index
    #buyi=df[(df['Chaikin'] > df['Chaikin'].shift(1))].index
    df.loc[buyi, 'Sign'] = 1
    selli = df[(df['Chaikin'] < df['Chaikin'].shift(1)) |
               ((df['Chaikin'] < 0) & (df['Chaikin'].shift(1) > 0))].index
    #selli=df[(df['Chaikin']<df['Chaikin'].shift(1))].index
    df.loc[selli, 'Sign'] = 0
    df['Sign'].fillna(method='ffill', inplace=True)
    df.loc[:, 'position'] = df['Sign'].shift(1)
    df.loc[:,
           'Cash_index'] = (1 +
                            (df['p_change'] - fee) * df['position']).cumprod()

    _position_code(df, code, W=False)

    df = df.set_index('date')
    #print(df.tail())
    if plot:
        fig = plt.figure(figsize=(9, 5))
        fig.subplots_adjust(hspace=0.15, wspace=0.05,\
                            left=0.06,right=0.99,\
                            top=0.97,bottom=0.09)
        ax1 = fig.add_subplot(211)
        df[['AD_m', 'AD_n']].plot(ax=ax1)
        plt.grid(True)
        ax2 = fig.add_subplot(212)
        df['Cash_index'].plot(ax=ax2)
        plt.grid(True)
        plt.show()

    #print(df.tail())
    return
Example #8
0
def MACDv2_code(code,
                label='Close',
                fee=0.0005,
                ld=26,
                sd=12,
                md=9,
                path='',
                plot=True,
                Wr=False):
    """
    code:为输入的股票代码,大陆的为6个数字代码,香港的为4个数字代码。
         like:string 600036,0005
    label:为所采用的列,open,high,close,low 或是Adj Close, Close
    ld,sd,md:为计算平均数的周期,以及dea 的计算周期
    fee:为交易的费率
    path:生成文件保存的地址及文件名,默认是不保存文件
    """
    if code == None:
        sys.exit()
    elif isinstance(code, str):
        if len(code) == 6:
            df = wt.get_k_data(code)
        elif len(code) == 4:
            df = wq.quandlyd(code)
            df = df.iloc[-640:, ]
            #print(df)
        else:
            sys.exit()

    #df=df.drop_duplicates()
    #df.index=pd.to_datetime(df.index)
    df = df.reset_index()
    df = df.rename(columns=lambda x: str(x).lower())
    label = label.lower()
    if 'p_change' not in df.columns:
        df.loc[:, 'p_change'] = df[label] / df[label].shift(1) - 1
    dfi = df.shape[0]
    df.loc[0, 'M_ld'] = df.loc[0, label]
    df.loc[0, 'M_sd'] = df.loc[0, label]
    for i in range(1, dfi):
        df.loc[i:, 'M_ld'] = df.loc[i, label] * 2 / (
            ld + 1) + df.loc[i - 1, 'M_ld'] * (ld - 1) / (ld + 1)
        df.loc[i:, 'M_sd'] = df.loc[i, label] * 2 / (
            sd + 1) + df.loc[i - 1, 'M_sd'] * (sd - 1) / (sd + 1)

    df.loc[:, 'DIF'] = df['M_sd'] - df['M_ld']
    df.loc[0, 'DEA'] = df.loc[0, 'DIF']
    for i in range(1, dfi):
        df.loc[i, 'DEA'] = df.loc[i - 1, 'DEA'] * (md - 1) / (
            md + 1) + df.loc[i, 'DIF'] * 2 / (md + 1)

    df.loc[:, 'BAR'] = 2 * (df['DIF'] - df['DEA'])

    buyi1 = df[(df['DIF'] > df['DEA'])
               & (df['DIF'] > df['DIF'].shift(-1))].index
    df.loc[buyi1, 'Sign'] = 0
    seli1 = df[(df['DIF'] < df['DEA'])
               & (df['DIF'] < df['DIF'].shift(-1))].index
    df.loc[seli1, 'Sign'] = 1

    df['Sign'].fillna(method='ffill', inplace=True)

    df.loc[:, 'position'] = df['Sign'].shift(1)
    df.loc[:,
           'Cash_index'] = (1 +
                            (df['p_change'] - fee) * df['position']).cumprod()
    df.loc[:, 'vov'] = pd.Series.rolling(df['p_change'], window=9).std()
    df = df.set_index('date')

    _position_code(df, code)

    if plot:
        fig = plt.figure(figsize=(9, 5))
        fig.subplots_adjust(hspace=0.15, wspace=0.05,\
                            left=0.06,right=0.99,\
                            top=0.97,bottom=0.09)
        ax1 = fig.add_subplot(411)
        df[label].plot(ax=ax1)
        plt.grid(True)

        ax2 = fig.add_subplot(412)
        df['Cash_index'].plot(ax=ax2)
        plt.grid(True)

        ax3 = fig.add_subplot(413)
        df[['p_change', 'vov']].plot(ax=ax3)
        plt.grid(True)

        ax4 = fig.add_subplot(414)
        df['BAR'].plot(kind='bar', ax=ax4)

        ax5 = ax4.twinx()
        df[['DIF', 'DEA']].plot(kind='line', ax=ax4)
        plt.grid(True)

        monthsLoc = mpl.dates.MonthLocator()
        weeksLoc = mpl.dates.WeekdayLocator()
        ax4.xaxis.set_major_locator(monthsLoc)
        ax4.xaxis.set_minor_locator(weeksLoc)
        monthsFmt = mpl.dates.DateFormatter('%b')
        ax4.xaxis.set_major_formatter(monthsFmt)
        plt.show()
    if path != '':
        df.to_csv(path)
    return
Example #9
0
def Tutlev2_code(code=None,
                 label='Close',
                 N1=20,
                 N2=10,
                 fee=0.0005,
                 path='',
                 plot=True,
                 Wr=False):
    """
    code:为输入的股票代码,大陆的为6个数字代码,香港的为4个数字代码。
         like:string 600036,0005
    df:为输入的DataFrame数据
    label:为所采用的列,open,high,close,low 或是Adj Close
    N1,N2:为计算平均数的周期
    fee:为交易的费率
    path:生成文件保存的地址及文件名,默认是不保存文件
    """
    if code == None:
        sys.exit()
    elif isinstance(code, str):
        if len(code) == 6:
            df = wt.get_k_data(code)
        elif len(code) == 4:
            df = wq.quandlyd(code)
            df = df.iloc[-640:, ]
            #print(df)
        else:
            sys.exit()

    if isinstance(df, pd.DataFrame):
        df = df.sort_index(ascending=True)
        df = df.drop_duplicates()
        df = df.reset_index()
        df = df.rename(columns=lambda x: str(x).lower())
        label = label.lower()
        index_data = df
        if 'p_change' not in df.columns:
            index_data['p_change'] = (
                index_data[label] / index_data[label].shift(1) - 1) * 100
        # 保留这几个需要的字段:'date', 'high', 'low', 'close', 'change'
        index_data = index_data[[
            'date', 'open', 'high', 'low', label, 'p_change'
        ]]

        index_data.loc[:, 'High_Close_Price_N1_Day'] = pd.Series.rolling(
            index_data['high'], window=N1, center=False).max()
        index_data['High_Close_Price_N1_Day'].fillna(
            value=index_data['high'].expanding(min_periods=1).max())
        index_data.loc[:, 'Low_Close_Price_N2_Day'] = pd.Series.rolling(
            index_data['low'], window=N2, center=False).min()
        index_data['Low_Close_Price_N2_Day'].fillna(
            value=index_data['low'].expanding(min_periods=1).min())
        #index_data['Low_Close_Price_N2_Day']=index_data['Low_Close_Price_N2_Day'].shift()
        # 当当天的【close】> 昨天的【最近N1个交易日的最高点】时,将【收盘发出的信号】设定为1
        buy_index = index_data[
            index_data['close'] > index_data['High_Close_Price_N1_Day'].shift(
                1)].index
        index_data.loc[buy_index, 'Sign'] = 1
        # 当当天的【close】< 昨天的【最近N2个交易日的最低点】时,将【收盘发出的信号】设定为0
        sell_index = index_data[
            index_data['close'] < index_data['Low_Close_Price_N2_Day'].shift(
                1)].index
        index_data.loc[sell_index, 'Sign'] = 0
        # 计算每天的仓位,当天持有上证指数时,仓位为1,当天不持有上证指数时,仓位为0
        index_data['Sign'].fillna(method='ffill', inplace=True)
        index_data['position'] = index_data['Sign'].shift(1)
        #index_data['position'].fillna(method='ffill', inplace=True)
        #当仓位为1时,已当天的开盘价买入股票,当仓位为0时,以收盘价卖出该股份。计算从数据期内的收益
        index_data['Cash_index'] = (
            (index_data['p_change'] / 100 - fee) * index_data['position'] +
            1.0).cumprod()
        #initial_idx = index_data.iloc[0]['close'] / (1 + (index_data.iloc[0]['p_change']/100))
        initial_idx = 1
        index_data['Cash_index'] *= initial_idx
        _position_code(index_data, code)

        #print ('The turtle methon Signal:')
        if path != '':
            index_data.to_csv(path)
        # ==========计算每年指数的收益以及海龟交易法则的收益
        index_data['p_change_turtle'] = (
            index_data['p_change']) * index_data['position']
        index_data = index_data.reset_index(drop=True)
        index_data = index_data.set_index('date')
        if plot:
            index_data[[label, 'p_change', 'Cash_index']].plot(subplots=True,
                                                               figsize=(9, 5),
                                                               grid=True)
            plt.grid(True)
            plt.show()
    return
Example #10
0
def KDJv2_code(code=None,
               label='close',
               window=9,
               fee=0.0005,
               path='',
               plot=True,
               Wr=False):
    """
    code:为输入的股份代码,6位的为境内的代码,4位的为香港的代码
    label:为所采用的列,open,high,close,low 或是Adj Close
    fee:为交易的费率
    path:生成文件保存的地址及文件名,默认是不保存文件

    """
    if code == None:
        sys.exit()
    elif isinstance(code, str):
        if len(code) == 6:
            df = wt.get_k_data(code)
        elif len(code) == 4:
            df = wq.quandlyd(code)
            df = df.iloc[-640:, ]
            #print(df)
        else:
            sys.exit()

    if isinstance(df, pd.DataFrame):
        df = df.sort_index(ascending=True)
        df = df.drop_duplicates()
        df = df.reset_index()
        df = df.rename(columns=lambda x: str(x).lower())
        label = label.lower()
        stock_dataT = df

        if 'p_change' not in df.columns:
            stock_dataT['p_change'] = (
                stock_dataT[label] / stock_dataT[label].shift(1) - 1) * 100
        stock_data = stock_dataT.loc[:, ('date', 'high', 'low', label,
                                         'p_change')].copy()
        # 计算KDJ指标
        stock_data['low_list'] = pd.Series.rolling(stock_data['low'],
                                                   window=window,
                                                   center=False).min()
        stock_data['low_list'].fillna(value=stock_data['low'].expanding(
            min_periods=1).min())
        stock_data['high_list'] = pd.Series.rolling(stock_data['high'],
                                                    window=window,
                                                    center=False).max()
        stock_data['high_list'].fillna(value=stock_data['high'].expanding(
            min_periods=1).max())
        stock_data['rsv'] = (stock_data[label] - stock_data['low_list']) / (
            stock_data['high_list'] - stock_data['low_list']) * 100
        stock_data['KDJ_K'] = pd.Series.ewm(stock_data['rsv'],
                                            ignore_na=False,
                                            min_periods=0,
                                            adjust=True,
                                            com=2).mean()
        stock_data['KDJ_D'] = pd.Series.ewm(stock_data['KDJ_K'],
                                            ignore_na=False,
                                            min_periods=0,
                                            adjust=True,
                                            com=2).mean()
        stock_data['KDJ_J'] = 3 * stock_data['KDJ_K'] - 2 * stock_data['KDJ_D']
        # 计算KDJ指标金叉、死叉情况
        ###通常就敏感性而言,J值最强,K值次之,D值最慢,而就安全性而言,J值最差,K值次之,D值最稳
        ##金叉用1表示,死叉用0表示
        buyi = stock_data[(stock_data['KDJ_K'] > stock_data['KDJ_D'])
                          & (stock_data['KDJ_K'].shift(-1) <
                             stock_data['KDJ_D'].shift(-1))].index
        stock_data.loc[buyi, 'Sign'] = 0
        selli = stock_data[(stock_data['KDJ_K'] < stock_data['KDJ_D'])
                           & (stock_data['KDJ_K'].shift(-1) >
                              stock_data['KDJ_D'].shift(-1))].index
        stock_data.loc[selli, 'Sign'] = 1
        stock_data['Sign'].fillna(method='ffill', inplace=True)
        ##测试反向操作的效果,即买进信号则卖出,卖出信号则买进。
        stock_data['position'] = stock_data['Sign'].shift(1)
        #stock_data['position'].fillna(method='ffill', inplace=True)
        #当仓位为1时,已当天的开盘价买入股票,当仓位为0时,以收盘价卖出该股份。计算从数据期内的收益
        stock_data['Cash_index'] = ((stock_data['p_change']/100  -fee) * \
                                    stock_data['position']+1).cumprod()
        #initial_idx = stock_data.iloc[0]['close'] / (1 + (stock_data.iloc[0]['p_change']/100))
        initial_idx = 1
        stock_data['Cash_index'] *= initial_idx

        stock_data = stock_data.set_index('date')
        _position_code(stock_data, code, W=Wr)
        """
        if (stock_data.iloc[-1]['position']==1)&(stock_data.iloc[-2]['position']==1):
            print ('持有这只股票Holding code')
        elif (stock_data.iloc[-1]['position']==1)&(stock_data.iloc[-2]['position']==0):
            print ('开始买进这只股票Buy code')
        elif (stock_data.iloc[-1]['position']==0)&(stock_data.iloc[-2]['position']==1):
            print ('开始卖出这只股票Sell code')
        else:
            print ('保持空仓Keeping Short Position code')   
        """
        if path != '':
            stock_data.to_csv(path)
        stock_data['vov'] = pd.Series.rolling(stock_data['p_change'],
                                              window=window,
                                              center=False).std()
        if plot:
            stock_data[[label, 'p_change', 'vov',
                        'Cash_index']].plot(subplots=True,
                                            figsize=(9, 5),
                                            grid=True)
            plt.grid(True)
            plt.show()
        return
Example #11
0
        df.loc[selli, 'Sign'] = 0

    elif position == 'Case4':
        #交叉情况
        buyi=df[(df['DIF'].shift(-1)<df['DEA'].shift(-1)) & \
                 (df['DIF']>df['DEA'])].index
        selli=df[((df['DIF'].shift(-1)>df['DEA'].shift(-1)) & \
                  (df['DIF']<df['DEA']))].index
        df.loc[buyi, 'Sign'] = 0
        df.loc[selli, 'Sign'] = 1

    df['Sign'].fillna(method='ffill', inplace=True)
    df['position'] = df['Sign'].shift(1)

    df['Cash_ind'] = (1 + (df['p_change'] - fee) * df['position']).cumprod()

    _position(df)

    df = df.set_index('date')

    if plot:
        plott(df, label)

    return


if __name__ == "__main__":
    df = wt.get_k_data('601166')
    MACDdf(df, position='Case4')
    #MACDcode('601166')