Python帮助测试结构产品

Habré上结构产品广告的启发,对python脚本进行了修改以进行独立测试。 主要思想是这些产品提供100%的资本保护。 鉴于牛市已有10年的历史,此类产品的历史表现令人震惊,充满了无风险的天堂。

对于有兴趣进行理财的初学者python程序员,本文将很有趣。 好吧,对于某些人来说,此工具可以很方便地自行构建此类策略。 但是要小心,经纪人写道,这并不适合所有人。

该代码作为Jupyter记事本发布在GitHub上。 走吧

几句话介绍


我将对美国股票进行测试,结果收益率将低于卢布。 从图表上的绝对数字来看,俄罗斯市场更有趣,但其中存在更多风险。 测试的本质从此没有改变。

我们从免费的Alpha Advantages获取数据,您首先需要通过共享电子邮件地址来获取密钥。 笔记本中的简要说明。 您可以在Finam获取俄罗斯证券的报价。

结构产品魅力


简而言之,您的资金是安全的,且收益率高于银行存款(政府债券)。 这里只是方程式中缺少的一些元素:

  • 银行存款总是有收入,但是存在零风险。
  • 您将获利,但经纪人要求赔偿很大一部分;
  • 投入资金的使用受到限制;
  • 经纪人实际上不承担任何风险,仅参与利润。

策略策略


考虑最简单的策略:

  • 我们购买90%的资本短期国债;
  • 其余的,我们购买高风险资产;
  • 我们在期初以价格的10%止损。

该战略的核心是:国债的年利率为1-3%,实际上不包括亏损(如果有收益)。 用10%的资本购买的资产的10%的缩水将是债券所能承担的风险。 在牛市时期,一些股票可能会增长几倍,这将带给我们快乐。

要手动重复此策略,您必须执行以下步骤:

  • 买债券。 例如,以ETF的形式。
  • 买股票。
  • 发出停止订单。

测试方法


我将简要介绍一些具有代码摘录的解决方案,这些解决方案使测试变得非常灵活和方便。

日程安排


您可以在以下期间重新平衡:周,月,年。 以及时段内的任何一天:第一个,第N个,最后一个。 Schedule()类负责:

#         df = pd.DataFrame([], index=pd.date_range(start, end, freq='B')) # ... #      ,   df = df[df.index.isin(dates)].copy() # ... #    # ... elif freq == 'week': groupby = ['year', 'week'] elif freq == 'month': groupby = ['year', 'month'] elif freq == 'year': groupby = ['year'] #      grouped = df.groupby(groupby) for idx, grp in grouped: if len(grp) >= abs(day): df.loc[grp.iloc[day].name, 'allow'] = True 

数据周期


 StructuredProductMill().run() 

如其中一篇文章所述 ,我们可以仅绕过一个周期中的重新平衡日期,而跳过所有其他日期。 但是随后我们失去了该期间内资产变化的统计信息,我们将看不到每天的获利能力和亏损。 该脚本每天都会四处走动,这会损害速度,这使您可以查看未结头寸的市场价值并应用止损单检查。

再平衡


 StructuredProductMill().rebalance() 

在这里,可以打开的资产分配给可用资本。 在将计算结果与未平仓头寸进行比较之后,将针对所需数量执行交易:

 #  :       balance = self._cash + self.position_balance(day) #         df = day.merge(self._positions[['quantity']], how='left', left_index=True, right_index=True) # ... #              day.loc[is_allow, 'size_order'] = day[is_allow]['size'] / day[is_allow]['size'].sum() #        day['position_to'] = (balance * day['size_order']) // day['open'] #     day['order'] = day['position_to'] - day['position'] # ... #   for symbol, row in day[fltr].iterrows(): self.trade(row['dt'], symbol, row.order, row.open, 'O' if row.order > 0 else 'C') 

特惠


 StructuredProductMill().trade() 

在这里,为了提高速度,您可以牺牲细节并仅控制每个头寸的获利能力变化。 但是该脚本会考虑佣金和资产价值,并保留交易历史记录,这使您可以在测试的任何一天计算交易并执行停止订单。 此方法更新可用缓存的位置和大小。

发射


要运行,您必须指定一组具有份额和测试参数的资产。 我们将测试日历年的结构产品:

 #   portfolio = {'MINT': 0.9, 'AAPL': 0.1,} #   SYMBOLS = list(portfolio.keys()) df = prices(SYMBOLS) params = { 'benchmark': 'SPY', #     'balance': 100_000, #   'portfolio': portfolio, 'rebalance_day': -1, #      'freq': 'year', #    'stop_loss': 0.1, # -  10% #          'reset_position_prices': True, 'allow_method': allow_default, 'start': pd.to_datetime('2011-01-01'), #   } #  ,      pm = StructuredProductMill(params, prices=prices(SYMBOLS + [params['benchmark']]), show_progress=True) pm.check_params().prepare() #   pm.run() #   pm.print_results(); #   pm.charts() 

笔记本底部的图表显示了在重新平衡之日(年末)的获利能力和亏损额,这证实了在报告之时资本的亏损额极低并且盈利能力不断增长。 尽管这种获利能力输给了美国公司S&P 500的广泛指数。

结果


自2011年以来,这些测试涉及自由交易的美国工具:

  • BIL-短期国债ETF,在撰写本文时,年收益率为2%。 请记住,从2009年到2017年,利率几乎为零。 另一种选择是使用MINT(短期固定收益工具基金)。
  • AAPL-苹果股票。
  • MSFT-微软股票。
  • TSLA-特斯拉股票。

Aapl


这种设计在8年的时间里带来了24%的收入(平均每年2.6%),而重新平衡之间的缩水为-6%。 但是随着岁月的流逝,缩水大约为零。 止损未被触及,市场中有180%的收入失去订单。

每天的盈利能力和亏损

每天的获利能力和亏损(左边的盈利能力,右边的亏损)。

多年以来的盈利能力和亏损

年份交界处的获利能力和亏损(左边的盈利能力,右边的亏损)。

Msft


这种设计在8年的时间里带来了26%的收入(平均每年2.75%),而重新平衡之间的回撤为-2%。 在多年的交界处,没有亏损。

每天的盈利能力和亏损

多年以来的盈利能力和亏损

TSLA


这种设计在8年的时间里带来了45%的收入(平均每年4.6%),再平衡之间的回撤幅度高达-15%。 但是所有这一切在2013年,当时特斯拉增长了近5倍。 在今年年初,亏损额度最高为-2%。 最忙碌,但也有利可图的乘客。

每天的盈利能力和亏损

多年以来的盈利能力和亏损

结论


记事本允许您测试任何投资组合的成分。 这些可能是肱骨基金或几家公司。 虽然通常没有保护性资产。

GitHub存储库

Source: https://habr.com/ru/post/zh-CN461583/


All Articles