116번째 원본 기사는 "개인의 성장과 부의 자유, 세계 운영의 논리, AI 양적 투자"에 중점을 둡니다.
베이징의 전염병 상황은 아직 변곡점에 도달하지 않은 것 같지만 이 3일 후에 와야 합니다.
오늘 우리는 기계 학습 모델을 백테스팅 프레임워크에 통합하고 백테스팅을 위해 백트레이더와 연결하는 데 집중할 것입니다.
이전에 데이터 라벨링, 기능 엔지니어링, 데이터 세트 분할, 모델 준비, 교육 및 평가 등을 완료했습니다. 정렬을 위해 테스트 세트에서 pred_score를 생성합니다.
01 정렬 연산자
정렬 연산자는 특정 요소 순서에 따라 후보 풀 또는 선택된 대상 풀에서 상위 K를 선택하는 것입니다. 예를 들어 큰 것에서 작은 것까지 상위 2개를 선택하거나, 기계 모델 분기. 이 알고리즘은 qlib의 TopK와 비슷하고 qlib의 것은 더 복잡하며 전체 시장에서 주식 선택을 목표로 유동성을 확보하기 위해 하위 5개 종목의 제거를 강조하지만 원리는 비슷합니다.
class SelectTopK: def __init__(self, K=1, order_by='order_by', b_ascending=False): self.K = K self.order_by = order_by self.b_ascending = b_ascending def __call__(self, context): stra = context[ '전략'] 기능 = context['features'] if self.order_by not in features.columns: logger.error('排序字段{}未计算'.format(self.order_by)) return bar = get_current_bar(context) if 막대가 없음: logger.error('取不到bar') true 반환 bar.sort_values(self.order_by, ascending=self.b_ascending, inplace=True) inplace=True) 선택됨 = [] pre_selected = None if 'selected' in context: pre_selected = context['selected'] del context['selected'] # 当前全候选集 # 按顺序往下选K个 for code in list(bar.code): if pre_selected : if code in pre_selected: selected.append(code) else: selected.append(code) if len(selected) >= self.K: break context['selected'] = selected
메인 로직의 __call__ 함수에서는 호출될 때마다 계산됩니다.
1. 데이터에 order_by 섹션이 있는지 확인하십시오.
2. 현재 날짜의 막대를 가져와 order_by 필드를 정렬합니다(업그레이드가 기본값이며 내림차순 지정 가능).
3. 이전에 스크리닝 하위 집합이 있는 경우 이 하위 집합을 사용하고, 그렇지 않으면 전체 자산 후보 풀을 사용합니다.
앞에서 뒤로 K를 선택합니다.
02 기계 학습 계산 pred_score
엔진 바디에는 add_features 기능이 있습니다.
1. 백트레이더의 뇌에 추가되었습니다.
2. 데이터 기능 엔지니어링 및 데이터 라벨링은 dataloader에 의해 자동으로 수행됩니다.
def add_features(self, symbols, names, fields): # 1. 데이터 세트 추가, 즉 symbol에서 s에 대한 자산 후보 세트 : self.add_data(s) # 2. 기능 엔지니어링 self.features = self.loader.load_one_df(symbols , 이름, 필드)
3. 다음 단계는 데이터를 추정하는 것입니다.
def add_model(self, model, split_date, feature_names): self.dataset = Dataset(dataloader=self.loader, split_date=split_date, feature_names=feature_names) model.fit(self.dataset) self.features['pred_score'] = 모델 .predict(self.dataset) print(self.features['pred_score'])
데이터 세트를 사용하여 데이터 로더를 래핑하면 시계열 데이터 세트를 자동으로 분할하고 모델을 사용하여 데이터 세트를 교육하고 점수를 매길 수 있습니다. 그런 다음 데이터를 예측하고 pred_score 열을 생성합니다.
후속 학습 프로세스는 동일합니다.
e.add_model(SklearnModel(RandomForestRegressor()), split_date='2020-01-01', feature_names=feature_names)
![](https://img-blog.csdnimg.cn/img_convert/3829b706fc9e0a53b721dc34f1142076.png)
훈련 세트의 점수는 높지만 테스트 세트의 점수는 음수입니다. (분명히 오버피팅)
SelectTopK 연산자인 order_by='pred_score'를 사용하여 정렬합니다.
e.run_algo_strategy([SelectTopK(K=1, order_by='pred_score',b_ascending=False), WeightEqually()]) e.analysis(pyfolio=False)
요약: 오늘 프레임워크 프로세스를 진행하고 내일 계속해서 최적화하십시오.
코드와 데이터는 행성 정량화 열에 동기화되었습니다.