分享

长期年化20%,回撤​小于20%是ETF大类资产配置+轮动一个合理且舒服的状态。

 AI量化实验室 2023-11-07 发布于北京

原创文章第377篇,专注“个人成长与财富自由、世界运作的逻辑与投资"。

昨天的策略集里:

十年年化42.4%(不止损版本55.7%):ETF动量轮动+卡曼滤波+RSRS择时止损(代码+数据)

这里的动量及止损,还有优化方向,作为星球的作业:

其实追求长期年化20%,回撤小于20%是一个合理且舒服的状态。

使用streamlit搭建量化界面,相当容易。

后面部署到服务器供大家直接回测使用:

核心代码如下:

import streamlit as st
import pandas as pd
import numpy as np
from common import mongo_utils
import datetime as dt
import time
from datetime import datetime

def get_etf_list():
items = mongo_utils.get_db()['universe'].find({'type':'etf'}, {'_id':0, 'symbol': 1, 'name':1})

df = pd.DataFrame(list(items))
df['title'] = df['name'] + '-' + df['symbol']
return list(df['title'])

st.title('创建你自己的AI量化策略')

import streamlit as st

basic, rules, backtest = st.tabs(["回测基础配置", "回测规则", "权重与调仓"])

with basic:
name = st.text_input(label='请输入策略名称', value='策略1')
template = st.selectbox(
'请选择策略类型',
('大类资产配置', '轮动'))

symbols = st.multiselect(
'请选择etfs',
get_etf_list(),
[], placeholder='请选择etfs')

col1, col2 = st.columns(2)
with col1:
dt_start = st.date_input("起始日期", dt.date(2010, 1, 1))
with col2:
dt_end = st.date_input("结束日期", datetime.now().date())

benchmark = st.selectbox('请选择比较基准',options=get_etf_list())

with rules:
df = pd.DataFrame(
[
{"command": "st.selectbox", "rating": 4, "is_widget": True},
{"command": "st.balloons", "rating": 5, "is_widget": False},
{"command": "st.time_input", "rating": 3, "is_widget": True},
]
)
edited_df = st.data_editor(df)

with backtest:
weights = st.selectbox(
'请选择权重分配',
('等权-WeightEqually', '固定权重-WeightFix'))

if weights == '固定权重':
count = len(symbols)
if count > 0:
values = [str(1/count) for _ in range(count)]
fix_weights = st.text_input('请配置固定权重,,分隔开,个数与etf数量一致','.'.join(values))

period = st.selectbox(
'请选择调仓周期:',
('每天', '每周','每月','每季','每年'), index=0)



progress_text = "Operation in progress. Please wait."
my_bar = st.progress(0, text=progress_text)

if st.button("开始回测"):
from quantlab.engine.engine import Task
task = Task()
task.name = name
task.start_date = dt_start.strftime('%Y%m%d')
task.end_date = dt_end.strftime('%Y%m%d')

true_symbols = []
for s in symbols:
true_symbols.append(s.split('-')[1])
task.symbols = true_symbols
task.template = template
task.weights = weights.split('-')[1]
task.period = period
task.benchmark = benchmark.split('-')[1]

from quantlab.engine.engine import Engine

e = Engine(task)
e.run()
df_ratio, df_equities = e.analysis()
print(df_ratio)

#for percent_complete in range(100):
# time.sleep(0.01)
# my_bar.progress(percent_complete + 1, text=progress_text)
# time.sleep(1)
# my_bar.empty()



chart_data = pd.DataFrame(np.random.randn(20, 3), columns=["a", "b", "c"])

st.line_chart(df_equities)
st.write(df_ratio)

吾日三省吾身

茨威格在《人类群星闪耀时》时说,“一个人生命中最大的幸运,莫过于在他的人生中途,即在他年富力强的时候发现了自己的使命。”

很多普通人终其一生,可能都发现不了。

父母都是给孩子尽可能创造更好的条件,报各种班。有些人可能是为了弥补自己内心的缺憾吧。

每一代人应当有自己的突破,否则岂不陷入“放羊”的循环。

霍金上学的时候,物理学成绩并不突出。直到被确症渐冻症后,痛定思痛,要找到精神寄托,发奋图强,在理论物理上做出了突破。

即便大神如霍金,也并非一开始就知道自己的人生使命。

怎么发现自己人生使命呢,又是老生常谈的话题,无外乎: 喜欢,擅长,对更多人有价值。

三者求交集,这里也是最容易产生心流的地方。

年轻时,觉得自己喜欢写代码。其实喜欢的是掌控感与自由。但去商业公司做“码农” 可以会觉得难受。

关于宏观与细节。

代码和数学都是“精确”的学科,需要专注力,细节,差一点都推导不过去或者运行不起来。而宏观则相对模糊,只需要一定的逻辑自洽。有一段时间,觉得自己喜欢宏观。

可是宏观是什么呢?

投资其实就是模糊的正确,精确其实没什么用。方向很重要,大类资产,分散,轮动等等。

十年年化42.4%(不止损版本55.7%):ETF动量轮动+卡曼滤波+RSRS择时止损(代码+数据)

【双11新优惠券】知识星球与开源项目:万物之中,希望至美

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约