AI量化策略商城核心逻辑实现

今日工作: 策略回测,列表页,详情页。

我们创建一个策略表现的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
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

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

相关推荐

发表回复

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