研报先同步到星球,代码后续跟上。
准备数据
指数以及对应的ETF,一般来说,指数的历史数据比较全,而ETF的数据更容易获得,但有些ETF成立时间太短,比如513880.SH(日经225, 2019年才成立,历史数据太有限),而N225指数可以有很长的历史数据。
指数数据来看,股票、债券指数都比较容易获得。
最难的是商品,也就是黄金和原油指数,还有10年期美债。
获取黄金指数代码:
import yfinance as yf gold = yf.Ticker("GOLD") gold_data = gold.history(period="max") print(gold_data)
获取布伦特原油指数数据:
import yfinance as yf # 定义您想要获取数据的原油指数的Ticker符号 # 例如,WTI原油期货的Ticker符号是"CL",布伦特原油期货的Ticker符号是"Brent" # 请注意,Ticker符号可能因市场而异,您需要根据实际情况进行选择 ticker = "CL" # 这里以WTI原油为例 # 创建Ticker对象 ticker = yf.Ticker(ticker) # 获取历史数据 # period可以是"1d", "1mo", "3mo", "6mo", "1y", "2y", "5y", "10y", "ytd", "max" # start和end是数据的开始和结束日期,格式为"YYYY-MM-DD" data = ticker.history(period="max") # 打印数据 print(data)
从1973年至今的数据:
美债的代码是:
ticker_str = "^TNX" # 十年期美债
即可。
有了基础数据:基于指数的日频开盘价、最高价、最低价和收盘价作为原始数据,并使用 Ta-Lib
批量化生成 MACD、KDJ、RSI 等一系列量价指标,经初步筛选后共包含 154 个因子。
这154个因子,研报没有具体给——首先研报可能是简版,哪位同学有完全版本,欢迎同步给我。——另外,说明因子不是那么重要。
初步考虑把常用的技术分析指标,比如MACD, KDJ,RSI,然后考虑把qlib的alpha158,worldquant101的一些指标整合起来。
模型主要是lightGBM,然后对比xgboost,这个咱们实现过很多次了。
规则引擎
咱们的回测规则引擎,目前支持多条规则,至少满足N条这样的条件。
基本可以满足多数场景的需求。
星球有同学问,
这是最强的规则表达式的逻辑。
由此引发了我的一个思考。
规则可以有无穷多,面对历史数据,我们当然可以凑出“无数个”看起来很不错的策略。
有时候不是有意为之,就得了不错的结果。
但投资有意思的地方,是你永远不知道历史能不能代表未来,有多大程度能代表未来。
谈不上因果,有时候连相关都谈不上。
所以,星球一度转向机器学习,多因子,排序策略。
但因子挖掘也面临这样的问题。
在有限数据的情况下,比如多数是价量数据,这时候,你构建100多个因子甚至更多,有某些时间段,有些因子确实表现好——严格来说“不是因子表现好”。——是时间序列在过去某段时间恰好与这个因子“相关性高。——比如小市值,比如价值,在某年年份就很突出,然后变得不好。
从因子的角度,这就是市值因子,或者说价值因子,还有动量因子等等。
因子构造复杂了就容易过拟合。
而且现在的深度学习架构,具备一定程度自己抽取特征的能力,就是说它会自动拟合,也不需要构造因子。
吾日三省吾身
特斯拉在成名之后,如同当下的网红,混迹于上流社会,结识了很多名流。
后来由于发明过于超前且执念破产。
在他精力无处宣泄,没有找到未来方向的时候,他酗酒,甚至沉迷于赌桌,唯独洁身自好的是拒绝女色。
人生之意义,究竟是使命驱动,还是欲望驱动。
我知道,很多人正义凛然说前者,什么生来就要改变世界之类的。
但事实是,多数人没有办法改变世界。
百万富翁快车道,这个兄弟的理念就是欲望驱动。
它的欲望,就是年少时看到的那台兰博基尼超跑。
特斯拉的使命感,100%强过爱迪生,但更多世人的眼中,爱迪生才真正改变的世界。
科学的成功,商业的成功,重结果而非过程,重效果而非初心。
理想主义的初心是好的,但重要的是拿到结果。
否则就是流于形式。
当你还是一个nobody时,欲望就是一个单纯的动力,而当你功成名就时,使命驱动,让你更伟大,能走得更远。
“股票投资和减肥一样,决定最终结果的不是头脑而是耐心。”
《彼得·林奇的成功投资》
修正一个小bug:(bt框架里获取历史持仓的逻辑,有一些小变化,这里做了一下修正),主体不受影响,策略表现较之前更好了。
def __call__(self, target):
if len(self.rules_buy) == 0 and len(self.rules_sell) == 0:
return True
df_bar = self.df.loc[target.now]
if type(df_bar) is pd.Series: df_bar = df_bar.to_frame().T df_bar.set_index('symbol', inplace=True) for c in df_bar.columns: df_bar.loc[:, c] = df_bar[c].astype(float) # df_bar['roc_20'] = df_bar['roc_20'].astype(float) matched_buy = [] matched_sell = [] if self.rules_buy and len(self.rules_buy): matched_buy = self._check_if_matched(df_bar, self.rules_buy, self.buy_at_least_count) else: matched_buy = list(df_bar.index) # 没有配置买入规则,但有卖出,就是选全选。 if self.rules_sell and len(self.rules_sell): matched_sell = self._check_if_matched(df_bar, self.rules_sell, self.sell_at_least_count) date_pre = target.now - timedelta(days=1) if date_pre in target.positions.index: sig = target.positions.loc[date_pre] > 0 holdings = list(sig[sig == True].index) # noqa: E712 else: holdings = [] print(target.now) if len(holdings): print(holdings) # holdings = target.get_long_symbols(target.ctxs) if holdings and len(holdings) > 0: matched_buy += holdings matched_buy = list(set(matched_buy)) if matched_sell: for sell in matched_sell: if sell in matched_buy: matched_buy.remove(sell) matched_buy = list(set(matched_buy)) target.temp['selected'] = matched_buy
吾日三省吾身
其实没有人可以预见未来,生活就是这么一步步走出来的。
什么人生规划,职业规划,既然不可知,如何规划。
只能说是一个模糊的方向。
比如特斯拉坚持不去做牧师,而要学理工科,做电气工程师。
而拿破仑,立志要解放科西嘉,成为海岛的主人。
这些都是模糊的方向,然后做大量的,长期的积累。
对于盲目的船来说,所有的风向都是逆风。一个人生命中的最大幸运,莫过于在他的人生中途,即在他年富力强时发现了自己的人生使命。 斯蒂芬·茨威格在《人类的群星闪耀时》
没有人在乎你想要什么,你想过什么样的生活。
重要的事,你能为这个世界做些什么?你想为这个世界做些什么?
这两个不同领域的英雄的故事,代表了两个不同的方向:
特斯拉是个人英雄主义的代表,发明家,一身心血痴迷于发明创造。
如同这几天非常火的姜萍,这是需要天分加后天努力的。
科学家外加商业能力,那将无往而不利,比如爱迪生。
个人英雄主义适合于起步,然后要构建自己的组织,让生意或事业可以自主运转。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/103350
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!