重温“杠铃策略”,自由需要一次阶层跃升,构建反脆弱的系统。

现在想来,越接近实盘,backtrader可以执行的精细化策略尤为重要。

止盈损,做多空等。

当然,经过一年的理解提升,要找回原来的代码,结合这一年的进展,挺容易的。

下面是backtrader的一个封装:

图片

图片

# encoding:utf8
from datetime import datetime

import backtrader as bt
import pandas as pd

from datafeed.dataloader import Dataloader
from engine.strategy import StratgeyAlgo


class BacktraderEngine:
    def __init__(self, df_data, init_cash=1000000.0, benchmark='000300.SH', start=datetime(2010, 1, 1),
                 end=datetime.now().date()):
        self.init_cash = init_cash
        self.start = start
        self.end = end
        self.benchmark = benchmark
        cerebro = bt.Cerebro()
        cerebro.broker.setcash(init_cash)

        # 设置手续费
        cerebro.broker.setcommission(0.0001)
        # 滑点:双边各 0.0001
        cerebro.broker.set_slippage_perc(perc=0.0001)

        self.cerebro = cerebro
        self.cerebro.addanalyzer(bt.analyzers.PyFolio, _name='_PyFolio')

        self.df_data = df_data
        self.symbols = list(set(self.df_data['symbol']))
        self._add_symbols_data()

    def _init_analyzers(self):
        '''
        self.cerebro.addanalyzer(bt.analyzers.Returns, _name='_Returns')
        self.cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name='_TradeAnalyzer')
        self.cerebro.addanalyzer(bt.analyzers.AnnualReturn, _name='_AnnualReturn')
        self.cerebro.addanalyzer(bt.analyzers.SharpeRatio, riskfreerate=0.0, annualize=True, _name='_SharpeRatio')
        self.cerebro.addanalyzer(bt.analyzers.DrawDown, _name='_DrawDown')
         '''
        self.cerebro.addanalyzer(bt.analyzers.PyFolio, _name='_PyFolio')

    def _add_symbols_data(self):
        # 加载数据
        for s in self.symbols:
            df_symbol = self.df_data[self.df_data['symbol'] == s]
            df = to_backtrader_dataframe(df_symbol)
            data = bt.feeds.PandasData(dataname=df, name=s, fromdate=self.start, todate=self.end)

            self.cerebro.adddata(data)
            self.cerebro.addobserver(bt.observers.Benchmark,
                                     data=data)
            self.cerebro.addobserver(bt.observers.TimeReturn)

    def run_algo_strategy(self, algo_list):
        self.cerebro.addstrategy(StratgeyAlgo, algo_list=algo_list, engine=self)
        self.results = self.cerebro.run()

    def _bokeh_plot(self):
        from backtrader_plotting import Bokeh
        from backtrader_plotting.schemes import Tradimo
        plotconfig = {
            'id:ind#0': dict(
                subplot=True,
            ),
        }
        b = Bokeh(style='line', scheme=Tradimo(), plotconfig=plotconfig)
        self.cerebro.plot(b)

    def show_result_empyrical(self, returns):
        import empyrical

        print('累计收益:', round(empyrical.cum_returns_final(returns), 3))
        print('年化收益:', round(empyrical.annual_return(returns), 3))
        print('最大回撤:', round(empyrical.max_drawdown(returns), 3))
        print('夏普比', round(empyrical.sharpe_ratio(returns), 3))
        print('卡玛比', round(empyrical.calmar_ratio(returns), 3))
        print('omega', round(empyrical.omega_ratio(returns)), 3)

    def analysis(self, pyfolio=False):
        portfolio_stats = self.results[0].analyzers.getbyname('_PyFolio')
        returns, positions, transactions, _ = portfolio_stats.get_pf_items()
        returns.index = returns.index.tz_convert(None)
        self.show_result_empyrical(returns)

        if pyfolio:
            from pyfolio.tears import create_full_tear_sheet
            create_full_tear_sheet(returns, positions=positions, transactions=transactions)
        else:
            import quantstats
            # df = self.feed.get_df(self.benchmark)
            # df['rate'] = df['close'].pct_change()
            # df = df[['rate']]
            quantstats.reports.html(returns, download_filename='stats.html', output='stats.html',
                                    title='AI量化平台')
            import webbrowser
            webbrowser.open('stats.html')

        '''

        import pyfolio as pf
        pf.create_full_tear_sheet(
            returns,
            positions=positions,
            transactions=transactions)
        '''
        # self.cerebro.plot(volume=False)


def to_backtrader_dataframe(df):
    df.index = pd.to_datetime(df.index)
    df['openinterest'] = 0
    df = df[['open', 'high', 'low', 'close', 'volume', 'openinterest']]
    for c in ['open', 'high', 'low', 'close']:
        df.loc[:, c] = df[c] / df[c][0]
    return df



图片

根据提示回溯到了pyfolio里的timeseries.py文件的893行,将其修改为:

valley = underwater.index[np.argmin(underwater)-1] # end of the period

保存后关闭。

图片

吾日三省吾省

当前面对的都是小事,但是一个很好的提醒。

三体人面对黑暗森林威摄的那60多年里,一是真诚的满足对方;二是让自己随时离得开它。

自由就是选择的权利,努力的意义就是让自己有的选。

对小人对抗,会让自己陷于它的维度,进而变得一样不堪。

正确的做法,加快充实自己的实力,远离消耗你的人,多看一眼它都是你的不对。

你会发现,烂人烂事都会渐渐离你远去。

今天想和大家讨论一下期货,先把一篇旧文翻出来:

杠铃策略,给你的“B计划”一个“阶层跃升”的机会

”杠铃“策略:关于市场的一点思考,从转债到股票量化投研

塔勒布的杠铃策略,就是要求极安全以及少量的高赔率投资。这样你在承受总体不大的风险的基础上,可能可以实现“阶层跃升”。

图片

我想聊的是期货。

从AI量化的角度,其实ETF也好,转债也罢,股票,期货,外汇,加密货币,都差不多,时间序列罢了。

期货CTA其实是量化的鼻祖,还有外汇的自动交易机器人等。

适合量化的几个特点:高频T+0, 多空双向交易,杠杆,有自动化交易接口且被鼓励。

这几点,股票市场都不可以。

网上有做动量的,做量化数据的,低风险的。我们的初心是AI赋能量化,那的确应该开拓最适合量化的领域。

那加密货币呢? 更刺激。一则偏灰色不被鼓励;二是基本面基本没有。这两点,当然不排除我们会移植一些策略过去。

而且应该偏择时而不是轮动。轮动是组合逻辑,截面比较,长期看仍然比较接近市场beta。比如低风险策略之可转债的双低,还可以加上一些基本面因子等。

比如“大小盘轮动”,就是大小盘的低相关性,此起彼伏。因此一个动量小了,另一个动量就大,一直找动量大的轮动就能拿到收益。转债双低,也是基于双低这个值,给转债估值一个“锚”。轮动比较的是“相对优势”。有点类似smart beta的逻辑。轮动是选股+择时一起做的,相对优势的,就是买入时机,因此更没有止盈损之说。难点在于,相关性的变动,相对优势不好比较,通过是很多标的,甚至是全市场淘金。

CTA就是择时,组合是多品种,多周期,多策略的合集,通过这样操作来降低回撤和控制风险。但单到一个策略,就是择时,可以止盈损等,因策略逻辑而变。择时是判断方向,判断错了就止损,对了就让利润奔跑。难点在于预测,优点在于,逻辑倒是非常清晰的,而且容易做高频交易,就是为数不多的几个标的,做透。

吾日三省吾身

有人的地方就有江湖。

江湖讲平衡,成年人的世界,哪那么多对错。

谈判的底牌永远是实力。

如果要受制于人或环境,那别人选择突破底限,那你不要抱怨。

你要做的事情,是积蓄力量,心中有佛,手中有刀。

不是所有人,会因为妥协而迁就,和平是打出来。

努力是为了有选择的自由。

梦想的生活并不容易,需要可能超出十倍的努力。

经历过PUA,明争,暗斗,委屈,不甘,不屑。

都是成长,都是经验,打不死你的,必将让你更加强大。

有些事情,看到好的一面。有些人、有些事的出现,就是为了“提醒”你,避免温水煮青蛙,避免让你在时间久了,觉得岁月静好而丧失斗志。他们的出现是为了让你成为更好的自己。

当然不必感谢这样的对手,正如不必感激苦难一样,感谢那些年勇敢的自己。

愿你出走半生,归来仍是少年。

眼中有光,仍然相信美好。

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/103894
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 2024 年 7 月 29 日
下一篇 2024 年 7 月 29 日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注