百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

如何使用Python机器学习进行算法交易

toyiye 2024-06-21 12:27 10 浏览 0 评论

近年来,机器学习,更确切地说是 Python 中的机器学习已经成为许多量化公司的热门词汇。为了寻找难以捉摸的阿尔法,许多基金和交易公司已经采用机器学习算法进行算法交易。

本文背景

尽管量化对冲基金使用的算法从未公开,但我们知道,顶级基金在很大程度上使用机器学习算法进行交易。

例如,曼氏集团的 AHL 维度计划是一个51亿美元的对冲基金,部分由人工智能管理。还有 Taaffeite Capital 表示,它使用专有的机器学习系统以完全系统化和自动化的方式进行交易。

在这个 Python 机器学习教程中,我们试图了解机器学习是如何改变交易世界的。然后,我们创建一个简单的 Python 机器学习算法来预测股票第二天的收盘价。

因此,在本 Python 机器学习教程中,我们将讨论以下主题:

Python 中的机器学习是如何流行起来的

机器学习包/图书馆由公司内部开发,供其专有使用,或由第三方免费提供给用户社区。

近年来,机器学习软件包的数量大幅度增加,这有助于开发人员社区获取各种机器学习技术,并将其应用于他们的交易需求。

有数以百计的机器学习算法,可以分为不同的类型,这取决于这些算法的工作方式。

例如,机器学习回归算法用于建立变量之间的关系模型; 决策树算法构造决策模型并用于分类或回归问题。其中,一些算法已经在定量分析师中流行起来。

其中包括:

  • 线性回归
  • Logit模型
  • 随机森林(RM)
  • 支持向量机(SVM)
  • K-最近邻(kNN)
  • 分类与回归树(CART)
  • 深度学习

这些用于交易的机器学习算法被贸易公司用于各种目的,包括:

  • 利用大数据集分析历史市场行为
  • 确定策略的最佳输入(预测因子)
  • 确定策略参数的最优集合
  • 进行贸易预测等等

为什么在Python中使用机器学习进行交易呢?

多年来,我们已经意识到 Python 正在成为程序员使用的一种流行语言,一个通常活跃而热情的社区,他们总是在那里相互支持。

根据 Stack Overflow 的2020开发人员调查,开发人员表示他们想学 Python,Python 已经连续第四年位居榜首。

Python 在 StackOverflow 中排名第一

Python 交易已经在量化金融社区获得了吸引力,因为它使得建立复杂的统计模型变得容易,而且由于有足够的科学库,例如:

  • Pandas
  • NumPy
  • PyAlgoTrade
  • Pybacktest and more

对 Python 交易库的首次更新在开发人员社区中经常发生。事实上,Scikit-learn 是专门为机器学习开发的 Python 软件包,它具有各种分类、回归和聚类算法。因此,对于一个初学者(或者更确切地说,一个成熟的交易者本身)来说,在 Python 中开始机器学习是有意义的。

近年来,技术和电子交易的兴起只是加快了自动化交易的速度。对于交易员或基金经理来说,相关的问题是“我如何应用这个新工具来产生更多的 alpha 值?”.我现在将探索一个这样的模型来回答这个问题。

使用 Python 创建交易机器学习算法的先决条件

您可以添加一行来安装软件包“ pip install numpy anda...”您可以使用 Anaconda 提示符中的以下代码安装必要的软件包。

  • pip install pandas
  • pip install pandas-datareader
  • pip install numpy
  • pip install sklearn
  • pip install matplotlib

在进一步讨论之前,让我声明这段代码是用 Python 2.7编写的。

问题陈述

让我们从理解我们的目标开始。在本 Python 机器学习教程的最后,我将向您展示如何创建一个算法,该算法可以根据以前的 OHLC (Open,High,Low,Close)数据预测一天的收盘价。

我还想监视预测错误以及输入数据的大小。

让我们导入构建这个机器学习算法所需的所有库和包。

from pandas_datareader import data as web
import numpy as np
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import RandomizedSearchCV as rcv
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
import matplotlib.pyplot as plt
from IPython import get_ipython

数据的获取及其在机器学习算法中的应用

为了创建任何算法,我们需要数据来训练算法,然后对新的未知数据进行预测。在这个 Python 机器学习教程中,我们将从 Yahoo 获取数据。

为了实现这一点,我们将使用熊猫图书馆的数据读取功能。这个函数被广泛使用,它使您能够从许多联机数据源获取数据。

df = web.DataReader('SPY',data_source='yahoo' ,start='2000-01-01',end='2017-03-01')
df=df[['Open','High','Low','Close','Volume']]

我们正在获取与标准普尔500指数挂钩的 SPDR ETF 的数据。这只股票可以作为标准普尔500指数表现的代表。我们指定从哪一年开始提取数据。

一旦数据进入,我们将丢弃除 OHLC 以外的任何数据,比如音量和调整后的关闭,以创建我们的数据帧‘ df’。

现在我们需要根据过去的数据进行预测,这些过去的特性将有助于机器学习模型的交易。因此,让我们在数据框架中创建新的列,其中包含滞后一天的数据。

df['open']=df['Open'].shift(1)
df['high']=df['High'].shift(1)
df['low']=df['Low'].shift(1)
df['close']=df['Close'].shift(1)

注意,在新列的名称中,小写字母的大写字母被删除。

创建超参数

虽然超参数的概念本身值得一篇文章,但现在我只想说几句关于它们的话。这些参数是机器学习算法无法学习但需要迭代的。我们使用它们来查看哪些预定义函数或参数产生最佳拟合函数。

imp = SimpleImputer(missing_values=np.nan, strategy='mean')

steps = [('imputation', imp),
         ('scaler',StandardScaler()),
         ('lasso',Lasso())]        

pipeline =Pipeline(steps)


parameters = {'lasso__alpha':np.arange(0.0001,10,.0001),
              'lasso__max_iter':np.random.uniform(100,100000,4)}


reg = rcv(pipeline, parameters,cv=5)

在这个例子中,我使用了 Lasso 回归,它使用 L1类型的正则化。这是一种基于回归分析的机器学习模型,用于预测连续的数据。

这种类型的正则化在使用特征选择时非常有用。它能够将系数值减少到零。SimpleImputer 函数用代码中指定的平均值替换可能影响我们预测的任何 NaN 值。

“步骤”是一组函数,它们被合并为管道函数的一部分。流水线是在数据集上执行多个操作得非常有效的工具。这里我们还传递了 Lasso 函数参数以及可以迭代的值列表。

虽然我不会详细说明这些参数到底是做什么的,但它们是值得深入研究的东西。最后,我调用了随机搜索函数来执行交叉验证。

在这个例子中,我们使用了5折交叉验证。在 k 倍交叉验证中,原始样本被随机分割成 k 等大小的子样本。在 k 子样本中,保留一个子样本作为模型的验证数据,其余的 k-1子样本作为训练数据。

然后重复 k 次(折叠)的交叉验证过程,每个 k 子样只用一次作为验证数据。交叉验证结合(平均值)拟合度量(预测误差) ,以得出对模型预测性能的更准确的估计。

根据拟合参数确定最佳特征。在 Python 机器学习教程的下一节中,我们将查看测试集和训练集。

将数据分割成测试集和训练集

首先,让我们将数据分割为输入值和预测值。在这里,我们将带有一天滞后的 OHLC 数据作为数据框架 X 传递,将当前日期的 Close 值作为 y 传递。

X=df[['open','high','low','close']]
y =df['Close']

在这个示例中,为了使 Python 机器学习教程简短且相关,我选择不创建任何多项式特性,而只使用原始数据。如果您对输入参数的各种组合以及具有更高级别的多项式特征感兴趣,可以使用 scikit 学习的预处理包中的 PolynomialFeature ()函数自由地转换数据。

现在,我们还要创建一个字典来保存数据集的大小及其相应的平均预测误差。

avg_err={}

获取最适合的参数以创建新函数

我想测量与输入数据集大小相比,回归函数的性能。换句话说,我想看看通过增加输入数据,我们是否能够减少误差。为此,我使用 For 循环迭代相同的数据集,但是长度不同。

在这一点上,我想补充的是,对于那些有兴趣的人,探索“重置”功能,以及它将如何帮助我们做出更可靠的预测。

(提示: 它是 Python 魔法命令的一部分)

for t in np.arange(50,97,3):
    get_ipython().magic('reset_selective -f reg1')
    split = int(t*len(X)/100)
    reg.fit(X[:split],y[:split])
    best_alpha = reg.best_params_['lasso__alpha']
    best_iter= reg.best_params_['lasso__max_iter']
    reg1= Lasso(alpha=best_alpha,max_iter=best_iter)
    X=imp.fit_transform(X,y)
    reg1.fit(X[:split],y[:split])

让我用几个步骤来解释我做了什么。

首先,我创建了一组从50到97的周期数字‘ t’,步骤是3。这些数字的用途是选择将用作测试集数据的数据集的百分比大小。

其次,对于给定的“ t”值,我将数据集的长度分割为与这个百分比相对应的最接近的整数。然后将整个数据划分为训练集数据和测试集数据,训练集数据包括开始的数据和分开的数据。采用这种方法而不使用随机分裂的原因是为了保持时间序列的连续性。

在此之后,我们提取出产生最低交叉验证误差的最佳参数,然后使用这些参数创建一个新的 reg1函数,这将是一个简单的套索回归拟合最佳参数。

预测和检查性能

现在让我们来预测未来接近的价值。为此,我们将测试 X (包含从分割到结束的数据)传递给使用預()函数的回归函数。我们还想了解函数的执行情况,所以让我们将这些值保存到一个新列中。

df['P_C_%i'%t]=0.
    df.iloc[:,df.columns.get_loc('P_C_%i'%t)]=reg1.predict(X[:])
    df['Error_%i'%t]= np.abs(df['P_C_%i'%t]-df['Close'])

    e =np.mean(df['Error_%i'%t][split:])
    train_e= np.mean(df['Error_%i'%t][:split])
    avg_err[t]=e
    avg_train_err[t]=train_e

您可能已经注意到,我创建了一个新的错误列来保存绝对错误值。然后求出绝对错误值的平均值,这些值保存在我们之前创建的字典中。

结果如下:

Range =df['high'][split:]-df['low'][split:]
plt.scatter(list(avg_train_err.keys()),list(avg_train_err.values()),label='train_error')
plt.legend(loc='best')
print ('\nAverage Range of the Day:',np.average(Range))

我创建了一个新的 Range 值来保存数据的平均每日交易范围。当我做预测的时候,这是一个我想要比较的指标。这种比较背后的逻辑是,如果我的预测错误超过当天的范围,那么它可能就不会有用。

不妨用前一天的高或低作为预测,这将被证明是更准确的。请注意,我在循环外使用了拆分值。这意味着您在这里看到的每天的平均范围与上一次迭代相关。

执行代码,查看结果

这个散点图告诉了我们什么?

这个方程是否过于拟合?

随着训练数据集规模的增大,数据的性能显著提高。这是否意味着如果我们提供更多的数据,错误将进一步减少?

市场中是否存在一种内在的趋势,使我们能够随着数据集规模的增加而做出更好的预测?

最后但最好的问题是,我们将如何使用这些预测来创建一个交易策略?

特别内容

有关使用 Python 进行交易的机器学习算法的 FAQ

在交易机器学习算法教程的最后一部分,我问了一些问题。现在,我要同时回答这些问题。我还将讨论一种无需训练趋势算法就能发现市场中的机制/趋势的方法。

但是在我们继续之前,请使用一个修复程序从 Google 获取数据来运行下面的代码。

from pandas_datareader import data as web
import numpy as np
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import RandomizedSearchCV as rcv
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
import matplotlib.pyplot as plt
from IPython import get_ipython

avg_err={}
avg_train_err={}
df = web.DataReader('SPY',data_source='yahoo' ,start='2010-01-01',end='2017-03-01')

问: 这个方程是否过于拟合?

这是我问的第一个问题。要知道你的数据是否过拟合,最好的测试方法是检查算法在训练和测试数据中的预测错误。

为此,我们将不得不在已经编写的代码中添加一小段代码。

from pandas_datareader import data as web
import numpy as np
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import RandomizedSearchCV as rcv
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
import matplotlib.pyplot as plt
from IPython import get_ipython

avg_err={}
avg_train_err={}
df = web.DataReader('SPY',data_source='yahoo' ,start='2000-01-01',end='2017-03-01')
df=df[['Open','High','Low','Close','Volume']]
df['open']=df['Open'].shift(1)
df['high']=df['High'].shift(1)
df['low']=df['Low'].shift(1)
df['close']=df['Close'].shift(1)
df['volume']=df['Volume'].shift(1)

X=df[['open','high','low','close']]
y =df['Close']

imp = SimpleImputer(missing_values=np.nan, strategy='mean')

steps = [('imputation', imp),
         ('scaler',StandardScaler()),
         ('lasso',Lasso())]        

pipeline =Pipeline(steps)


parameters = {'lasso__alpha':np.arange(0.0001,10,.0001),
              'lasso__max_iter':np.random.uniform(100,100000,4)}


reg = rcv(pipeline, parameters,cv=5)



for t in np.arange(50,97,3):
    get_ipython().magic('reset_selective -f reg1')
    split = int(t*len(X)/100)
    reg.fit(X[:split],y[:split])
    best_alpha = reg.best_params_['lasso__alpha']
    best_iter= reg.best_params_['lasso__max_iter']
    reg1= Lasso(alpha=best_alpha,max_iter=best_iter)
    X=imp.fit_transform(X,y)
    reg1.fit(X[:split],y[:split])


    df['P_C_%i'%t]=0.
    df.iloc[:,df.columns.get_loc('P_C_%i'%t)]=reg1.predict(X[:])
    df['Error_%i'%t]= np.abs(df['P_C_%i'%t]-df['Close'])

    e =np.mean(df['Error_%i'%t][split:])
    train_e= np.mean(df['Error_%i'%t][:split])
    avg_err[t]=e
    avg_train_err[t]=train_e
Range =df['high'][split:]-df['low'][split:]

plt.scatter(list(avg_err.keys()),list(avg_err.values()), label='test_error')
plt.scatter(list(avg_train_err.keys()),list(avg_train_err.values()),label='train_error')
plt.legend(loc='best')
print ('\nAverage Range of the Day:',np.average(Range))

如果我们运行这段代码,那么输出将类似于下面这样。

与训练集运行数据相比,本文算法在测试数据处理方面取得了较好的效果。这一观察本身就是一个危险信号。有几个原因可以解释为什么我们的测试数据错误比训练集数据错误好:

  1. 如果与测试集相比,训练集数据具有更大的波动性(每日范围) ,那么预测也将表现出更大的波动性。
  2. 如果市场有一个内在的趋势,帮助算法做出更好的预测。

现在,让我们来看看哪些情况是真实的。如果测试数据的范围小于训练数据的范围,那么在通过80% 以上的数据作为训练集后,误差应该会减小,但是误差会增大。

接下来,为了检查是否存在趋势,让我们传递来自不同时期的更多数据。

dfre 
from pandas_datareader import data as web
import numpy as np
import pandas as pd
from sklearn import mixture as mix
import seaborn as sns 
import matplotlib.pyplot as plt
01're)

如果我们运行代码,结果会是这样的:

所以,提供更多的数据并不能让你的算法运行得更好,反而会让它变得更糟。在时间序列数据中,内在趋势对算法在测试数据上的性能起着非常重要的作用。

正如我们在上面看到的,它有时会产生比预期更好的结果。我们的算法之所以做得这么好的主要原因是测试数据坚持了在训练集数据中观察到的主要模式。

因此,如果我们的算法能够发现潜在的趋势,并使用一种策略的趋势,那么它应该给出更好的结果。我将在下面更详细地解释这一点。

问: 机器学习算法能否发现内在趋势或市场阶段(牛市/熊市/横盘/突破/恐慌) ?

问: 数据库是否可以进行裁剪,以便针对不同情况训练不同的算法

答: 这两个问题的答案都是“是”!

我们可以将市场划分为不同的机制,然后使用这些信号来修剪数据,并为这些数据集训练不同的算法。为了达到这个目的,我选择使用一个非监督式学习算法。

从现在开始,这个 Python 机器学习教程将致力于创建一种算法,该算法可以检测市场中的固有趋势,而无需进行明确的培训。

首先,让我们导入必要的库。

from pandas_datareader import data as web
import numpy as np
import pandas as pd
from sklearn import mixture as mix
import seaborn as sns 
import matplotlib.pyplot as plt

然后我们从谷歌获取 OHLC 的数据,并将其改变一天,以便只对过去的数据进行算法训练。

df= web.get_data_yahoo('SPY',start= '2000-01-01', end='2017-01-01')
df=df[['Open','High','Low','Close']]
df['open']=df['Open'].shift(1)
df['high']=df['High'].shift(1)
df['low']=df['Low'].shift(1)
df['close']=df['Close'].shift(1)

df=df[['open','high','low','close']]

然后删除所有NaN

df=df.dropna()

接下来,我们将使用 sklearn 的“高斯混合”模型实例化一个非监督式学习算法。

unsup = mix.GaussianMixture(n_components=4, 
                            covariance_type="spherical", 
                            n_init=100, 
                            random_state=42)

在上面的代码中,我创建了一个无监督算法,它将根据自己选择的标准将市场划分为4个机制。我们没有像 Python 机器学习教程的前一部分那样提供任何带有标签的训练集数据。

接下来,我们将对数据进行拟合并预测各种制度。然后我们将把这些状态预测存储在一个叫做状态的新变量中。

unsup.fit(np.reshape(df,(-1,df.shape[1])))
regime = unsup.predict(np.reshape(df,(-1,df.shape[1])))

现在让我们计算一下今天的收益。

df['Return']= np.log(df['close']/df['close'].shift(1))

然后,创建一个称为体制的数据框架,它将具有 OHLC 和 Return 值以及相应的体制分类。

Regimes=pd.DataFrame(regime,columns=['Regime'],index=df.index)\
                     .join(df, how='inner')\
                          .assign(market_cu_return=df.Return.cumsum())\
                                 .reset_index(drop=False)\
                                             .rename(columns={'index':'Date'})

在此之后,让我们创建一个名为“ order”的列表,其中包含与体制分类相对应的值,然后绘制这些值以查看算法的分类情况。

order=[0,1,2,3]
fig = sns.FacetGrid(data=Regimes,hue='Regime',hue_order=order,aspect=2,size= 4)
fig.map(plt.scatter,'Date','market_cu_return', s=4).add_legend()
plt.show()

最终的制度差异如下:

这个图表看起来很不错。实际上,我们不需要考虑进行分类所依据的因素,只要看看图表就可以得出一些结论。

  • 红色区域是低波动区域或横向区域
  • 紫色区域为高波动区或恐慌区。
  • 绿色区域是一个突破区域。
  • 蓝色区域: 不完全确定,但让我们找出答案。

使用下面的代码列印每个制度的相关数据。

for i in order:
    print('Mean for regime %i: '%i,unsup.means_[i][0])
    print('Co-Variancefor regime %i: '%i,(unsup.covariances_[i]))

输出如下:

数据可以推断如下:

Regime 0: 低均值和高协方差。

Regime 1: 高均值和高协方差。

Regime 2: 高均值和低协方差。

Regime 3: 低均值和低协方差。

到目前为止,我们已经看到了如何将市场分割成不同的机制。

但是,实施成功战略的问题仍然没有答案。如果你想学习如何编写机器学习交易策略的代码,那么你的选择很简单:

# 莫斐斯的黑客帝国电影三部曲
# 这是你最后的机会,之后就没有回头路了。
# 你吃了蓝色药丸,故事结束了,你在床上醒来,相信你可以手动交易。
# 你吃了红色药丸ーー你留在阿尔戈兰德,我会让你知道兔子洞有多深。
# 记住,我只是说出真相,仅此而已。

进一步进入机器学习交易算法的世界

在当今世界,随时更新自己的信息至关重要。拥有一个学习者的心态总是有助于提高你的职业生涯,在为自己或他们的公司制定交易策略的过程中掌握技能和其他工具。

这里有一些可能有趣的书:

  • Gareth James, Daniela Witten, Trevor Hastie and Robert Tibshirani Introduction to statistical learning
  • The Hundred-Page Machine Learning Book by Andriy Burkov
  • Hastie, Tibshirani, and Friedman's The Elements of Statistical Learning

机器学习比赛

有许多网站主办机器学习竞赛。这些竞赛虽然没有特别针对 Python 机器学习在交易中的应用。

他们可以通过参加竞赛和论坛,让定量分析师和交易员了解不同的机器学习问题,并帮助扩展他们的机器学习知识。一些流行的机器学习竞赛主办网站包括:

结论

总的来说,我们已经完成了您如何学习创建和使用自己的机器学习的全过程,在 Python 中使用各种示例进行算法交易。在 Python 代码的帮助下解释了整个过程,这些代码也将对您的实践有所帮助。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码