原创文章第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)
吾日三省吾身
茨威格在《人类群星闪耀时》时说,“一个人生命中最大的幸运,莫过于在他的人生中途,即在他年富力强的时候发现了自己的使命。”。
很多普通人终其一生,可能都发现不了。
父母都是给孩子尽可能创造更好的条件,报各种班。有些人可能是为了弥补自己内心的缺憾吧。
每一代人应当有自己的突破,否则岂不陷入“放羊”的循环。
霍金上学的时候,物理学成绩并不突出。直到被确症渐冻症后,痛定思痛,要找到精神寄托,发奋图强,在理论物理上做出了突破。
即便大神如霍金,也并非一开始就知道自己的人生使命。
怎么发现自己人生使命呢,又是老生常谈的话题,无外乎: 喜欢,擅长,对更多人有价值。
三者求交集,这里也是最容易产生心流的地方。
年轻时,觉得自己喜欢写代码。其实喜欢的是掌控感与自由。但去商业公司做“码农” 可以会觉得难受。
关于宏观与细节。
代码和数学都是“精确”的学科,需要专注力,细节,差一点都推导不过去或者运行不起来。而宏观则相对模糊,只需要一定的逻辑自洽。有一段时间,觉得自己喜欢宏观。
可是宏观是什么呢?
投资其实就是模糊的正确,精确其实没什么用。方向很重要,大类资产,分散,轮动等等。
联系客服