30秒配置一个年化21.5%的趋势轮动策略(代码+数据)

我们花30秒来配置经典的“大小盘趋势轮动策略”。

第一步,选择投资标的池,这里我们选择:沪深300ETF和创业板ETF。

图片

第二步,配置交易规则:

这里我们只引入一个因子,就是20日动量,命名为roc_20。

图片

第三步:(保持默认值即可)

图片

搞定:

图片

import streamlit as st
import requests
import pandas as pd
from engine.task import Task
from engine.engine import Engine

url = 'http://ailabx.com/api/funds'


@st.cache_data
def get_funds():
    datas = requests.get(url).json()
    dict_data = {item['symbol']: item['name'] + '({})'.format(item['symbol']) for item in datas}
    return dict_data


task = Task()


def select_funds():
    def _select_funds_format(x):
        return get_funds()[x]

    symbols = st.multiselect(label='请选择基金:', options=list(get_funds().keys()),
                             format_func=lambda x: _select_funds_format(x))
    task.symbols = symbols


def select_period():
    periods = {'RunDaily': '每天运行', 'RunWeekly': '每周运行', 'RunMonthly': '每月运行', 'RunQuarterly': '每季度运行',
               'RunYealy': '每年运行',
               'RunDays': '自定义天数'}

    def _period_format(x):
        return periods[x]

    period = st.selectbox(label='请选择调仓周期', index=0, options=list(periods.keys()),
                          format_func=lambda x: _period_format(x))
    if period == 'RunDays':
        days = st.number_input(label='请输入天数', min_value=1, max_value=365)
        task.algo_period_days = days
    task.algo_period = period


def select_weights():
    weights = {
        'WeightEqually': '等权分配',
        'WeightFix': '固定权重',
        'WeightERC': '风险平价'
    }

    def _weight_format(x):
        return weights[x]

    weight = st.selectbox(label='请选择权重分配', options=list(weights.keys()), format_func=lambda x: _weight_format(x))
    if weight == 'WeightFix':
        fix_weigths = st.text_input(label='请输入权重(逗号分隔)', value='[]')
        task.algo_weight_fix = eval(fix_weigths)
    task.algo_weight = weight


def add_features():
    col1, col2 = st.columns(2)
    with col1:
        features = st.text_area(label='因子表达式')
        task.features = features.split('\n')
    with col2:
        feature_names = st.text_area(label='因子名称')
        task.feature_names = feature_names.split('\n')


def buy_and_sell_rules():
    col1, col2 = st.columns(2)
    with col1:
        buy_rules = st.text_area(label='买入规则')
        task.rules_buy = buy_rules.split('\n')
    with col2:
        sell_rules = st.text_area(label='卖出规则')
        task.rules_sell = sell_rules.split('\n')


def order_by():
    order_by = st.selectbox(label='排序因子', options=task.feature_names)
    task.order_by = order_by


def backtest():
    if st.button(label='开始回测'):
        e = Engine(task)
        e.run()
        df = e.get_df_equities()
        ratio = e.get_ratios(df)
        orders_df = e.get_orders_df()
        st.write(ratio)
        print(ratio)
        st.line_chart(df)

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/103473
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 2024 年 7 月 29 日
下一篇 2024 年 7 月 29 日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注