백트레이더 프레임워크와 통합된 기계 학습 모델

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)

훈련 세트의 점수는 높지만 테스트 세트의 점수는 음수입니다. (분명히 오버피팅)

SelectTopK 연산자인 order_by='pred_score'를 사용하여 정렬합니다.

e.run_algo_strategy([SelectTopK(K=1, order_by='pred_score',b_ascending=False), WeightEqually()]) 
e.analysis(pyfolio=False)

요약: 오늘 프레임워크 프로세스를 진행하고 내일 계속해서 최적화하십시오.

코드와 데이터는 행성 정량화 열에 동기화되었습니다.

ETF 로테이션 + RSRS 타이밍 + 카만 필터: 연간 48.41%, 샤프 비율 1.89

금융 기계 학습: 데이터 세트 분할 및 기준선 모델

ETF 모멘텀 회전 + 시장 타이밍: 30% 연간 전략

추천

출처blog.csdn.net/weixin_38175458/article/details/128052333