양적 거래 요인 데이터 처리의 극한

개요

전략을 구성하기 전에 먼저 얻은 데이터를 전처리해야합니다. 극단 값을 제거하려면 일부 극단 값의 간섭을 제거해야합니다. 그림에 표시된대로 :
여기에 사진 설명 삽입

Factor Panel 구조 분석

Pandas의 패널 데이터 구조는 3 차원 구조로 단면 데이터와 시퀀스 데이터로 구성됩니다.
여기에 사진 설명 삽입

암호:

get_price("000001.XSHE", start_date="2020-01-01", end_date="2020-01-06")

출력 결과 :
여기에 사진 설명 삽입

price = get_price(["000024.XSHE","000001.XSHE","000002.XSHE"], start_date="2015-04-01",end_date="2015-04-12")
price

출력 결과 :
여기에 사진 설명 삽입

단면 데이터

횡단면 데이터 : 동시에 서로 다른 통계 단위의 동일한 통계 지표로 구성된 데이터 열입니다.

# 获取个别财务数据
q = query(
    fundamentals.income_statement.revenue,
    fundamentals.income_statement.cost_of_goods_sold
).filter(
    fundamentals.stockcode.in_(["000024.XSHE","000001.XSHE"])
)

fund = get_fundamentals(q, entry_date="2020-01-03")

# 换成截面
fund.iloc[:,0,:]

출력 결과 :
여기에 사진 설명 삽입

# 获取所有财务数据
q = query(
    fundamentals.income_statement.revenue,
    fundamentals.income_statement.cost_of_goods_sold
)

fund = get_fundamentals(q, entry_date="2020-01-03")

# 换成截面
fund.iloc[:,0,:]

출력 결과 :
여기에 사진 설명 삽입

시퀀스 데이터

시퀀스 데이터 : 서로 다른 시점에서 수집 된 데이터입니다. 이러한 유형의 데이터는 특정 사물, 현상 등의 시간 경과에 따른 상태 또는 변화 정도를 반영합니다.
여기에 사진 설명 삽입
참고 : 다중 요인 분석은 시퀀스 데이터 대신 단면 데이터를 사용합니다.

요인 감소

우선, 극단 값을 제거하는 것은 "비정상적인 데이터"를 삭제하는 것이 아니라 이러한 데이터를 정상 값으로 다시 "당기는"것임을 이해해야합니다.

극단 값을 제거하는 세 가지 방법이 있습니다.

  • Quantile de-extreme
  • 극단 값에 대한 절대 편차 중앙값
  • 극단 값에 대한 정규 분포

Quantile de-extreme

먼저 몇 가지 개념을 이해하겠습니다.

  1. 중간 수
  2. 사 분위수
  3. 백분위 수

중간 수

중앙값은 데이터를 크기 순으로 배열하여 일련의 숫자를 형성하는 것입니다. 중앙값은 시리즈의 중간에있는 숫자입니다. 중앙값은 Me (중앙값 약어)로 표시됩니다.
여기에 사진 설명 삽입
위 그림에서 볼 수 있습니다. 중앙값 평균에 비해 최대 / 최소값의 영향을 덜 받으므로 평균 대신 중앙값을 선택합니다.

사 분위수

사 분위수는 작은 것부터 큰 것까지 모든 값을 배열하여 사 분위수로 나누는 것으로, 세 개의 분할 점 위치의 값이 사 분위수입니다.
여기에 사진 설명 삽입

  • "작은 사 분위수"라고도하는 1 사 분위수 (Q1)는 내림차순으로 표본에있는 모든 값의 25 번째 백분위 수와 같습니다.
  • "중앙값"이라고도하는 2 사 분위수 (Q2)는 최소값에서 최대 값으로 정렬 된 표본의 모든 값의 50 번째 백분위 수와 같습니다.
  • "큰 사 분위수"라고도하는 3 사 분위수 (Q3)는 작은 것에서 큰 것으로 분류 된 샘플의 모든 값의 75 번째 백분위 수와 같습니다.

백분위 수

백분위 수는 데이터가있는 특정 % 숫자를 의미하며 백분위 수와 백분위 수에는 두 가지 이름이 있습니다.

원리

분위수 제거의 원리는 지정된 분위수 간격을 벗어난 극단 값을 분위수 점의 값으로 대체하는 것입니다.

분석

  • 지정된 날짜 또는 간격의 pe_ratio 단면 데이터를 가져옵니다.
  • Quantile de-extreme
  • 극단 값을 제거한 결과와 극단 값 이전의 결과를 비교합니다.

암호

함수:

import numpy as np

# 求出两个分位数的点的值
def quantile(factor, up, down):
    """分位数去极值"""
    up_scale = np.percentile(factor, up)
    down_scale = np.percentile(factor, down)
    
    factor = np.where(factor > up_scale, up_scale, factor)
    factor = np.where(factor < down_scale, down_scale, factor)
    return factor

암호:

# 筛选条件
q = query(
    fundamentals.eod_derivative_indicator.pe_ratio
)

# 获取数据
fund = get_fundamentals(q, entry_date="20200102").iloc[:, 0, :]

# 上下 2.5% 处理
fund["pe_ratio_fixed"] = quantile(fund["pe_ratio"], 97.5, 2.5)

# 画图
plt.figure(figsize=(15, 10))
plt.bar(fund.index[:500],fund['pe_ratio'][:500])
plt.bar(fund.index[:500],fund['pe_ratio_fixed'][:500])
plt.xticks(fund.index[:501:50])
plt.title("pe_ratio vs pe_ratio_fixed")
plt.show()

출력 결과 :
여기에 사진 설명 삽입

극단 값에 대한 절대 편차 중앙값

절대 편차 방법 (MAD : Median Absolute Deviation)은 먼저 모든 요인과 중앙값 사이의 거리를 계산하여 이상 값을 탐지해야하는 방법입니다.

계산 방법

  1. 요인의 중앙값 찾기
  2. 중앙값 | x-median |에서 각 요인 값의 절대 편차를 가져옵니다.
  3. 절대 편차 값의 중앙값 MAD, 중앙값 (| x-median |)을 가져옵니다.
  4. MAD_e = 1.4826 * MAD를 계산합니다. 그런 다음 매개 변수 n을 결정하고 조정합니다.

극단적 인 판단 :
여기에 사진 설명 삽입
참고 : 일반적으로 오프셋 중앙값은 MAD_e의 3 배입니다. 표본이 정규 분포를 만족하고 충분히 크면 상한 및 하한을 초과하는 값이 특이 치임을 증명할 수 있습니다.

암호

함수:

def mad(factor):
    """3倍中位数去极值"""
    
    # 求出因子值的中位数
    median = np.median(factor)
    
    # 求出因子值与中位数的差值, 进行绝对值
    mad = np.median(abs(factor - median))
    
    # 定义几倍的中位数上下限
    high = median + (3 * 1.4826 * mad)
    low = median - (3 * 1.4826 * mad)
    
    # 替换上下限
    factor = np.where(factor > high, high, factor)
    factor = np.where(factor < low, low, factor)
    return factor

암호:

# 筛选条件
q = query(
    fundamentals.eod_derivative_indicator.pe_ratio
)
# 获取数据
fund = get_fundamentals(q, entry_date="20200102").iloc[:, 0, :]

# 中位数绝对偏差法
fund["pe_ratio_fixed"] = mad(fund["pe_ratio"])

# 画图
plt.figure(figsize=(15, 10))
plt.bar(fund.index[:500],fund['pe_ratio'][:500], color="green")
plt.bar(fund.index[:500],fund['pe_ratio_fixed'][:500])
plt.xticks(fund.index[:501:50])
plt.title("pe_ratio vs pe_ratio_fixed")
plt.show()

출력 결과 :
여기에 사진 설명 삽입

극단 값에 대한 정규 분포

정규 분포:
여기에 사진 설명 삽입
여기에 사진 설명 삽입

  • 1σ : 데이터의 68.27 %가 하나의 표준 편차 내에 있습니다.
  • 2σ : 데이터의 95.45 %가 두 표준 편차 내에 있습니다.
  • 3σ : 데이터의 99.73 %가 3 개의 표준 편차 내에 있습니다.
  • 4σ : 데이터의 99.99 %가 4 개의 표준 편차 내에 있음

암호

def three_sigma(factor):
    """3 sigma 去极值"""
    
    # 求出因子数据的平均数和标准差
    mean = factor.mean()
    std = factor.std()
    
    # 左右的数据加减 3 个标准差
    high = mean + (3 * std)
    low = mean - (3 * std)
    
    # 替换极值数据
    factor = np.where(factor > high, high, factor)
    factor = np.where(factor <low, low, factor)
    
    return factor
# 筛选条件
q = query(
    fundamentals.eod_derivative_indicator.pe_ratio
)
# 获取数据
fund = get_fundamentals(q, entry_date="20200102").iloc[:, 0, :]

# 3 sigma 去极值
fund["pe_ratio_fixed"] = three_sigma(fund["pe_ratio"])

# 画图
plt.figure(figsize=(15, 10))
plt.bar(fund.index[:500],fund['pe_ratio'][:500], color="orange")
plt.bar(fund.index[:500],fund['pe_ratio_fixed'][:500], color= "red")
plt.xticks(fund.index[:501:50])
plt.title("pe_ratio vs pe_ratio_fixed")
plt.show()

출력 결과 :
여기에 사진 설명 삽입

요약하자면

극값 제거를 할 때 극단 값에 대한 정규 분포 방법을 사용하지 않는 것이 가장 좋으며, 극값에 대한 분위수 및 중앙 절대 편차를 사용하는 것이 좋습니다.

추천

출처blog.csdn.net/weixin_46274168/article/details/114964710