2.2.1.3-移动平均线

跳转到根目录:知行合一:投资篇

已完成:
1、投资&技术
  1.1.1 投资-编程基础-numpy
  1.1.2 投资-编程基础-pandas
  1.2 金融数据处理
  1.3 金融数据可视化
2、投资方法论
  2.1.1 预期年化收益率
  2.1.2 一个关于y=ax+b的故事
  2.1.3-数据标准化
  2.1.4-相关性分析
  2.2.1.1-一个关于定投的故(姿)事(势)
  2.2.1.3-移动平均线

3、投资实证
  [3.1 2023这一年] 被鸽
todo…

文章目录

  • 1. 定义
  • 2. 目标
  • 3. 加载数据
  • 4. 计算5日线值
  • 5. 确定买卖点
  • 6. 测算收益
  • 7. 5日线绘图
  • 8. 10日线绘图
  • 9. k线图绘图
  • 10. 完整代码&完整图表
  • 11. 收益计算

1. 定义

移动平均线,Moving Average,简称MA,MA是用统计分析的方法,将一定时期内的证券价格(指数)加以平均,并把不同时间的平均值连接起来,形成一根MA,用以观察证券价格变动趋势的一种技术指标。

2. 目标

  • 绘制一个k线图,也就是蜡烛图
  • 计算5日均线值、10日均线值
  • 在k线图上,绘制5日线和10日线图
  • 在5日线上,绘制与10日线的交叉点(上穿、下穿时)

3. 加载数据

这次主要是绘图和数据处理,所以数据就使用现成的csv来做(之前的文章,有专门的数据获取方法,参考:《1.2-金融数据处理》)

import pandas as pd
import ssl  # # URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1091)>
ssl._create_default_https_context = ssl._create_unverified_context
#导入pyecharts
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode

df = pd.read_csv("https://gitee.com/kelvin11/public-resources/raw/master/SH510300.csv", parse_dates=['date'])
df.set_index('date', inplace=True)

解释1:

pd.read_csv("https://gitee.com/kelvin11/public-resources/raw/master/SH510300.csv", parse_dates=['date'])

是读取一个网络csv文件的内容,并且将其date列转换成日期类型。ssl._create_default_https_context = ssl._create_unverified_context是解决https访问的时候的报错。

解释2:

df.set_index('date', inplace=True)是将date列设为索引,并且将其从数据列中移除。移除的意思是,在遍历时,就无法通过df.loc[x, "date"]这样取到date列的值了。

4. 计算5日线值

这个就比较简单了,直接通过pandas的rolling函数就行

import math
import pandas as pd
import ssl  # URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1091)>
ssl._create_default_https_context = ssl._create_unverified_context
# 导入pyecharts
from pyecharts.charts import *
from pyecharts import options as opts

# 加载数据
df = pd.read_csv("https://gitee.com/kelvin11/public-resources/raw/master/SH510300.csv", parse_dates=['date'])
df.set_index('date', inplace=True)

# 计算5日线值、10日线值
df['ma5'] = df.close.rolling(5).mean()
df['ma10'] = df.close.rolling(20).mean()

5. 确定买卖点

什么时候买?什么时候卖?

当5日线上穿10日线时,是买点,当5日线下穿10日线时,是卖点。这个很好理解,代码实现在上面的基础上,继续操作:

# 导入数据分析和量化常用库
import math
import pandas as pd
import ssl  # URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1091)>
ssl._create_default_https_context = ssl._create_unverified_context
# 导入pyecharts
from pyecharts.charts import *
from pyecharts import options as opts

# 加载数据
df = pd.read_csv("https://gitee.com/kelvin11/public-resources/raw/master/SH510300.csv", parse_dates=['date'])
df.set_index('date', inplace=True)

# 计算5日线值、10日线值
df['ma5'] = df.close.rolling(5).mean()
df['ma10'] = df.close.rolling(20).mean()
# df['ma20']=df.close.rolling(20).mean()
# df['macd'],df['macdsignal'],df['macdhist']=ta.MACD(df.close,fastperiod=12,slowperiod=26,signalperiod=9)


already_buy = False
# 遍历确定买卖点
for x in df.index:
    if df.loc[x, "ma5"] > df.loc[x, "ma10"] and not already_buy:
        df.loc[x, "买卖"] = '买'
        already_buy = True
    if df.loc[x, "ma5"] < df.loc[x, "ma10"] and already_buy:
        df.loc[x, "买卖"] = '卖'
        already_buy = False

6. 测算收益

如果我们严格按照上穿买入,下穿卖出,不考虑浮盈浮亏的情况下,这个策略,盈利性如何?

我们按照大约10000元作为交易金额,因为每次买入卖出最小的1手是100股,要做向上取整。
这里就只贴测算收益部分的代码:

# 测算收益
money = 10000.0   # 1个w左右的买卖金额
shares = 0  # 买入的股数
buy_price = 0  # 实际买入的金额
for x in df.index:
    if df.loc[x, "买卖"] == '买':
        buy_price = df.loc[x, "close"]
        shares = math.floor(money / df.loc[x, "close"] / 100) * 100
        real_buy_money = shares * buy_price
        df.loc[x, "买入份额"] = shares
        df.loc[x, "买入价格"] = buy_price
        df.loc[x, "实际买入金额"] = real_buy_money
    if df.loc[x, "买卖"] == '卖':
        sell_price = df.loc[x, "close"]
        real_sell_money = (sell_price - buy_price) * shares
        df.loc[x, "卖出价格"] = sell_price
        df.loc[x, "实际卖出金额"] = real_sell_money
        df.loc[x, "收益"] = (sell_price - buy_price) * shares
        # 冗余,以便在csv中直接看出卖出时,买入时候相关的要素信息
        df.loc[x, "买入份额"] = shares
        df.loc[x, "买入价格"] = buy_price
        df.loc[x, "实际买入金额"] = real_buy_money
# 将买卖相关信息保存到csv,方便查看
df.to_csv('均线买卖.csv')

7. 5日线绘图

5日线图比较简单,照抄样例代码

# 绘制5日线折线图
line_ma5 = Line()
line_ma5.add_xaxis(df.index.strftime('%Y%m%d').tolist())
line_ma5.add_yaxis(
    "MA5",
    df['ma5'].tolist(),
    is_smooth=True,
    is_symbol_show=False,
    label_opts=opts.LabelOpts(is_show=False)
)

我们还想更进一步,在5日线上,想标注一些买卖点,就好比如在我们常用的交易软件上的B点和S点

构造买卖点代码:

# 标记买卖点,方便在后面的绘图时,在折线图上把买卖点标注出来
buy_points = {}
sell_points = {}
for x in df.index:
    if df.loc[x, "买卖"] == '买':
        buy_points[x.strftime('%Y%m%d')] = df.loc[x, "close"]
    if df.loc[x, "买卖"] == '卖':
        sell_points[x.strftime('%Y%m%d')] = df.loc[x, "close"]

# 绘制5日线折线图
line_ma5 = Line()
line_ma5.add_xaxis(df.index.strftime('%Y%m%d').tolist())
line_ma5.add_yaxis(
    "MA5",
    df['ma5'].tolist(),
    is_smooth=True,
    is_symbol_show=False,
    label_opts=opts.LabelOpts(is_show=False),
    markpoint_opts=opts.MarkPointOpts(
        data=[
            # 买点标注
            *[
                opts.MarkPointItem(
                    coord=[day, value],
                    value='B',  # value
                    name=f"Buy at {day}",
                    itemstyle_opts=opts.ItemStyleOpts(color="green"),
                )
                for day, value in buy_points.items()
            ],
            # 卖点标注
            *[
                opts.MarkPointItem(
                    coord=[day, value],
                    value='S',
                    name=f"Sell at {day}",
                    itemstyle_opts=opts.ItemStyleOpts(color="red"),
                )
                for day, value in sell_points.items()
            ],
        ]
    )
)

8. 10日线绘图

这个就没难度了

# 绘制10日线折线图
line_ma10 = Line()
line_ma10.add_xaxis(df.index.strftime('%Y%m%d').tolist())
line_ma10.add_yaxis(
    "MA10",
    df['ma10'].tolist(),
    is_smooth=True,
    is_symbol_show=False,
    label_opts=opts.LabelOpts(is_show=False)
)

9. k线图绘图

这个就是pyecharts比较强大的地方了,参考其绘制k线的文档:k线图

包含元素:

  • 红绿柱状图
  • K线图底部滑块,可以缩放对应的区间数据
  • 对于一个时间区间可以进行标注(本例标注了:opts.MarkAreaItem(name="14-15牛市", x=("20140624", "20150612")))
  • 标注了期间内最大max最小值min均值average辅助线
# 绘制k线图
kline = (Kline()
    .add_xaxis(df.index.strftime('%Y%m%d').tolist())  # x轴数据
    # y轴数据,默认open、close、high、low,转为list格式
    .add_yaxis(series_name="",
               y_axis=df[['open', 'close', 'low', 'high']].values.tolist(),
               itemstyle_opts=opts.ItemStyleOpts(
                   color="red",  # 阳线红色
                   color0="green",  # 阴线绿色
                   border_color="red",
                   border_color0="green", ),
               #             markpoint_opts=opts.MarkPointOpts(data=[#添加标记符
               #                 opts.MarkPointItem(type_='max', name='最大值'),
               #                 opts.MarkPointItem(type_='min', name='最小值'),]),
               # 添加辅助性,如某期间内最大max最小值min均值average
               markline_opts=opts.MarkLineOpts(
                   data=[opts.MarkLineItem(type_="average",
                                           value_dim="close")], ), )
    .set_global_opts(
    datazoom_opts=[opts.DataZoomOpts()],  # 滑动模块选择
    )
    .set_series_opts(
    markarea_opts=opts.MarkAreaOpts(  # 标记区域配置项
        data=[
            opts.MarkAreaItem(name="14-15牛市", x=("20140624", "20150612")),
        ], ))
)
# 在k线图上叠加5日线折线图
kline.overlap(line_ma5)
# 在k线图上叠加10日线折线图
kline.overlap(line_ma10)
# 在jupyter notebook上直接渲染
kline.render_notebook()
# 如果是在pycharm里,使用:kline.render("k线+移动均线+买卖点标记.html")这样生成html查看

具体展示的结果,看下一节“完整代码&完整图表”

10. 完整代码&完整图表

直接上干货,总共就145行代码,解决问题。

# 导入数据分析和量化常用库
import math
import pandas as pd
import ssl  # URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1091)>
ssl._create_default_https_context = ssl._create_unverified_context
# 导入pyecharts
from pyecharts.charts import *
from pyecharts import options as opts

# 加载数据
df = pd.read_csv("https://gitee.com/kelvin11/public-resources/raw/master/SH510300.csv", parse_dates=['date'])
df.set_index('date', inplace=True)

# 计算5日线值、10日线值
df['ma5'] = df.close.rolling(5).mean()
df['ma10'] = df.close.rolling(20).mean()
# df['ma20']=df.close.rolling(20).mean()
# df['macd'],df['macdsignal'],df['macdhist']=ta.MACD(df.close,fastperiod=12,slowperiod=26,signalperiod=9)


already_buy = False
# 遍历确定买卖点
for x in df.index:
    if df.loc[x, "ma5"] > df.loc[x, "ma10"] and not already_buy:
        df.loc[x, "买卖"] = '买'
        already_buy = True
    if df.loc[x, "ma5"] < df.loc[x, "ma10"] and already_buy:
        df.loc[x, "买卖"] = '卖'
        already_buy = False


# 测算收益
money = 10000.0   # 1个w左右的买卖金额
shares = 0  # 买入的股数
buy_price = 0  # 实际买入的金额
for x in df.index:
    if df.loc[x, "买卖"] == '买':
        buy_price = df.loc[x, "close"]
        shares = math.floor(money / df.loc[x, "close"] / 100) * 100
        real_buy_money = shares * buy_price
        df.loc[x, "买入份额"] = shares
        df.loc[x, "买入价格"] = buy_price
        df.loc[x, "实际买入金额"] = real_buy_money
    if df.loc[x, "买卖"] == '卖':
        sell_price = df.loc[x, "close"]
        real_sell_money = (sell_price - buy_price) * shares
        df.loc[x, "卖出价格"] = sell_price
        df.loc[x, "实际卖出金额"] = real_sell_money
        df.loc[x, "收益"] = (sell_price - buy_price) * shares
        # 冗余,以便在csv中直接看出卖出时,买入时候相关的要素信息
        df.loc[x, "买入份额"] = shares
        df.loc[x, "买入价格"] = buy_price
        df.loc[x, "实际买入金额"] = real_buy_money
# 将买卖相关信息保存到csv,方便查看
df.to_csv('均线买卖.csv')


# 标记买卖点,方便在后面的绘图时,在折线图上把买卖点标注出来
buy_points = {}
sell_points = {}
for x in df.index:
    if df.loc[x, "买卖"] == '买':
        buy_points[x.strftime('%Y%m%d')] = df.loc[x, "close"]
    if df.loc[x, "买卖"] == '卖':
        sell_points[x.strftime('%Y%m%d')] = df.loc[x, "close"]

# 绘制5日线折线图
line_ma5 = Line()
line_ma5.add_xaxis(df.index.strftime('%Y%m%d').tolist())
line_ma5.add_yaxis(
    "MA5",
    df['ma5'].tolist(),
    is_smooth=True,
    is_symbol_show=False,
    label_opts=opts.LabelOpts(is_show=False),
    markpoint_opts=opts.MarkPointOpts(
        data=[
            # 买点标注
            *[
                opts.MarkPointItem(
                    coord=[day, value],
                    value='B',  # value
                    name=f"Buy at {day}",
                    itemstyle_opts=opts.ItemStyleOpts(color="green"),
                )
                for day, value in buy_points.items()
            ],
            # 卖点标注
            *[
                opts.MarkPointItem(
                    coord=[day, value],
                    value='S',
                    name=f"Sell at {day}",
                    itemstyle_opts=opts.ItemStyleOpts(color="red"),
                )
                for day, value in sell_points.items()
            ],
        ]
    )
)
# 绘制10日线折线图
line_ma10 = Line()
line_ma10.add_xaxis(df.index.strftime('%Y%m%d').tolist())
line_ma10.add_yaxis(
    "MA10",
    df['ma10'].tolist(),
    is_smooth=True,
    is_symbol_show=False,
    label_opts=opts.LabelOpts(is_show=False)
)

# 绘制k线图
kline = (Kline()
    .add_xaxis(df.index.strftime('%Y%m%d').tolist())  # x轴数据
    # y轴数据,默认open、close、high、low,转为list格式
    .add_yaxis(series_name="",
               y_axis=df[['open', 'close', 'low', 'high']].values.tolist(),
               itemstyle_opts=opts.ItemStyleOpts(
                   color="red",  # 阳线红色
                   color0="green",  # 阴线绿色
                   border_color="red",
                   border_color0="green", ),
               #             markpoint_opts=opts.MarkPointOpts(data=[#添加标记符
               #                 opts.MarkPointItem(type_='max', name='最大值'),
               #                 opts.MarkPointItem(type_='min', name='最小值'),]),
               # 添加辅助性,如某期间内最大max最小值min均值average
               markline_opts=opts.MarkLineOpts(
                   data=[opts.MarkLineItem(type_="average",
                                           value_dim="close")], ), )
    .set_global_opts(
    datazoom_opts=[opts.DataZoomOpts()],  # 滑动模块选择
    )
    .set_series_opts(
    markarea_opts=opts.MarkAreaOpts(  # 标记区域配置项
        data=[
            opts.MarkAreaItem(name="14-15牛市", x=("20140624", "20150612")),
        ], ))
)
# 在k线图上叠加5日线折线图
kline.overlap(line_ma5)
# 在k线图上叠加10日线折线图
kline.overlap(line_ma10)
# 在jupyter notebook上直接渲染
kline.render_notebook()
# 如果是在pycharm里,使用:kline.render("k线+移动均线+买卖点标记.html")这样生成html查看

下图,能看出所有要素,由于买卖点过于集中,看起来就不是很美观,但是,可以通过拖动下面的滑块,来看更精准的图。

拖动滑块,看具体时间段内的情况,可以非常清晰的看到5日线、10日线、买卖点、区间最大最小值均值:

11. 收益计算

最后多说一点,如果无脑按照这个来测算,最终的收益是:4167.6元(2012/5/28 ~ 2023/11/24),真的是很不~可观。

这其实很正常,因为每次的持有时间都很短,很多时候是亏本卖出。

想要调优策略,还是得加入自己的其他主观策略,无脑使用注定是不行的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/499789.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker命令及部署Java项目

文章目录 简介Docker镜像镜像列表查找镜像拉取镜像删除镜像镜像标签 Docker容器容器启动容器查看容器停止和重启后台模式和进入强制停止容器清理停止的容器容器错误日志容器别名及操作 Docker部署Java项目 简介 Docker是一种容器化技术&#xff0c;可以帮助开发者轻松打包应用…

python练习五

1. 给定一个包含n1个整数的数组nums&#xff0c;其数字在1到n之间&#xff08;包含1和n&#xff09;&#xff0c;可知至少存在一个重复的整数&#xff0c;假设只有一个重复的整数&#xff0c;请找出这个重复的数 def find_difnumber(ls):for index in range(0, len(ls)):for n…

如何使用命令行对RK开发板进行OpenHarmony版本烧录?

问题 在 OpenHarmony 自动化测试环境中&#xff0c;需要对流水线上的 RK 设备进行烧录&#xff0c;图形工具只能人工操作&#xff0c;那么有什么方法可以纯命令行进行自动化烧录呢&#xff1f; 思路 我们发现 RK 开发板实际是使用 upgrade_tool 的执行文件进行烧录的&#x…

力扣Lc24--- 434. 字符串中的单词数(java版)-2024年3月29日

1.题目描述 2.知识点 注1&#xff1a; \\s: 匹配一个或多个空格字符。|: 表示逻辑或&#xff0c;用于分隔不同的正则表达式部分。(?[\\p{Punct}]): 正向前瞻&#xff0c;匹配任何标点符号之前的位置。(?<[\\p{Punct}]): 正向后顾&#xff0c;匹配任何标点符号之后的位置…

工厂能耗管控物联网解决方案

工厂能耗管控物联网解决方案 工厂能耗管控物联网解决方案是一种创新的、基于先进技术手段的能源管理系统&#xff0c;它深度融合了物联网&#xff08;IoT&#xff09;、云计算、大数据分析以及人工智能等前沿科技&#xff0c;以实现对工业生产过程中能源消耗的实时监测、精确计…

github项目名称变更sourcetree如何同步

github项目名称变更sourcetree如何同步 方法1:删除本地仓库 重新从URL克隆 方法2:修改远程地址链接 1.打开项目所在文件夹的终端 2.删除本地关联的这个远程仓库origin git remote rm origin 3.关联修改名字后的远程仓库地址 git remote add origin <新的远程仓库地址&…

前端超分辨率技术应用:图像质量提升与场景实践探索-设计篇

超分辨率&#xff01; 引言 在数字化时代&#xff0c;图像质量对于用户体验的重要性不言而喻。随着显示技术的飞速发展&#xff0c;尤其是移动终端视网膜屏幕的广泛应用&#xff0c;用户对高分辨率、高质量图像的需求日益增长。然而&#xff0c;受限于网络流量、存储空间和图像…

代码随想录算法训练营第35天| 435. 无重叠区间、763.划分字母区间、56. 合并区间

435. 无重叠区间 题目链接&#xff1a;无重叠区间 题目描述&#xff1a;给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 解题思想&#xff1a; 这道题目和射气球很像。 *“需…

深入浅出MySQL主从复制与读写分离原理及其实践

目录 一、主从复制 &#xff08;一&#xff09;主从复制简介 1.基本概述 2.复制类型 &#xff08;二&#xff09;主从复制流程与影响因素 1.主从复制的流程 2.影响因素 &#xff08;三&#xff09;实现主从复制 1.搭建时间同步 2.配置master服务器 2.1 开启二进制日…

C++11入门手册第一节,学完直接上手Qt(共两节)

入门 hello.cpp #include <iostream>int main() { std::cout << "Hello Quick Reference\n"<<endl; return 0;} 编译运行 $ g hello.cpp -o hello$ ./hello​Hello Quick Reference 变量 int number 5; // 整数float f 0.95; //…

分享vue3+OpenTiny UI+cesium.js实现三维地球

效果图 使用vue3 OpenTiny UI cesium 实现三维地球 node.js > v16.0 opentiny vue3 ui安装指南 https://opentiny.design/tiny-vue/zh-CN/os-theme/docs/installation yarn add opentiny/vue3 项目依赖 "dependencies": {"opentiny/vue": "3…

每日一练 两数相加问题(leetcode)

原题如下&#xff1a; 这道题目是一道链表题&#xff0c;我们对于这种链表类&#xff0c;很显然我们最后输出的是初始节点&#xff0c;所以我们要保留我们的初始头指针&#xff0c;那么我们的第一步一定是把头指针保留一份&#xff0c;然后再让头指针往后进行操作。那么我们进行…

EXCEL VBA根据表数据写入数据库中

EXCEL VBA根据表数据写入数据库中 Option Explicithttps://club.excelhome.net/thread-1687531-1-1.htmlSub UpdateAccess()Const adStateOpen 1Dim vData, i As Variant, j As LongDim AccessTable As String, ExcelTable As String, ExcelFile As String, AccessFile As Str…

SD-WAN安全策略,保护企业网络的新边界

随着企业的数字化转型和网络架构的演变&#xff0c;SD-WAN&#xff08;软件定义广域网&#xff09;作为一种新兴的网络技术&#xff0c;正在逐渐取代传统的基于硬件的广域网架构。然而&#xff0c;随之而来的安全威胁也在增加&#xff0c;因此在部署 SD-WAN时&#xff0c;制定合…

【python】深入探讨flask是如何预防CSRF攻击的

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

文本文件操作

大家好&#xff1a; 衷心希望各位点赞。 您的问题请留在评论区&#xff0c;我会及时回答。 文件操作 程序运行时&#xff0c;产生的数据都是临时数据&#xff0c;程序一旦运行结束都会被释放。通过文件可以将数据持久化。 C中对文件进行操作需要包含头文件<fstream> 文件…

spark-看看视频每章总结

一 spark基础 1.spark特点 2.spark架构 3.spark部署 4.代码执行流程 先由driver构建sparkcontext对象&#xff0c;再由executor分布式执行&#xff0c;结果汇集到driver上输出 二 sparkcore 1.RDD 2.RDD算子 3.宽窄依赖p100 4.spark内存计算 三.sparksql 1.spark SQL和spar…

机器学习中的XGBoost模型及其优缺点(包含Python代码样例)

目录 一、简介 二、优缺点 三、样例代码 四、总结 一、简介 XGBoost&#xff08;eXtreme Gradient Boosting&#xff09;是一种机器学习算法&#xff0c;用于解决分类和回归问题。它是基于梯度提升树&#xff08;Gradient Boosting Decision Trees&#xff09;方法的扩展&…

HarmonyOS像素转换-如何使用像素单位设置组件的尺寸。

1 卡片介绍 基于像素单位&#xff0c;展示了像素单位的基本知识与像素转换API的使用。 2 标题 像素转换&#xff08;ArkTS&#xff09; 3 介绍 本篇Codelab介绍像素单位的基本知识与像素单位转换API的使用。通过像素转换案例&#xff0c;向开发者讲解了如何使用像素单位设…

【AI】『Suno』哎呦不错呦,AI界的周董,快来创作你的歌曲吧!

前言 &#x1f34a;缘由 Suno AI的旋风终于还是吹到了音乐圈 &#x1f3c0;事情起因&#xff1a; 朋友说他练习时长两天半&#xff0c;用Suno发布了首张AI音乐专辑。震惊之余&#xff0c;第一反应是音乐圈门槛也这么低了&#xff0c;什么妖魔鬼怪都可以进军了嘛&#xff01;…