分享

“智能投研”还是智能投顾?

 AI量化实验室 2023-10-12 发布于北京

原创文章第146篇,专注“个人成长与财富自由、世界运作的逻辑,AI量化投资"。

最近可能要开始一个系列,与工作中的事情相关,就是梳理一下企业级应用开发的技术栈。你也许要问一个问题——这与量化投资有什么关系呢?

越做量化,越发觉得,量化并不是一个两个策略的问题,并不存在这样的“圣杯”,咱们搞出一个策略就躺赢,量化是一个体系,帮助你洞悉市场,赢得先机。好比kensho一下,它到底是一个金融决策系统,还是其他,都可以。

建设一个技术驱动、数据驱动的认知系统很重要。传统投资,一个人,一台电脑,对着电脑,画线一整天。这个方式肯定是要变的。借用舆情领域的概念——态势感知。金融的问题同样,而且信息更加密集有用。

传统技术开发从C/S结构,后来演化成B/S结构,现在前后端分离后又变成了C/S结构。C/S结构也挺好,前后端分开结构就更加清晰了。不过这个结构,会导致搜索引擎的没落。

昨天把mysql,mongo搭建好了,今天补充一个redis。这在企业级应用开发里是必不可少了,登录验证码都是缓存在此。

docker-compose配置如下:

redis:
image: redis
restart: always
hostname: redis
container_name: redis
privileged: true
ports:
- 6379:6379
environment:
TZ: Asia/Shanghai
volumes:
- /root/data/redis/data:/data
- /root/data/redis/logs:/logs

pip install redis即可使用,

redis很轻,但很有用,本质上它是一个内存数据库。早年做爬虫开发时,内存里用队列,后来替换成redis之后,爬虫自然就升级为分布式,而且支持断点续采了。

pool = redis.ConnectionPool(host=host, port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
print(r.get('hello'))

01 图形验证码

Pillow 是 PIL 的替代版本,PIL 软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,直方图处理,插值和滤波等等。

pip install pillow。

import random
import string
from base64 import b64encode
from io import BytesIO
from pathlib import Path
from typing import Tuple, Union

from PIL import Image, ImageDraw, ImageFont

path = Path(__file__).parent.joinpath("font")
font_arr = [str(f) for f in path.glob("*.ttf")]

background_color = [(255, 255, 255), (211, 211, 211), (245, 245, 245)]


def color():
return tuple((random.randint(0, 255) for _ in range(3)))


def get_xy(width, height):
return [
random.randint(width / 2, width),
random.randint(height / 2, height),
random.randint(0, width),
random.randint(0, height),
]


def captcha(num: int = 4) -> str:
"""
生成随机验证码
:param num: 验证码位数
:return: 文本验证码
"""
return "".join(
[random.choice(string.digits + string.ascii_letters) for _ in range(num)]
)


def img_captcha(
width: int = 150,
height: int = 60,
font_size: int = 39,
code_num: int = 4,
byte_stream: bool = False,
) -> Tuple[Union[Image.Image, BytesIO], str]:
"""
生成图形验证码,返回Image对象 , 验证码文本
:param width: 验证码长度(x轴) 默认 150
:param height: 图片宽度(y轴) 默认 40
:param font_size: 字体大小 默认 18
:param code_num: 验证码位数 默认 4
:param byte_stream: byte io 流的形式返回
:return: (Image, str)
"""
# 创建图形
img = Image.new("RGB", (width, height), random.choice(background_color))
# 画笔
draw = ImageDraw.Draw(img)
text = captcha(code_num)
# 写字
for i, t in enumerate(text):
# 字体
font = ImageFont.truetype(font=random.choice(font_arr), size=font_size)
draw.text(
xy=(
i * width / code_num + random.randint(0, code_num),
random.randint(i * 2, height // code_num),
),
text=t,
fill=color(),
font=font,
)
# 干扰
draw.line(xy=get_xy(width, height), fill=color())
draw.point(xy=get_xy(width, height), fill=color())
if byte_stream:
byte_io = BytesIO()
img.save(byte_io, "JPEG")
byte_io.seek(0)
result = byte_io
else:
result = img
return result, text


def b64_captcha(
width: int = 150, height: int = 60, font_size: int = 39, code_num: int = 4
) -> Tuple[str, str]:
img, code = img_captcha(width, height, font_size, code_num, byte_stream=True)
#"data:image/jpeg;base64," +
b64_img = b64encode(img.getvalue()).decode(
encoding="utf-8"
)
return b64_img, code


__all__ = ["captcha", "img_captcha", "b64_captcha"]

if __name__ == '__main__':

print(f"验证码: {captcha}")

image, text = img_captcha()

image.save("demo.png")
print(f"图片对象: {image}")
print(f"验证码: {text}")

# base64字符
image, text = b64_captcha()
print(f"base64图片: {image}")
print(f"验证码: {text}")

后续的流程,就是生成验证码后,随机生成一个uuid,存入redis备用;下一步支持用户登录。

技术相关的问题,涉及大量的细节,想做好,除非是真爱,否则会很痛苦。

我们很多时候,只是享受创造的乐趣,但过程多艰辛,尤其进入新领域时,一个细节看似都对,就是过不去。

从数据/信息中挖掘出知识、智慧,形成认知,对于投资而言价值巨大,比如kensho。但是kensho本身并没有形成投资能力。

关于“智能投研”还是智能投顾,投顾往往变成了fof,投研变成了一个属性查询。

今天前后端分离接口,似乎遇到了跨域的问题。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约