原创文章第377篇,专注“个人成长与财富自由、世界运作的逻辑与投资"。 昨天的策略集里:
十年年化42.4%(不止损版本55.7%):ETF动量轮动+卡曼滤波+RSRS择时止损(代码+数据)
这里的动量及止损,还有优化方向,作为星球的作业:
![](http://image109.360doc.com/DownloadImg/2023/11/0710/274987038_1_20231107104558461_wm.png)
其实追求长期年化20%,回撤小于20%是一个合理且舒服的状态。
![](http://image109.360doc.com/DownloadImg/2023/11/0710/274987038_2_20231107104558524_wm.png)
使用streamlit搭建量化界面,相当容易。
后面部署到服务器供大家直接回测使用: ![](http://image109.360doc.com/DownloadImg/2023/11/0710/274987038_3_20231107104558570_wm.png)
![](http://image109.360doc.com/DownloadImg/2023/11/0710/274987038_4_20231107104558774_wm.png)
核心代码如下: 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新优惠券】知识星球与开源项目:万物之中,希望至美
|