打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

原创文章第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新优惠券】知识星球与开源项目:万物之中,希望至美

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
10年12倍收益的动量轮动策略(附代码实现)
看完这篇文章,我才知道 Python 制作动态图表的正确方式
技巧篇:常用的python代码汇总
使用sklearn预测共享单车出行情况
Pandas 中最常用的 7 个时间戳处理函数
esproc vs python 1 增删改查
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服