今日工作: 策略回测,列表页,详情页。
我们创建一个策略表现的model:
class StrategyPerformance(models.Model):
strategy = models.OneToOneField(StrategyInfo, on_delete=models.CASCADE, verbose_name='策略名称')
CAGR = models.FloatField(verbose_name='年化收益', default=-1)
sharpe = models.FloatField(verbose_name='夏普比率', default=-1)
mdd = models.FloatField(verbose_name='最大回撤率', default=-1)
def __str__(self):
return self.strategy.name
class Meta:
verbose_name = '策略表现'
verbose_name_plural = verbose_name
然后api里,任务成功回测完成后,写入表格中:
@api.post('/strategy/run/<task_id>')
def run_task(request, task_id: int):
strategy = StrategyInfo.objects.get(pk=task_id)
if not strategy:
return {'message': '策略:{}不存在'.format(task_id)}
dict_data = strategy.rule_data dict_data['name'] = strategy.name dict_data['desc'] = strategy.desc ratio, df = run_strategy(dict_data) se_task = ratio['market_value'] CAGR = se_task['年化收益'] sharpe = se_task['夏普比率'] mdd = se_task['最大回撤'] p = StrategyPerformance(strategy=strategy) p.CAGR = CAGR p.sharpe = sharpe p.mdd = mdd p.save() return {'message':'策略运行成功!'}
在admin的后台,就可以看到策略运行的结果:
接下来,我们就可以在“策略商城”里,把策略列表展现出来:
商城里展示效果如下:
然后我们来实现策略详情页。
数据准备,我们需要把回测结果保存在mongo数据库里:
df['date'] = df.index df['date'] = df['date'].apply(lambda x:str(x)) df['pk']=strategy.pk df['_id'] = str(task_id) + '_' + df['date'] mongo_utils.get_db()['strategy_quotes'].delete_many({'pk': strategy.pk}) mongo_utils.get_db()['strategy_quotes'].insert_many(df.to_dict(orient='records')) return {'message':'策略运行成功!'}
后台提供查询接口:
@api.get('/strategy_quotes/<pk>') def strategy_quotes(request, pk: int): items = mongo_utils.get_db()['strategy_quotes'].find({'pk': pk}, {'pk': 0, '_id': 0})
return {‘data’: list(items)}
数据很方便就查询出来了:
使用antd的g2来渲染数据:
{% load static %} <script src="{% static 'js/g2.min.js' %}"></script> <script> $.ajax({ // 后端程序的url地址 url: '/api/strategy_quotes/<pk>pk={{item.pk}}', // 也可以使用method,提交数据的方式,默认是'GET',常用的还有'POST' type: 'get', dataType: 'json', // 返回的数据格式,常用的有是'json','html',"jsonp" }) .done(function(resp) { // 请求成功以后的操作 console.log(resp); var chart = new G2.Chart({ container: 'quotes', autoFit: true, height: 300, padding: [30, 20, 70, 30] }); chart.data(resp['data']); chart.line().position('date*market_value').color('red') chart.line().position('date*基准').color('green') chart.render(); }) .fail(function(error) { // 请求失败以后的操作 console.log(error); }); </script>
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/103494
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!