redis、rabbitmq和celery部署——量化数据中台系列(三)

本文介绍了如何在GitHub上找到tgw和AmazingQuant项目,以及如何安装和配置Redis和RabbitMQ作为Celery的消息中间件和后台服务。详细步骤包括Redis的安装、环境配置、Python测试代码,以及RabbitMQ的安装、命令行操作和Python客户端的使用。同时,文章还展示了Celery的安装、配置、任务定义和执行,以及如何处理任务结果。
部署运行你感兴趣的模型镜像

 github   

1. tgw 

   https://github.com/tgw2023/tgw

2. AmazingQuant

https://github.com/zhanggao2013/AmazingQuant

redis主要是为了作为celery的backend使用;

rabbitmq主要是为了作为celery的消息中间件使用;

一、redis

1.安装

按照官网说明即可

https://redis.io/docs/getting-started/

2.环境配置

这里为了简单上手,单节点即可,实际生产可用集群哨兵模式

配置文件
cp  /etc/redis/redis.conf /home/zhanggao/redis/redis.conf

修改配置文件
日志路径
logfile "/home/zhanggao/redis/redis-serve.log"
data路径
dir /home/zhanggao/redis


启动服务
redis-server /home/zhanggao/redis/redis.conf


启动客户端
redis-cli -h 127.0.0.1 -p 6378

关闭
redis-cli -p 6378 shutdown

3.Python测试代码

import redis   # 导入redis 模块

r = redis.Redis(host='localhost', port=6378, db=2,decode_responses=True)
r.set('name1:jghj', 'runoob1asd')  # 设置 name 对应的值
print(r['name1:jghj'])
print(r.get('name1:jghj'))  # 取出键 name 对应的值
print(type(r.get('name')))  # 查看类型

一、redis

1.安装

官网下载并安装Eralng和rabbitmq,注意版本一致。

2.常用命令

#管理命令
#注意命令前面需要加一个rabbitmqctl 空格
#添加用户:
rabbitmqctl.bat add_user <username> <password>

#用户授权
rabbitmqctl.bat set_user_tags <username> administrator
# 删除一个用户
rabbitmqctl.bat delete_user <username>

# 改变用户密码 (也是改变web管理登陆密码)
rabbitmqctl.bat change_password <username> <newpassword>

#服务启动与停止

#安装,启动,停止
rabbitmg-service.bat install 或 rabbitmg-service instal
rabbitmg-service.bat stop 或rabbitmg-service stoprabbitmg-service.bat start 或 rabbitmg-server start

#启用
rabbitmg-server enable

#禁用
rabbitmg-server disable

3.Python测试代码

(1)发送消息

import redis   # 导入redis 模块

r = redis.Redis(host='localhost', port=6378, db=2,decode_responses=True)
r.set('name1:jghj', 'runoob1asd')  # 设置 name 对应的值
print(r['name1:jghj'])
print(r.get('name1:jghj'))  # 取出键 name 对应的值
print(type(r.get('name')))  # 查看类型
02
rabbitmq
1.安装
官网下载并安装Eralng和rabbitmq,注意版本一致。
2.常用命令
#管理命令
#注意命令前面需要加一个rabbitmqctl 空格
#添加用户:
rabbitmqctl.bat add_user <username> <password>

#用户授权
rabbitmqctl.bat set_user_tags <username> administrator
# 删除一个用户
rabbitmqctl.bat delete_user <username>

# 改变用户密码 (也是改变web管理登陆密码)
rabbitmqctl.bat change_password <username> <newpassword>

#服务启动与停止

#安装,启动,停止
rabbitmg-service.bat install 或 rabbitmg-service instal
rabbitmg-service.bat stop 或rabbitmg-service stoprabbitmg-service.bat start 或 rabbitmg-server start

#启用
rabbitmg-server enable

#禁用
rabbitmg-server disable

(2)接受消息

import time

import pika

hostname = 'localhost'
parameters = pika.ConnectionParameters(hostname)
connection = pika.BlockingConnection(parameters)

# 创建通道
channel = connection.channel()
# channel.queue_declare(queue='hello-1')
channel.exchange_declare(exchange='direct1-logs',
                         exchange_type='direct')

result = channel.queue_declare(exclusive=True, queue='')
queue_name = result.method.queue
print(queue_name)
channel.queue_bind(exchange='direct-logs',
                   queue=queue_name,
                   routing_key='hello-1')


def callback(ch, method, properties, body):
    print(" [x] Received %r" % (body,))
    print(" [x] %r:%r" % (method.routing_key, body))
    print(" [x] Done")
    ch.basic_ack(delivery_tag=method.delivery_tag)


# 告诉rabbitmq使用callback来接收信息
channel.basic_consume(queue_name, callback, consumer_tag="hello-consumer")
# 开始接收信息,并进入阻塞状态,队列里有信息才会调用callback进行处理,按ctrl+c退出
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

4.管理界面

celery

1.安装

pip install celery

pip install kombu

2.目录结构

3.init文件


from celery import Celery

app = Celery('celery_test', include=['celery_test.celery_app_task'])
app.config_from_object('celery_test.celeryconfig')

# celery worker -A celery_test -l info -n 1  -P eventlet
# celeryconfig 单节点redis
# celery flower --broker=redis://10.237.102.212:6379/13
# celeryconfig redis 集群
# celery flower -A celery_test -port=5555

4.add_task

import time

from celery_test.celery_app_task import add
from celery import group

data = [1, 2, 3]*10
r1 = group([add.s(i, i + 2) for i in data]).apply_async()

for async1 in r1:
    while True:
        if async1.successful():
            result = async1.get()
            print(result)
            print('执行完成', time.time())
            # async1.forget() # 将结果删除
            break
        elif async1.failed():
            print('执行失败')
        elif async1.status == 'PENDING':
            print('任务等待中被执行')
        elif async1.status == 'RETRY':
            print('任务异常后正在重试')
        elif async1.status == 'STARTED':
            print('任务已经开始被执行')

5.celery_app_task

import time

import numpy as np
from celery_test import app

a = np.ones(1000000000)


@app.task(name='celery_test.celery_app_task.taskA')
def add(x, y):
    time.sleep(4)
    return x + y

6.celeryconfig

from kombu import Exchange, Queue

BROKER_URL = 'amqp://guest:123456@127.0.0.1:15672/'  # 使用amqp作为消息代理
# BROKER_URL = 'redis://127.0.0.1:6378/2'  # 使用redis作为消息代理

RESULT_BROKER_TRANSPORT_OPTIONS = {"master_name": "mymaster"}

CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'  # 把任务结果存在了Redis

# redis集群哨兵模式---------------
# CELERY_RESULT_BACKEND = 'sentinel://10.237.102.210:26379/4;' \
#                         'sentinel://10.237.102.211:26379/4;' \
#                         'sentinel://10.237.102.212:26379/4'
# BROKER_URL = 'sentinel://10.237.102.210:26379/3;' \
#              'sentinel://10.237.102.211:26379/3;' \
#              'sentinel://10.237.102.212:26379/3'
#
# BROKER_TRANSPORT_OPTIONS = {
#     'master_name': 'mymaster',
#     'service_name': 'mymaster',
#     'socket_timeout': 6000,
#     'visibility_timeout': 3600,
# }
# CELERY_RESULT_BACKEND_TRANSPORT_OPTIONS = BROKER_TRANSPORT_OPTIONS
#  redis集群哨兵模式---------------


IMPORTS = ("celery_test.celery_app_task",)
task_name_list = ['task_A', 'task_B', 'task_C', 'task_D']

CELERY_QUEUES = (
    Queue("for_task_A", Exchange("for_task_A"), routing_key="for_task_A"),
    Queue("for_task_B", Exchange("for_task_B"), routing_key="for_task_B"),
    Queue("for_task_C", Exchange("for_task_C"), routing_key="for_task_C"),
    Queue("for_task_D", Exchange("for_task_D"), routing_key="for_task_D")
)

CELERY_ROUTES = (
    {
        "celery_test.celery_app_task.taskA":
            {
                'queue': "for_task_A",
                "routing_key": "for_task_A"
            },
    },

    {
        "celery_test.celery_app_task.taskB":
            {
                'queue': "for_task_B",
                "routing_key": "for_task_B"
            },
    },

    {
        "celery_test.celery_app_task.taskC":
            {
                'queue': "for_task_C",
                "routing_key": "for_task_C"
            },
    },
    {
        "celery_test.celery_app_task.taskD":
            {
                'queue': "for_task_D",
                "routing_key": "for_task_D"
            },
    },
)

CELERY_TASK_SERIALIZER = 'msgpack'  # 任务序列化和反序列化使用msgpack方案
# CELERY_TASK_SERIALIZER = 'json'  # 任务序列化和反序列化使用msgpack方案

CELERY_RESULT_SERIALIZER = 'json'  # 读取任务结果一般性能要求不高,所以使用了可读性更好的JSON

CELERY_TASK_RESULT_EXPIRES = 60*24  # 任务过期时间(秒)

CELERY_ACCEPT_CONTENT = ['json', 'msgpack']  # 指定接受的内容类型

CELERY_REJECT_ON_WORKER_LOST = True  # 当worker进程意外退出时,task会被放回到队列中
CELERY_ACKS_LATE = True  # 只有当worker完成了这个task时,任务才被标记为ack状态

# 并发数
CELERYD_CONCURRENCY = 2

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要处理用户关于量化选股平台每日更新引擎的IT实现的问题。首先,我要理解用户的需求。他们想要了解如何构建一个支持每日更新的量化选股平台,特别是在引擎的IT实现方面。这可能包括数据管理、策略回测、执行引擎、风险控制等模块。 用户提到希望平台每天更新选股结果,所以实时数据处理定时任务调度是关键点。我需要考虑数据获取的稳定性,比如如何从不同来源抓取数据,存储方式的选择,比如使用关系型数据库还是时间序列数据库。同时,数据清洗预处理也很重要,确保数据质量。 接下来是策略引擎的实现。用户可能对回测系统的类型感兴趣,比如向量化、事件驱动等。根据引用[2],向量化For循环系统相对容易实现,而事件驱动系统需要更复杂的架构。这里需要建议用户根据策略复杂度选择合适的回测系统,并提到使用Python框架如Zipline或Backtrader可能更高效。 每日更新引擎的实现需要定时任务,比如使用Celery或Airflow来调度任务。选股逻辑的执行需要考虑并行计算,比如用Dask或Spark加速处理。结果生成后,如何存储通知用户也是需要考虑的,比如通过邮件或消息队列。 风险管理监控模块也是不可忽视的,比如实时监控策略执行情况,设置风险指标阈值。运维方面,日志记录系统监控工具如Prometheus的应用。 技术栈方面,Python是主流,数据库可能需要MySQLInfluxDB,任务调度用Airflow,计算加速用Dask。同时,引用[1][2]提到的内容需要适当融入,比如机器学习在策略中的应用,或者不同回测系统的选择建议。 最后,生成相关问题时要覆盖用户可能进一步关心的点,比如数据质量、回测系统选择、延迟优化、容错处理、开源工具推荐以及机器学习整合等。确保每个回答部分都有逻辑,结构清晰,并且参考了提供的引用内容。</think>### 量化选股平台每日更新引擎的IT实现方案 #### 一、系统核心架构 1. **数据管理模块** - **多源数据集成**: 通过API对接$Wind$、$Tushare$等金融数据源,建立统一数据湖(Data Lake)存储$CSV/Parquet$格式的日频数据[^1] - **增量更新机制**: 使用时间戳分区管理,每日仅同步变更数据 ```python # 示例:增量数据同步 def update_daily_data(last_update): new_data = api.query(start_date=last_update, end_date=today) append_to_hdfs(new_data, partition=datetime.now().strftime("%Y%m%d")) ``` 2. **策略引擎层** - **向量化计算框架**: 基于$NumPy/Pandas$实现策略信号的批量计算 $$ R_t = \beta_1 \cdot MA(5) + \beta_2 \cdot RSI(14) $$ - **事件驱动执行**: 采用$Celery$分布式任务队列处理订单生成 #### 二、每日更新引擎关键技术 1. **定时任务调度** - 使用$Airflow$构建DAG工作流,设定北京时间15:30自动触发 ```mermaid graph TD A[市场收盘] --> B[数据清洗] B --> C[因子计算] C --> D[组合优化] D --> E[订单生成] ``` 2. **高性能计算优化** - 采用内存计算技术($Redis$缓存中间结果) - 并行化处理框架: ```python from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor(max_workers=8) as executor: results = executor.map(calculate_factor, stock_list) ``` #### 、实现要点与挑战 1. **数据一致性保障** - 通过$ACID$事务确保数据更新原子性 - 建立数据版本控制系统(如$DVC$) 2. **回测系统集成** - 实现类回测模式[^2]: - 向量化回测:$Pandas$向量运算 - 事件驱动回测:$Backtrader$框架集成 - 实时仿真:$RabbitMQ$消息队列 3. **风险控制模块** - 实时监控持仓风险敞口 $$ \text{VaR} = \mu + z_{\alpha} \cdot \sigma $$ - 设置熔断机制:当单日回撤超过5%时自动暂停交易 #### 四、推荐技术栈 | 模块 | 推荐技术 | |--------------|--------------------------| | 数据存储 | PostgreSQL/TiDB | | 计算引擎 | Dask/Spark | | 任务调度 | Apache Airflow | | 可视化 | Grafana/Plotly | | 部署环境 | Kubernetes+Docker |
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值