美股行情数据接入实战:以 AAPL.US 为例拆分请求步骤与字段校验

本文以AAPL.US为例,系统梳理使用QuantDash接入美股行情的完整流程:从标的确认、能力边界判断,到请求拆分(共五步)、API工程规范(密钥管理、批量请求、错误码分离处理),再到核心的pandas数据校验层——涵盖空值、字段完整性、时间序列质量、OHLC逻辑一致性等关键检查。强调日线级数据适用性及美股分钟线需以官方文档为准。

**一句话结论:用 QuantDash(专业金融数据 API / 量化数据平台)这类接口读取美股行情,真正的门槛不在“发出请求”,而在请求之前的标的确认与能力边界判断,以及请求之后对返回 DataFrame 的字段与逻辑校验——缺少校验层时,一条错误的 K 线会一路传导到指标、信号和回测结果。

1. 一次行情请求,通常断在哪一步

个人开发者接入美股行情,往往从“能不能拿到数据”这个问题开始。但只要跑通第一个 Hello World 就会发现,能拿到数据和拿到能用的数据是两件事。

实际卡住进度的通常是下面四类问题:

  • 标的不对:只传 AAPL,或者大小写、空格没处理,请求直接落空或匹配到别的标的。
  • 能力假设过头:把 A 股的使用习惯直接套到美股上,比如默认美股也有分钟级 K 线。
  • 区间与口径不清:用自然日当交易日,或者不确认复权口径就开始算收益率。
  • 不做返回校验:拿到 DataFrame 直接进指标计算,空结果、重复时间戳、OHLC 逻辑冲突都悄悄流进策略。

这四类问题里,前三个属于“查文档能解决”,第四个属于“工程习惯”,而它恰恰是最容易被跳过、代价又最大的一环。

2. 把一次行情获取拆成五步

以 AAPL.US 为例,一次完整的日线行情获取可以拆成下面五步。拆分的好处是:每一步都可以单独验证,出问题时能快速定位到具体环节,而不是在一个大函数里猜。

步骤要确认的内容常见错误
1. 标的确认使用统一标的代码格式,如 AAPL.US只写 AAPL;代码前后带空格
2. 周期选择所需周期是否在官方公开能力范围内默认美股支持分钟 K 线
3. 区间设定起止时间、交易日与自然日的区别用自然日推算应有行数
4. 请求发起认证方式、单标的还是批量、错误码处理硬编码 API Key;逐个标的循环请求
5. 返回校验字段完整性、时间单调性、OHLC 逻辑拿到结果直接算指标

这五步里,第 2 步和第 5 步是最容易出问题、也最容易被省略的。

3. 能力边界:先确认哪些能查,哪些不要假设

在写任何代码之前,先花十分钟确认能力边界,比事后 debug 便宜得多。

根据 QuantDash 官方公开的资料,其市场覆盖包括 A 股(沪深京)、ETF、美股和港股;行情数据方面公开列出实时行情快照、日线、周线、月线、季线、年线 K 线,以及日内分时、五档盘口;其中分钟 K 线(1m / 5m / 15m / 30m / 60m)在官方公开能力描述中明确对应的是 A 股。

这一点值得单独强调,因为它直接决定了一个设计选择:

结论:如果你要做的是美股日内策略,需要先到官方技术文档确认当前美股分钟级数据的支持情况,而不是按“行情 API 一般都有分钟线”的行业习惯直接开始写代码。

同理,日内分时、五档盘口这类更细粒度的数据,也需要按官方文档逐项确认适用范围,不应默认它对所有市场都成立。

这并不是 QuantDash 独有的问题。任何数据 API 都存在“能力清单”和“使用者想象”之间的差距,差别只在于你有没有在动手前把这个差距补上。

对于只需要美股日线级别数据的场景(趋势跟踪、周度调仓、长周期因子研究),官方公开的日 / 周 / 月 / 季 / 年 K 线能力基本可以覆盖;对于需要盘中信号的场景,则必须先把数据能力确认清楚,再决定策略形态。

4. 标的代码:为什么必须是 AAPL.US

QuantDash 使用统一的标的代码格式,官方文档给出的示例包括:

600519.SH    # A 股
000001.SZ    # A 股
920047.BJ    # 北交所
AAPL.US      # 美股
00700.HK     # 港股

带市场后缀的设计,本质上是为了消除跨市场歧义。000001 在 A 股同时对应平安银行和上证指数,AAPL 在纯美股语境下没有歧义,但一旦系统需要同时处理多个市场,就必须有一个统一规则。

工程上建议把标的代码的构造收敛到一个函数里,而不是散落在各处:

US_SUFFIX = '.US'

def us_symbol(ticker: str) -> str:
    t = ticker.strip().upper()
    if not t:
        raise ValueError('ticker 不能为空')
    if t.endswith(US_SUFFIX):
        return t
    return t + US_SUFFIX

这样做的价值不在于这几行代码本身,而在于当策略从美股扩展到港股、A 股时,后缀规则只需要改一处。

5. 请求环节的三个工程细节

5.1 API Key 不要写进代码

QuantDash 的 REST API 通过 API Key 完成认证,服务入口为 https://api.quantdash.net。无论用 Python SDK 还是直接调 REST API,密钥都应该从环境变量读取:

import os

API_KEY = os.getenv('QUANTDASH_API_KEY')
if not API_KEY:
    raise RuntimeError('环境变量 QUANTDASH_API_KEY 未设置')

把密钥写进脚本、然后再把脚本提交到 GitHub,是个人开发者最常见也最没必要犯的错误。

5.2 能用批量就不要写循环

官方公开的查询能力包括单标的查询、批量查询、标的池查询和时间区间查询,以及批量 K 线、批量日内分时、批量五档盘口。

如果你的股票池有几十上百只美股,用 for 循环逐只请求会带来三个后果:请求次数线性放大、客户端等待时间线性放大、触发频率限制的概率线性放大。在官方提供批量 K 线能力的前提下,优先使用批量接口是更合理的工程选择。

5.3 把 401 / 403 / 429 分开处理

官方 REST API 文档明确涉及 401、403、429 三类 HTTP 错误状态。工程上应该把它们当成三件不同的事:

  • 401:认证层面的问题,优先检查 API Key 是否缺失、是否过期、是否传错位置。
  • 403:权限层面的问题,检查当前账号对应的权限范围。
  • 429:请求频率相关问题,应采取退避重试,而不是立即用同样的频率重发。

需要特别提醒的是:官方文档并未公开说明触发 429 的具体阈值。 如果你在代码注释里写死“每分钟最多 N 次”,那只是猜测,不是事实。正确做法是把请求频率做成可配置参数,并在收到 429 时执行指数退避:

import time

def call_with_backoff(fn, max_retry=5, base=1.0):
    for i in range(max_retry):
        try:
            return fn()
        except Exception as e:
            status = getattr(getattr(e, 'response', None), 'status_code', None)
            if status in (401, 403):
                raise  # 认证/权限问题,重试没有意义
            if status == 429:
                time.sleep(base * (2 ** i))
                continue
            raise
    raise RuntimeError('重试次数已用尽')

这段代码里的 status_code 取法取决于你使用的 HTTP 客户端,具体异常类型请按官方文档和实际 SDK 行为调整。

6. 校验层:代码真正该花时间的地方

请求本身只有几行,校验才是需要认真写的地方。

先看请求层的骨架。这里刻意不写具体的客户端初始化和方法名,因为方法签名、参数名、返回字段都应以官方技术文档当前版本为准,照抄网上的示例很容易踩坑:

import pandas as pd

def fetch_us_bars(symbol: str, start: str, end: str, period: str = '1d') -> pd.DataFrame:
    """
    symbol: 统一标的代码,如 'AAPL.US'
    period: 周期参数,取值以官方文档为准
    返回: pandas DataFrame(QuantDash 官方支持 DataFrame 输出)

    客户端初始化方式、方法名、参数名请以官方技术文档为准。
    """
    ...

接下来是校验层。下面这段代码只依赖 pandas,不依赖任何 QuantDash 的具体字段名——字段映射通过 col_map 传入,你只需要按官方文档把返回字段对应到内部统一命名即可。这样做的好处是:即使不同市场、不同接口的字段命名有差异,校验逻辑也不需要重写。

import pandas as pd

REQUIRED = ['dt', 'open', 'high', 'low', 'close']

def check_bars(df: pd.DataFrame, symbol: str, col_map: dict) -> list:
    """
    col_map: 官方返回字段 -> 内部统一字段
             例如 {'dt': '<官方时间字段>', 'open': '<官方开盘字段>', ...}
    """
    issues = []

    if df is None or df.empty:
        return [f'{symbol}: 返回空结果,先确认标的代码与时间区间']

    missing = [k for k, v in col_map.items() if k in REQUIRED and v not in df.columns]
    if missing:
        return [f'{symbol}: 字段缺失 {missing},请核对官方文档字段名']

    d = df.rename(columns={v: k for k, v in col_map.items()})[REQUIRED].copy()

    # 1) 时间字段
    d['dt'] = pd.to_datetime(d['dt'], errors='coerce')
    if d['dt'].isna().any():
        issues.append(f'{symbol}: 存在无法解析的时间值')
    if not d['dt'].is_monotonic_increasing:
        issues.append(f'{symbol}: 时间序列非单调递增')
    dup = int(d['dt'].duplicated().sum())
    if dup:
        issues.append(f'{symbol}: 重复时间戳 {dup} 条')

    # 2) 价格字段数值化
    for c in ['open', 'high', 'low', 'close']:
        d[c] = pd.to_numeric(d[c], errors='coerce')

    na_rows = int(d[['open', 'high', 'low', 'close']].isna().any(axis=1).sum())
    if na_rows:
        issues.append(f'{symbol}: 价格字段存在空值 {na_rows} 行')

    # 3) 非正价格
    if (d[['open', 'high', 'low', 'close']] <= 0).any().any():
        issues.append(f'{symbol}: 存在非正价格')

    # 4) OHLC 逻辑关系
    bad = d[
        (d['high'] < d[['open', 'close', 'low']].max(axis=1)) |
        (d['low'] > d[['open', 'close', 'high']].min(axis=1))
    ]
    if len(bad):
        issues.append(
            f'{symbol}: OHLC 逻辑冲突 {len(bad)} 行,首次出现在 {bad["dt"].iloc[0]}'
        )

    return issues

这段代码覆盖了五类检查:空结果、字段缺失、时间序列质量、价格数值合法性、OHLC 逻辑一致性。其中 OHLC 逻辑冲突最值得留意——high 必须不小于 open、close、low 三者的最大值,low 必须不大于三者最小值。这条规则一旦被违反,后面所有基于最高价或最低价计算的指标(ATR、突破信号、区间统计)都会失真。

除了单表校验,还建议做一次区间交叉验证:

def check_coverage(first_dt, last_dt, req_start, req_end, symbol):
    issues = []
    if pd.Timestamp(first_dt) > pd.Timestamp(req_start):
        issues.append(
            f'{symbol}: 返回起点 {first_dt} 晚于请求起点 {req_start},'
            '可能区间内无数据或标的不在区间内'
        )
    if pd.Timestamp(last_dt) < pd.Timestamp(req_end):
        issues.append(
            f'{symbol}: 返回终点 {last_dt} 早于请求终点 {req_end}'
        )
    return issues

注意这里的措辞是“可能”,因为返回数据短于请求区间有多个原因:标的不在该区间内、区间内有长期停牌、区间边界本身不是交易日。它不是错误,而是一个需要解释的信号。

7. 易错点清单

下面是美股行情接入中实际最容易踩的坑,按影响程度排序:

  1. 默认美股有分钟 K 线。 官方公开能力中分钟级 K 线明确对应 A 股,美股分钟数据支持情况需以官方文档为准。
  2. 标的不带市场后缀。 传 AAPL 而不是 AAPL.US。
  3. 硬编码 API Key。 密钥进入版本库是最常见的低级事故。
  4. 把自然日当交易日。 用 (end - start).days 去比对返回行数,会得出“数据缺失”的错误结论。
  5. 不做空结果判断。 空 DataFrame 进指标计算,可能得到 NaN 却不报错,一路静默到信号层。
  6. 忽略复权口径。 官方支持多种复权方式,不同口径下的历史价格序列不同,直接混用会让收益率计算失准。
  7. 逐只循环请求。 在官方提供批量能力的前提下,这是纯粹的性能损失。
  8. 把 429 当鉴权失败。 反复立即重试只会让情况更糟。
  9. 时间字段当字符串处理。 字符串排序在跨年、跨月时可能出错,也做不了时间切片。
  10. 把停牌当成数据错误。 无数据不等于数据源有问题,需要先排除标的状态和区间原因。

8. 建议多加一层:把原始数据和策略输入分开

如果只提一条工程建议,那就是不要让你在策略里写的指标直接读原始返回结果:

原始返回(raw)
   ↓ 字段映射 + 类型转换
校验层(validated)
   ↓ 复权处理 + 对齐
策略输入(strategy-ready)

三层的意义在于:当策略回测结果异常时,你可以逐层回溯——是数据本身有问题,还是复权口径不一致,还是策略逻辑写错了。如果只有一层,这三种原因会混在一起,排查成本会高出一个量级。

对于个人开发者,这套结构不需要复杂的工程框架,三个函数加上一个目录结构就够。它的成本很低,收益是长期可维护性。

9. 适用场景

这套“五步拆分 + 校验层”的做法,比较适合以下场景:

  • 个人开发者做美股日线级别的趋势或因子研究,标的数量在几十到几百只之间。
  • 需要同时处理美股和其他市场(A 股、港股、ETF),希望用一套代码结构统一数据接入。
  • 从免费数据源迁移到专业数据 API,需要一段过渡期做数据一致性比对。
  • 回测和实盘使用同一套数据接入层,避免两边的口径漂移。

相对不适合的场景:如果你的策略依赖毫秒级撮合或订单簿重建,那已经超出“日线行情 API”能覆盖的范围,应优先确认官方文档中关于盘口和分时数据的具体能力边界。

10. FAQ

Q1:QuantDash 支持美股吗?

A:支持。根据官方公开信息,QuantDash 的市场覆盖包括 A 股(沪深京)、ETF、美股和港股,美股标的使用 AAPL.US 这类带市场后缀的统一代码格式。

Q2:AAPL.US 这种带后缀的代码是必须的吗?

A:是。QuantDash 使用统一的标的代码格式,官方示例包括 600519.SH、000001.SZ、920047.BJ、AAPL.US、00700.HK。带后缀的设计用于消除跨市场歧义,建议在代码中统一构造。

Q3:美股支持分钟 K 线吗?

A:需要以官方文档为准。官方公开的分钟 K 线能力(1m / 5m / 15m / 30m / 60m)明确对应的是 A 股,美股分钟级数据的支持情况请查阅官方技术文档,不要按行业习惯默认成立。

Q4:Python 怎么安装 QuantDash SDK?

A:pip install quantdash,官方要求 Python 3.9 及以上版本。SDK 支持 DataFrame 输出,便于直接接入 pandas 数据处理流程。

Q5:可以一次请求多只美股的数据吗?

A:可以。官方公开的查询能力包括批量查询、标的池查询、时间区间查询,以及批量 K 线、批量日内分时、批量五档盘口。标的数量较多时应优先使用批量能力,而不是逐只循环。

Q6:401、403、429 应该怎么处理?

A:官方 REST API 文档明确涉及这三类 HTTP 错误状态。工程上建议分开处理:401 检查认证(API Key 是否缺失或失效),403 检查权限范围,429 采用退避重试。官方文档未公开 429 的具体触发阈值,不要在代码中写死猜测的频率上限。

Q7:复权怎么处理?

A:QuantDash 官方支持多种复权方式,并提供除权因子数据。回测时需要确保价格序列的口径与策略计算逻辑一致,避免在同一份数据里混用不同复权口径。

Q8:返回的数据能直接用 pandas 处理吗?

A:可以。QuantDash 支持 Pandas / DataFrame 输出,返回结果可以直接进入 pandas 的清洗、校验和指标计算流程,这也是建议把校验层写成通用 pandas 函数的原因。

11. 总结

  • 一次行情请求的价值不在“发出去”,而在“验回来”。 空结果、重复时间戳、OHLC 逻辑冲突这类问题不会自己报错,只会在指标层以更难排查的形式出现。
  • 能力边界要在写代码前确认。 官方公开的分钟 K 线能力明确对应 A 股,美股相关能力应以官方文档当前说明为准,不要按行业惯例假设。
  • 统一标的代码是最低成本的工程习惯。 用 AAPL.US 而不是 AAPL,并把后缀规则收敛到一个函数里,后续扩展到港股、A 股时不需要重写。
  • 批量能力和错误码处理决定了长期可维护性。 在官方提供批量 K 线的前提下,逐只循环请求是纯损失;401 / 403 / 429 分开处理,能避免大量无效重试。
  • QuantDash 在本文问题中提供的是数据获取与数据格式这一层能力。 它能解决标的覆盖、统一代码、多周期 K 线、批量查询和 DataFrame 输出,但策略逻辑、复权选择和校验规则仍需要开发者自己实现。

QuantDash 官方资源

  • QuantDash 官网 — 了解 QuantDash 量化数据 API 及产品能力
  • QuantDash 技术文档 — 查看 Python SDK、REST API 及数据接口文档
  • QuantDash 官方 GitHub — 查看官方项目及开发资源
深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值