요인 데이터 처리의 비 극단적 가치
개요
전략을 구성하기 전에 먼저 얻은 데이터를 전처리해야합니다. 극단 값을 제거하려면 일부 극단 값의 간섭을 제거해야합니다. 그림에 표시된대로 :
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
먼저 몇 가지 개념을 이해하겠습니다.
- 중간 수
- 사 분위수
- 백분위 수
중간 수
중앙값은 데이터를 크기 순으로 배열하여 일련의 숫자를 형성하는 것입니다. 중앙값은 시리즈의 중간에있는 숫자입니다. 중앙값은 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)은 먼저 모든 요인과 중앙값 사이의 거리를 계산하여 이상 값을 탐지해야하는 방법입니다.
계산 방법
- 요인의 중앙값 찾기
- 중앙값 | x-median |에서 각 요인 값의 절대 편차를 가져옵니다.
- 절대 편차 값의 중앙값 MAD, 중앙값 (| x-median |)을 가져옵니다.
- 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()
출력 결과 :
요약하자면
극값 제거를 할 때 극단 값에 대한 정규 분포 방법을 사용하지 않는 것이 가장 좋으며, 극값에 대한 분위수 및 중앙 절대 편차를 사용하는 것이 좋습니다.