作为规则型的量化框架,指标是非常重要的元素,它是策略的基础。
我们来扩展一个经典的指标,RSRS——来自光大证券研报的“阻力支撑”指标。
尽管Backtrader内置140多个指标及运算符,外加talib的扩展,仍然不够,比如RSRS指标。
继承自bt.Indicator,lines里定义我们这个指标有几个line, params是参数,在init里做一次性的“向量”运算,在next里按元素计算。
Backtrader的指标继承自bt.Indicator。与实现策略类似,在next函数里计算指标的值。我们取high, low两个数据序列,每次取N个值,然后线性回归取斜率。
import backtrader as bt
import numpy as np
import statsmodels.api as sm
class RSRS(bt.Indicator):
lines = ('rsrs', 'R2')
params = (('N', 18), ('value', 5))
def __init__(self):
self.high = self.data.high
self.low = self.data.low
def next(self):
high_N = self.high.get(ago=0, size=self.p.N) low_N = self.low.get(ago=0, size=self.p.N) try: X = sm.add_constant(np.array(low_N)) model = sm.OLS(np.array(high_N), X) results = model.fit() self.lines.rsrs[0] = results.params[1] self.lines.R2[0] = results.rsquared except:
self.lines.rsrs[0] = 0
self.lines.R2[0] = 0
class RSRS_Norm(bt.Indicator):
lines = (‘rsrs_norm’,‘rsrs_r2’,‘beta_right’)
params = ((‘N’, 18), (‘M’, 600))
def __init__(self):
self.rsrs = RSRS(self.data)
self.lines.rsrs_norm = (self.rsrs – bt.ind.Average(self.rsrs, period=self.p.M))/bt.ind.StandardDeviation(self.rsrs, period= self.p.M)
self.lines.rsrs_r2 = self.lines.rsrs_norm * self.rsrs.R2
self.lines.beta_right = self.rsrs * self.lines.rsrs_r2
代码在如下位置:
基于大模型的可控文本生成
CTG(Controllable Text Generation)——在传统的文本生成的基础上,增加对生成文本一些属性、风格、关键信息等等的控制,从而使得生成的文本符合我们的某种预期。
现在大模型在生成文本方面,流畅度是没有问题的,而且天然支持多轮对话,意图识别。——但也有一个弊端,就是它仍然是计算下一个字符的概率,那么,对于内容的走向,我们是无法掌控,当然更无法进行微调改进。
比如data-to-text领域,我们希望大模型去查询数据库,然后用自然语言表达给用户。这在大数据领域,自动化报表,或者金融领域——量化投研都有非常有用。
今天咱们换一个通道指标:布林带——backtrader内置的指数,不需要自己实现,使用默认参数20,2。
# 参数定义
params = (
('period', 20),
('devfactor', 2)
)
def __init__(self):
self.bbands = bt.indicators.BollingerBands(period=self.params.period, devfactor=self.params.devfactor)
self.order = None
下面是策略逻辑——收盘价突破上轨时买入,突破下轨时平仓:
def next(self):
if self.order:
return
if self.data.close[0] > self.bbands.lines.top[0]:
if self.position.size == 0:
commission_info = self.broker.getcommissioninfo(self.data)
cash = self.broker.get_cash() - commission_info.getsize(1, self.data.close[0])
size = cash // self.data.close[0] self.buy(size=size) # print(f'BUY: {size} shares') elif self.data.close[0] < self.bbands.lines.bot[0]: if self.position.size > 0: size = self.position.size self.close(size=size) # print(f'SELL: {size} shares')
使用empyrical来计算风险、收益指标:
import empyrical as em max_drawdown = em.max_drawdown(returns) print('夏普比:%.2f'%em.sharpe_ratio(returns)) print('最大回撤:%.2f'%max_drawdown) print('年化收益:%.2f'%em.annual_return(returns))
代码所在位置:
empyrical的年化收益计算逻辑:
num_years = len(returns) / ann_factor # Pass array to ensure index -1 looks up successfully. ending_value = cum_returns_final(returns, starting_value=1) return ending_value ** (1 / num_years) - 1
而quantstats——区别在于这个years,它计算的是日期区间,比如20100101-20101231,那就是365天——这里应该取len(returns),它的years偏大,计算出来的年化收益率偏小。
years = (returns.index[-1] - returns.index[0]).days / periods res = abs(total + 1.0) ** (1.0 / years) - 1
投资,含投机,获利的本质逻辑,是建立概率优势。
结果还是不确定的,但重复博弈结果是有正收益的,这就是一个好的交易系统。
然后咱们再来聊,基本面价值投资(成长型投资),技术分析,量化投资,套利,高频交易等。
普通人做所谓价值投资我是不太看好的。
价值发现的时间,可能是数年甚至更久。这期间会发生什么事情,普通人是没有渠道获知的。
普通人根本判断不了什么是好公司,好的商业模式。
——替代方案是大类资产配置,选择低相关性的长期向上指数,动态再平衡即可。
然后就是偏短线的量化,价量为主,辅以其他一些数据——量化投机。
以控制回撤为前提,获取市场alpha。
从这个意义上看,期货就是一个挺好的选择。
吾日三省吾身
“没有实力做支撑的愤怒毫无意义”。
“你生气,说明你没有赢它的把握”。
不必愤怒,而是持续,抓紧一切机会提升自己,然后潇洒离开那些烂人烂事。
尽管Backtrader内置140多个指标及运算符,外加talib的扩展,仍然不够,比如RSRS指标。
继承自bt.Indicator,lines里定义我们这个指标有几个line, params是参数,在init里做一次性的“向量”运算,在next里按元素计算。
Backtrader的指标继承自bt.Indicator。与实现策略类似,在next函数里计算指标的值。我们取high, low两个数据序列,每次取N个值,然后线性回归取斜率。
import backtrader as bt
import numpy as np
import statsmodels.api as sm
class RSRS(bt.Indicator):
lines = ('rsrs', 'R2')
params = (('N', 18), ('value', 5))
def __init__(self):
self.high = self.data.high
self.low = self.data.low
def next(self):
high_N = self.high.get(ago=0, size=self.p.N) low_N = self.low.get(ago=0, size=self.p.N) try: X = sm.add_constant(np.array(low_N)) model = sm.OLS(np.array(high_N), X) results = model.fit() self.lines.rsrs[0] = results.params[1] self.lines.R2[0] = results.rsquared except:
self.lines.rsrs[0] = 0
self.lines.R2[0] = 0
class RSRS_Norm(bt.Indicator):
lines = (‘rsrs_norm’,‘rsrs_r2’,‘beta_right’)
params = ((‘N’, 18), (‘M’, 600))
def __init__(self):
self.rsrs = RSRS(self.data)
self.lines.rsrs_norm = (self.rsrs – bt.ind.Average(self.rsrs, period=self.p.M))/bt.ind.StandardDeviation(self.rsrs, period= self.p.M)
self.lines.rsrs_r2 = self.lines.rsrs_norm * self.rsrs.R2
self.lines.beta_right = self.rsrs * self.lines.rsrs_r2
代码在如下位置:
基于大模型的可控文本生成
CTG(Controllable Text Generation)——在传统的文本生成的基础上,增加对生成文本一些属性、风格、关键信息等等的控制,从而使得生成的文本符合我们的某种预期。
现在大模型在生成文本方面,流畅度是没有问题的,而且天然支持多轮对话,意图识别。——但也有一个弊端,就是它仍然是计算下一个字符的概率,那么,对于内容的走向,我们是无法掌控,当然更无法进行微调改进。
比如data-to-text领域,我们希望大模型去查询数据库,然后用自然语言表达给用户。这在大数据领域,自动化报表,或者金融领域——量化投研都有非常有用。
今天咱们换一个通道指标:布林带——backtrader内置的指数,不需要自己实现,使用默认参数20,2。
# 参数定义
params = (
('period', 20),
('devfactor', 2)
)
def __init__(self):
self.bbands = bt.indicators.BollingerBands(period=self.params.period, devfactor=self.params.devfactor)
self.order = None
下面是策略逻辑——收盘价突破上轨时买入,突破下轨时平仓:
def next(self):
if self.order:
return
if self.data.close[0] > self.bbands.lines.top[0]:
if self.position.size == 0:
commission_info = self.broker.getcommissioninfo(self.data)
cash = self.broker.get_cash() - commission_info.getsize(1, self.data.close[0])
size = cash // self.data.close[0] self.buy(size=size) # print(f'BUY: {size} shares') elif self.data.close[0] < self.bbands.lines.bot[0]: if self.position.size > 0: size = self.position.size self.close(size=size) # print(f'SELL: {size} shares')
使用empyrical来计算风险、收益指标:
import empyrical as em max_drawdown = em.max_drawdown(returns) print('夏普比:%.2f'%em.sharpe_ratio(returns)) print('最大回撤:%.2f'%max_drawdown) print('年化收益:%.2f'%em.annual_return(returns))
代码所在位置:
empyrical的年化收益计算逻辑:
num_years = len(returns) / ann_factor # Pass array to ensure index -1 looks up successfully. ending_value = cum_returns_final(returns, starting_value=1) return ending_value ** (1 / num_years) - 1
而quantstats——区别在于这个years,它计算的是日期区间,比如20100101-20101231,那就是365天——这里应该取len(returns),它的years偏大,计算出来的年化收益率偏小。
years = (returns.index[-1] - returns.index[0]).days / periods res = abs(total + 1.0) ** (1.0 / years) - 1
投资,含投机,获利的本质逻辑,是建立概率优势。
结果还是不确定的,但重复博弈结果是有正收益的,这就是一个好的交易系统。
然后咱们再来聊,基本面价值投资(成长型投资),技术分析,量化投资,套利,高频交易等。
普通人做所谓价值投资我是不太看好的。
价值发现的时间,可能是数年甚至更久。这期间会发生什么事情,普通人是没有渠道获知的。
普通人根本判断不了什么是好公司,好的商业模式。
——替代方案是大类资产配置,选择低相关性的长期向上指数,动态再平衡即可。
然后就是偏短线的量化,价量为主,辅以其他一些数据——量化投机。
以控制回撤为前提,获取市场alpha。
从这个意义上看,期货就是一个挺好的选择。
吾日三省吾身
“没有实力做支撑的愤怒毫无意义”。
“你生气,说明你没有赢它的把握”。
不必愤怒,而是持续,抓紧一切机会提升自己,然后潇洒离开那些烂人烂事。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/103212
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!