【Quant102】 經典技術指標 Pandas 實現(第一部分)

绝不原创的飞龙發表於2024-05-13

雙均線策略

假設你是個高階程式設計師和量化研究員,編寫函式實現雙均線策略。函式接受資料幀df,較短均線的列名稱short_col和較長均線的列名稱long_colinplace引數控制是否原地更新df。買賣訊號應儲存在signal列中。最後返回df

def dual_moving_average_strategy(df, short_col='sma_short', long_col='sma_long', inplace=False):
    """
    實現雙均線策略,生成買賣訊號。
    
    引數:
    df : DataFrame
        包含價格資料的DataFrame。
    short_col : str
        短週期均線的列名。
    long_col : str
        長週期均線的列名。
    
    返回:
    df : DataFrame
        原始DataFrame,增加了一個名為'signal'的列,包含買賣訊號。
    """
    if not inplace:
        df = df.copy()

    # 初始化訊號列,預設為無操作
    df['signal'] = 0
    
    # 產生買入訊號:短週期均線由下向上穿越長週期均線
    df.loc[(df[short_col] > df[long_col]) & (df[short_col].shift(1) <= df[long_col].shift(1)), 'signal'] = 1
    
    # 產生賣出訊號:短週期均線由上向下穿越長週期均線
    df.loc[(df[short_col] < df[long_col]) & (df[short_col].shift(1) >= df[long_col].shift(1)), 'signal'] = -1
    
    return df

布林帶指標

假設你是個高階程式設計師和量化研究員,編寫函式實現布林帶指標。函式接受資料幀df,中布林帶的列名稱mid_col,上布林帶列名稱upper_col,下布林帶列名稱lower_colinplace引數控制是否原地更新dfdf包含四個列:open開盤價、high最高價、low最低價和close收盤價。所有指標都應當儲存到df中,最後返回df

def bollinger_bands(
	df, mid_col='mid_band', 
	upper_col='upper_band', 
	lower_col='lower_band', 
	window=20, num_std=2, 
	inplace=False
):
    """
    計算布林帶指標,並更新DataFrame。
    
    引數:
    df : DataFrame
        包含價格資料的DataFrame,必須包含'open', 'high', 'low', 'close'列。
    window : int, optional
        計算簡單移動平均線SMA的視窗大小,預設為20。
    num_std : int, optional
        計算布林帶通道時使用的標準差倍數,預設為2。
    inplace : bool, optional
        是否在原地更新DataFrame,預設為False。
    
    返回:
    df : DataFrame
        包含布林帶指標的新DataFrame(如果inplace為False)。
    """
    
    # 複製DataFrame以避免修改原始資料
    if not inplace:
        df = df.copy()
    
    # 計算中軌(簡單移動平均線SMA)
    df['mid_band'] = df['close'].rolling(window=window).mean()
    
    # 計算價格的標準差
    std = df['close'].rolling(window=window).std()
    
    # 計算布林帶上軌
    df['upper_band'] = df['mid_band'] + (std * num_std)
    
    # 計算布林帶下軌
    df['lower_band'] = df['mid_band'] - (std * num_std)
    
    return df

布林帶策略

假設你是個高階程式設計師和量化研究員,編寫函式實現布林帶策略。函式接受資料幀df,中軌的列名稱mid_col,上軌列名稱upper_col,下軌列名稱lower_colinplace引數控制是否原地更新df。買賣訊號應儲存在signal列中。最後返回df

def bollinger_bands_strategy(df, mid_col='mid_band', upper_col='upper_band', lower_col='lower_band', inplace=False):
    """
    實現布林帶策略,生成買賣訊號。
    
    引數:
    df : DataFrame
        包含價格資料的DataFrame,必須包含'mid_col', 'upper_col', 'lower_col'列。
    mid_col : str
        中軌(通常是簡單移動平均線SMA)的列名。
    upper_col : str
        上軌的列名。
    lower_col : str
        下軌的列名。
    inplace : bool, optional
        是否在原地更新DataFrame,預設為False。
    
    返回:
    df : DataFrame
        原始DataFrame,增加了一個名為'signal'的列,包含買賣訊號。
    """
    
    # 複製DataFrame以避免修改原始資料
    if not inplace:
        df = df.copy()
    
    # 初始化訊號列,預設為無操作
    df['signal'] = 0
    
    # 產生買入訊號:價格跌破下軌
    df.loc[df['close'] < df[lower_col], 'signal'] = 1
    
    # 產生賣出訊號:價格突破上軌
    df.loc[df['close'] > df[upper_col], 'signal'] = -1
    
    return df

MACD 指標

假設你是個高階程式設計師和量化研究員,編寫函式實現 MACD 指標。函式接受資料幀dfinplace引數控制是否原地更新dfdf包含四個列:open開盤價、high最高價、low最低價和close收盤價。所有指標都應當儲存到df中,最後返回df

def macd(df, dea_col='dea', dif_col='dif', hist_col='macd_hist', fast_window=12, slow_window=26, signal_window=9, inplace=False):
    """
    計算MACD指標,並更新DataFrame。
    
    引數:
    df : DataFrame
        包含價格資料的DataFrame,必須包含'open', 'high', 'low', 'close'列。
    fast_window : int, optional
        快速EMA的視窗大小,預設為12。
    slow_window : int, optional
        慢速EMA的視窗大小,預設為26。
    signal_window : int, optional
        訊號線的視窗大小,預設為9。
    inplace : bool, optional
        是否在原地更新DataFrame,預設為False。
    
    返回:
    df : DataFrame
        包含MACD指標的新DataFrame(如果inplace為False)。
    """
    
    # 複製DataFrame以避免修改原始資料
    if not inplace:
        df = df.copy()
    
    # 計算快速EMA
    fast_ema = df['close'].ewm(span=fast_window, adjust=False).mean()
    
    # 計算慢速EMA
    slow_ema = df['close'].ewm(span=slow_window, adjust=False).mean()
    
    # 計算MACD線
    df[dea_col] = fast_ema - slow_ema
    
    # 計算訊號線
    df[dif_col] = df[dea_col].ewm(span=signal_window, adjust=False).mean()
    
    # 計算MACD柱
    df[hist_col] = df[dea_col] - df[dif_col]
    
    return df

MACD 策略

假設你是個高階程式設計師和量化研究員,編寫函式實現MACD策略。函式接受資料幀df,DEA列名稱dea_col,DIF列名稱dif_col,柱狀圖列名稱hist_colinplace引數控制是否原地更新df。買賣訊號應儲存在signal列中。最後返回df

def macd_strategy(df, dea_col='dea', dif_col='dif', hist_col='macd_hist', inplace=False):
    """
    實現MACD策略,生成買賣訊號。
    
    引數:
    df : DataFrame
        包含MACD指標資料的DataFrame,必須包含'dea_col', 'dif_col', 'hist_col'列。
    dea_col : str
        DEA(訊號線)的列名。
    dif_col : str
        DIF(MACD線)的列名。
    hist_col : str
        MACD柱狀圖的列名。
    inplace : bool, optional
        是否在原地更新DataFrame,預設為False。
    
    返回:
    df : DataFrame
        原始DataFrame,增加了一個名為'signal'的列,包含買賣訊號。
    """
    
    # 複製DataFrame以避免修改原始資料
    if not inplace:
        df = df.copy()
    
    # 初始化訊號列,預設為無操作
    df['signal'] = 0
    
    # 產生買入訊號:DIF上穿DEA
    df.loc[(df[dif_col] > df[dea_col]) & (df[dif_col].shift(1) <= df[dea_col].shift(1)), 'signal'] = 1
    
    # 產生賣出訊號:DIF下穿DEA
    df.loc[(df[dif_col] < df[dea_col]) & (df[dif_col].shift(1) >= df[dea_col].shift(1)), 'signal'] = -1
    
    return df

RSI 指標

假設你是個高階程式設計師和量化研究員,編寫函式實現 RSI 指標。函式接受資料幀dfinplace引數控制是否原地更新dfdf包含四個列:open開盤價、high最高價、low最低價和close收盤價。所有指標都應當儲存到df中,最後返回df

def rsi(df, rsi_col='rsi', window=14, inplace=False):
    """
    計算RSI指標,並更新DataFrame。
    
    引數:
    df : DataFrame
        包含價格資料的DataFrame,必須包含'open', 'high', 'low', 'close'列。
    window : int, optional
        RSI指標的視窗大小,預設為14。
    inplace : bool, optional
        是否在原地更新DataFrame,預設為False。
    
    返回:
    df : DataFrame
        包含RSI指標的新DataFrame(如果inplace為False)。
    """
    
    # 複製DataFrame以避免修改原始資料
    if not inplace:
        df = df.copy()
    
    # 計算價格變動
    chg = df['close'].diff()
    
    # 計算上漲和下跌的平均值
    up_avg = chg.where(chg > 0).rolling(window=window).mean()
    down_avg = -chg.where(chg < 0).rolling(window=window).mean()
    
    # 防止除以零
    up_avg.fillna(0, inplace=True)
    down_avg.fillna(0, inplace=True)
    
    # 計算RSI
    df[rsi_col] = 100 - (100 / (1 + (up_avg / down_avg)))
    
    return df

RSI 策略

假設你是個高階程式設計師和量化研究員,編寫函式實現RSI策略。函式接受資料幀df,RSI列名稱rsi_colinplace引數控制是否原地更新df。買賣訊號應儲存在signal列中。最後返回df

def rsi_strategy(df, rsi_col='rsi', inplace=False):
    """
    實現RSI策略,生成買賣訊號。
    
    引數:
    df : DataFrame
        包含RSI指標資料的DataFrame,必須包含'rsi_col'列。
    rsi_col : str
        RSI指標的列名。
    inplace : bool, optional
        是否在原地更新DataFrame,預設為False。
    
    返回:
    df : DataFrame
        原始DataFrame,增加了一個名為'signal'的列,包含買賣訊號。
    """
    
    # 複製DataFrame以避免修改原始資料
    if not inplace:
        df = df.copy()
    
    # 初始化訊號列,預設為無操作
    df['signal'] = 0
    
    # 產生買入訊號:RSI低於30
    df.loc[df[rsi_col] < 30, 'signal'] = 1
    
    # 產生賣出訊號:RSI高於70
    df.loc[df[rsi_col] > 70, 'signal'] = -1
    
    return df

KDJ 指標

假設你是個高階程式設計師和量化研究員,編寫函式實現 KDJ 指標。函式接受資料幀dfinplace引數控制是否原地更新dfdf包含四個列:open開盤價、high最高價、low最低價和close收盤價。所有指標都應當儲存到df中,最後返回df

def kdj(df, k_col='K', d_col='D', j_col='J', n=9, m1=3, m2=3, inplace=False):
    """
    計算KDJ指標,並更新DataFrame。
    
    引數:
    df : DataFrame
        包含價格資料的DataFrame,必須包含'open', 'high', 'low', 'close'列。
    n : int, optional
        計算KDJ指標的時間視窗,預設為9。
    m1 : int, optional
        計算D線的時間視窗,預設為3。
    m2 : int, optional
        計算J線的引數,預設為3。
    inplace : bool, optional
        是否在原地更新DataFrame,預設為False。
    
    返回:
    df : DataFrame
        包含KDJ指標的新DataFrame(如果inplace為False)。
    """
    
    # 複製DataFrame以避免修改原始資料
    if not inplace:
        df = df.copy()
    
    # 計算最小值和最大值
    low_min = df['low'].rolling(window=n).min()
    high_max = df['high'].rolling(window=n).max()
    
    # 計算K值
    df[k_col] = (df['close'] - low_min) / (high_max - low_min) * 100
    
    # 計算D值
    df[d_col] = df[k_col].rolling(window=m1).mean()
    
    # 計算J值
    df[j_col] = m2 * df[d_col] - df[k_col].rolling(window=m2).mean()
    
    return df

KDJ 策略

假設你是個高階程式設計師和量化研究員,編寫函式實現KDJ策略。函式接受資料幀df,K/D/J列名稱k_cold_colj_colinplace引數控制是否原地更新df。買賣訊號應儲存在signal列中。最後返回df

def kdj_strategy(df, k_col='K', d_col='D', j_col='J', inplace=False):
    """
    實現KDJ策略,生成買賣訊號。
    
    引數:
    df : DataFrame
        包含KDJ指標資料的DataFrame,必須包含'k_col', 'd_col', 'j_col'列。
    k_col : str
        K值的列名。
    d_col : str
        D值的列名。
    j_col : str
        J值的列名。
    inplace : bool, optional
        是否在原地更新DataFrame,預設為False。
    
    返回:
    df : DataFrame
        原始DataFrame,增加了一個名為'signal'的列,包含買賣訊號。
    """
    
    # 複製DataFrame以避免修改原始資料
    if not inplace:
        df = df.copy()
    
    # 初始化訊號列,預設為無操作
    df['signal'] = 0
    
    # 產生買入訊號:K值上穿D值
    df.loc[(df[k_col] > df[d_col]) & (df[k_col].shift(1) <= df[d_col].shift(1)), 'signal'] = 1
    
    # 產生賣出訊號:K值下穿D值
    df.loc[(df[k_col] < df[d_col]) & (df[k_col].shift(1) >= df[d_col].shift(1)), 'signal'] = -1
    
    return df

CCI 指標

假設你是個高階程式設計師和量化研究員,編寫函式實現 CCI 指標。函式接受資料幀dfinplace引數控制是否原地更新dfdf包含四個列:open開盤價、high最高價、low最低價和close收盤價。所有指標都應當儲存到df中,最後返回df

def cci(df, cci_col='cci', n=20, inplace=False):
    """
    計算CCI指標,並更新DataFrame。
    
    引數:
    df : DataFrame
        包含價格資料的DataFrame,必須包含'open', 'high', 'low', 'close'列。
    n : int, optional
        CCI指標的時間視窗,預設為20。
    inplace : bool, optional
        是否在原地更新DataFrame,預設為False。
    
    返回:
    df : DataFrame
        包含CCI指標的新DataFrame(如果inplace為False)。
    """
    
    # 複製DataFrame以避免修改原始資料
    if not inplace:
        df = df.copy()
    
    # 計算移動平均值
    sma = df['close'].rolling(window=n).mean()
    
    # 計算標準差
    std = df['close'].rolling(window=n).std()
    
    # 計算CCI
    df[cci_col] = (df['close'] - sma) / (0.015 * std)
    
    return df

CCI 策略

假設你是個高階程式設計師和量化研究員,編寫函式實現CCI策略。函式接受資料幀df,CCI列名稱cci_colinplace引數控制是否原地更新df。買賣訊號應儲存在signal列中。最後返回df

def cci_strategy(df, cci_col='cci', inplace=False):
    """
    實現CCI策略,生成買賣訊號。
    
    引數:
    df : DataFrame
        包含CCI指標資料的DataFrame,必須包含'cci_col'列。
    cci_col : str
        CCI指標的列名。
    inplace : bool, optional
        是否在原地更新DataFrame,預設為False。
    
    返回:
    df : DataFrame
        原始DataFrame,增加了一個名為'signal'的列,包含買賣訊號。
    """
    
    # 複製DataFrame以避免修改原始資料
    if not inplace:
        df = df.copy()
    
    # 初始化訊號列,預設為無操作
    df['signal'] = 0
    
    # 產生買入訊號:CCI低於-100
    df.loc[df[cci_col] < -100, 'signal'] = 1
    
    # 產生賣出訊號:CCI高於+100
    df.loc[df[cci_col] > 100, 'signal'] = -1
    
    return df

OBV 指標

假設你是個高階程式設計師和量化研究員,編寫函式實現 OBV 指標。函式接受資料幀dfinplace引數控制是否原地更新dfdf包含四個列:open開盤價、high最高價、low最低價和close收盤價。所有指標都應當儲存到df中,最後返回df

def obv(df, obv_col='obv', inplace=False):
    """
    計算OBV指標,並更新DataFrame。
    
    引數:
    df : DataFrame
        包含價格資料的DataFrame,必須包含'open', 'high', 'low', 'close'列。
    inplace : bool, optional
        是否在原地更新DataFrame,預設為False。
    
    返回:
    df : DataFrame
        包含OBV指標的新DataFrame(如果inplace為False)。
    """
    
    # 複製DataFrame以避免修改原始資料
    if not inplace:
        df = df.copy()
    
	# 計算收盤價差異的符號
    chg = df['close'].diff()
	sgn = np.sign(chg)
	sgn.iloc[0] = 0
	# 計算OBV
	df[obv_col] = (df['volume'] * sgn).cumsum()
    
    return df

OBV 策略

假設你是個高階程式設計師和量化研究員,編寫函式實現OBV策略。函式接受資料幀df,OBV列名稱obv_colinplace引數控制是否原地更新df。買賣訊號應儲存在signal列中。最後返回df

def obv_strategy(df, obv_col, inplace=False):
    """
    實現OBV策略,生成買賣訊號。
    
    引數:
    df : DataFrame
        包含OBV指標資料的DataFrame,必須包含'obv_col'列。
    obv_col : str
        OBV指標的列名。
    inplace : bool, optional
        是否在原地更新DataFrame,預設為False。
    
    返回:
    df : DataFrame
        原始DataFrame,增加了一個名為'signal'的列,包含買賣訊號。
    """
    
    # 複製DataFrame以避免修改原始資料
    if not inplace:
        df = df.copy()
    
    # 初始化訊號列,預設為無操作
    df['signal'] = 0
    
    # 產生買入訊號:OBV連續上升
    df.loc[df[obv_col].rolling(window=3).sum() > 0, 'signal'] = 1
    
    # 產生賣出訊號:OBV連續下降
    df.loc[df[obv_col].rolling(window=3).sum() < 0, 'signal'] = -1
    
    return df

ADX 指標

假設你是個高階程式設計師和量化研究員,編寫函式實現 ADX 指標。函式接受資料幀dfinplace引數控制是否原地更新dfdf包含四個列:open開盤價、high最高價、low最低價和close收盤價。所有指標都應當儲存到df中,最後返回df

def adx(df, window=14, inplace=False):
    """
    計算ADX指標,並更新DataFrame。
    
    引數:
    df : DataFrame
        包含價格資料的DataFrame,必須包含'open', 'high', 'low', 'close'列。
    window : int, optional
        ADX指標的時間視窗,預設為14。
    inplace : bool, optional
        是否在原地更新DataFrame,預設為False。
    
    返回:
    df : DataFrame
        包含ADX指標的新DataFrame(如果inplace為False)。
    """
    
    # 複製DataFrame以避免修改原始資料
    if not inplace:
        df = df.copy()
    
    # 計算最高價和最低價之間的差異
    df['range'] = df['high'] - df['low']
    
    # 計算動量(Momentum)
    plus_dm = np.where(df['close'] - df['open'] > 0, df['range'], 0)
    minus_dm = np.where(df['open'] - df['close'] > 0, -df['range'], 0)
    
    # 計算ADM和ADN
    plus_dm_mean = plus_dm.rolling(window=window).mean()
    minus_dm_mean = minus_dm.rolling(window=window).mean()
    
    # 計算DX
    dx = (plus_dm_mean - minus_dm_mean) / (plus_dm_mean + minus_dm_mean)
    dx_mean = dx.rolling(window=window).mean()
    
    # 計算ADX
    df['adx'] = (100 - 100 / (1 + np.sqrt(dx_mean)))
    
    return df

ADX 策略

假設你是個高階程式設計師和量化研究員,編寫函式實現ADX策略。函式接受資料幀df,ADX列名稱adx_colinplace引數控制是否原地更新df。買賣訊號應儲存在signal列中。最後返回df

def adx_strategy(df, adx_col='adx', inplace=False):
    """
    實現ADX策略,生成買賣訊號。
    
    引數:
    df : DataFrame
        包含ADX指標資料的DataFrame,必須包含'adx_col'列。
    adx_col : str
        ADX指標的列名。
    inplace : bool, optional
        是否在原地更新DataFrame,預設為False。
    
    返回:
    df : DataFrame
        原始DataFrame,增加了一個名為'signal'的列,包含買賣訊號。
    """
    
    # 複製DataFrame以避免修改原始資料
    if not inplace:
        df = df.copy()
    
    # 初始化訊號列,預設為無操作
    df['signal'] = 0
    
    # 產生買入訊號:ADX超過25
    df.loc[df[adx_col] > 25, 'signal'] = 1
    
    # 產生賣出訊號:ADX低於25
    df.loc[df[adx_col] < 25, 'signal'] = -1
    
    return df

VWAP 指標

假設你是個高階程式設計師和量化研究員,編寫函式實現 VWAP 指標。函式接受資料幀dfinplace引數控制是否原地更新dfdf包含四個列:open開盤價、high最高價、low最低價和close收盤價。所有指標都應當儲存到df中,最後返回df

def vwap(df, vwap_col='vwap', inplace=False):
    """
    計算VWAP指標,並更新DataFrame。
    
    引數:
    df : DataFrame
        包含價格資料的DataFrame,必須包含'open', 'high', 'low', 'close', 'volume'列。
    window : int, optional
        滾動視窗的大小,預設為1。
    inplace : bool, optional
        是否在原地更新DataFrame,預設為False。
    
    返回:
    df : DataFrame
        包含VWAP指標的新DataFrame(如果inplace為False)。
    """
    
    # 複製DataFrame以避免修改原始資料
    if not inplace:
        df = df.copy()
    
    # 計算VWAP
    df['vwap'] = (df['open'] + df['high'] + df['low'] + df['close']) / 4 * df['volume']
        
    return df

VWAP 策略

假設你是個高階程式設計師和量化研究員,編寫函式實現VWAP策略。函式接受資料幀df,VWAP列名稱vwap_colinplace引數控制是否原地更新df。買賣訊號應儲存在signal列中。最後返回df

def vwap_strategy(df, vwap_col='vwap', inplace=False):
    """
    實現VWAP策略,生成買賣訊號。
    
    引數:
    df : DataFrame
        包含VWAP指標資料的DataFrame,必須包含'vwap_col'列。
    vwap_col : str
        VWAP指標的列名。
    inplace : bool, optional
        是否在原地更新DataFrame,預設為False。
    
    返回:
    df : DataFrame
        原始DataFrame,增加了一個名為'signal'的列,包含買賣訊號。
    """
    
    # 複製DataFrame以避免修改原始資料
    if not inplace:
        df = df.copy()
    
    # 初始化訊號列,預設為無操作
    df['signal'] = 0
    
    # 產生買入訊號:價格突破VWAP
    df.loc[df['close'] > df[vwap_col], 'signal'] = 1
    
    # 產生賣出訊號:價格跌破VWAP
    df.loc[df['close'] < df[vwap_col], 'signal'] = -1
    
    return df

相關文章