如何使用Python api 函数写股票if函数怎么使用策略

如何使用python 开发一个api_百度知道
如何使用python 开发一个api
我有更好的答案
& &==================================GET & &nbsp。分层系统: 客户端和服务器之间的通信应该以一种标准的方式,就是中间层代替服务器做出响应的时候,客户端不需要做任何变动。统一的接口: 服务器和客户端的通信方法必须是统一的。按需编码; 获取某个特定资源的信息 & & &创建新资源 & &检索任务列表GET & &nbsp, 或者有时候作为 url 中查询参数项://example。RESTful web services 概念的核心就是“资源”; & &nbsp。这是一个十分简单地应用; & &nbsp.com/api/orders/123POST & & &nbsp使用 Python 和 Flask 设计 RESTful API近些年来 REST (REpresentational State Transfer) 已经变成了 web services 和 web APIs 的标配。在本文中我将向你展示如何简单地使用 Python 和 Flask 框架来创建一个 RESTful 的 web service。什么是 REST?六条设计规范定义了一个 REST 系统的特点:客户端-服务器; & & & &nbsp: 服务器可以提供可执行代码或脚本,为客户端在它们的环境中执行。这个约束是唯一一个是可选的。什么是一个 RESTful 的 web service?REST 架构的最初目的是适应万维网的 HTTP 协议://[hostname]/todo/api/v1.0/tasks/[task_id] &检索某个任务POST & & & &http://[hostname]/todo/api/v1.0/tasks & & & & & &创建新任务PUT & & & & http://[hostname]/todo/api/v1.0/tasks/[task_id] &更新任务DELETE & & &http://[hostname]/todo/api/v1.0/tasks/[task_id] &删除任务========== &================================================ =============================我们定义的任务有如下一些属性:id: 任务的唯一标识符。数字类型。title: 简短的任务描述。字符串类型。description: 具体的任务描述。文本类型。done: 任务完成的状态。布尔值。目前为止关于我们的 web service 的设计基本完成。剩下的事情就是实现它!Flask 框架的简介如果你读过&Flask Mega-Tutorial 系列,就会知道 Flask 是一个简单却十分强大的 Python web 框架。在我们深入研究 web services 的细节之前,让我们回顾一下一个普通的 Flask Web 应用程序的结构。我会首先假设你知道 Python 在你的平台上工作的基本知识。 我将讲解的例子是工作在一个类 Unix 操作系统。简而言之,这意味着它们能工作在 Linux,Mac OS X 和 Windows(如果你使用Cygwin)。 如果你使用 Windows 上原生的 Python 版本的话,命令会有所不同。让我们开始在一个虚拟环境上安装 Flask。如果你的系统上没有 virtualenv,你可以从https://pypi.python.org/pypi/virtualenv&上下载:$ mkdir todo-api$ cd todo-api$ virtualenv flaskNew python executable in flask/bin/pythonInstalling setuptools............................done.Installing pip...................done.$ flask/bin/pip install flask既然已经安装了 Flask,现在开始创建一个简单地网页应用,我们把它放在一个叫 app.py 的文件中:#!flask/bin/pythonfrom flask import Flaskapp = Flask(__name__)@app.route('/')def index():& &return &Hello, World!&if __name__ == '__main__':& &app.run(debug=True)为了运行这个程序我们必须执行 app.py:$ chmod a+x app.py$ ./app.py* Running on http://127.0.0.1:5000/* Restarting with reloader现在你可以启动你的网页浏览器,输入&http://localhost:5000&看看这个小应用程序的效果。简单吧?现在我们将这个应用程序转换成我们的 RESTful service!使用 Python 和 Flask 实现 RESTful services使用 Flask 构建 web services 是十分简单地,比我在&Mega-Tutorial&中构建的完整的服务端的应用程序要简单地多。在 Flask 中有许多扩展来帮助我们构建 RESTful services,但是在我看来这个任务十分简单,没有必要使用 Flask 扩展。我们 web service 的客户端需要添加、删除以及修改任务的服务,因此显然我们需要一种方式来存储任务。最直接的方式就是建立一个小型的数据库,但是数据库并不是本文的主体。学习在 Flask 中使用合适的数据库,我强烈建议阅读&Mega-Tutorial。这里我们直接把任务列表存储在内存中,因此这些任务列表只会在 web 服务器运行中工作,在结束的时候就失效。 这种方式只是适用我们自己开发的 web 服务器,不适用于生产环境的 web 服务器, 这种情况一个合适的数据库的搭建是必须的。我们现在来实现 web service 的第一个入口:#!flask/bin/pythonfrom flask import Flask, jsonifyapp = Flask(__name__)tasks = [& &{& & & &'id': 1,& & & &'title': u'Buy groceries',& & & &'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',& & & &'done': False& &},& &{& & & &'id': 2,& & & &'title': u'Learn Python',& & & &'description': u'Need to find a good Python tutorial on the web',& & & &'done': False& &}]@app.route('/todo/api/v1.0/tasks', methods=['GET'])def get_tasks():& &return jsonify({'tasks': tasks})if __name__ == '__main__':& &app.run(debug=True)正如你所见,没有多大的变化。我们创建一个任务的内存数据库,这里无非就是一个字典和数组。数组中的每一个元素都具有上述定义的任务的属性。取代了首页,我们现在拥有一个 get_tasks 的函数,访问的 URI 为 /todo/api/v1.0/tasks,并且只允许 GET 的 HTTP 方法。这个函数的响应不是文本,我们使用 JSON 数据格式来响应,Flask 的 jsonify 函数从我们的数据结构中生成。使用网页浏览器来测试我们的 web service 不是一个最好的注意,因为网页浏览器上不能轻易地模拟所有的 HTTP 请求的方法。相反,我们会使用 curl。如果你还没有安装 curl 的话,请立即安装它。通过执行 app.py,启动 web service。接着打开一个新的控制台窗口,运行以下命令:$ curl -i http://localhost:5000/todo/api/v1.0/tasksHTTP/1.0 200 OKContent-Type: application/jsonContent-Length: 294Server: Werkzeug/0.8.3 Python/2.7.3Date: Mon, 20 May :53 GMT{&&tasks&: [& &{& & &&description&: &Milk, Cheese, Pizza, Fruit, Tylenol&,& & &&done&: false,& & &&id&: 1,& & &&title&: &Buy groceries&& &},& &{& & &&description&: &Need to find a good Python tutorial on the web&,& & &&done&: false,& & &&id&: 2,& & &&title&: &Learn Python&& &}&]}我们已经成功地调用我们的 RESTful service 的一个函数!现在我们开始编写 GET 方法请求我们的任务资源的第二个版本。这是一个用来返回单独一个任务的函数:from flask import abort@app.route('/todo/api/v1.0/tasks/&int:task_id&', methods=['GET'])def get_task(task_id):& &task = filter(lambda t: t['id'] == task_id, tasks)& &if len(task) == 0:& & & &abort(404)& &return jsonify({'task': task[0]})第二个函数有些意思。这里我们得到了 URL 中任务的 id,接着 Flask 把它转换成 函数中的 task_id 的参数。我们用这个参数来搜索我们的任务数组。如果我们的数据库中不存在搜索的 id,我们将会返回一个类似 404 的错误,根据 HTTP 规范的意思是 “资源未找到”。如果我们找到相应的任务,那么我们只需将它用 jsonify 打包成 JSON 格式并将其发送作为响应,就像我们以前那样处理整个任务集合。调用 curl 请求的结果如下:$ curl -i http://localhost:5000/todo/api/v1.0/tasks/2HTTP/1.0 200 OKContent-Type: application/jsonContent-Length: 151Server: Werkzeug/0.8.3 Python/2.7.3Date: Mon, 20 May :50 GMT{&&task&: {& &&description&: &Need to find a good Python tutorial on the web&,& &&done&: false,& &&id&: 2,& &&title&: &Learn Python&&}}$ curl -i http://localhost:5000/todo/api/v1.0/tasks/3HTTP/1.0 404 NOT FOUNDContent-Type: text/htmlContent-Length: 238Server: Werkzeug/0.8.3 Python/2.7.3Date: Mon, 20 May :52 GMT&!DOCTYPE HTML PUBLIC &-//W3C//DTD HTML 3.2 Final//EN&&&title&404 Not Found&/title&&h1&Not Found&/h1&&p&The requested URL was not found on the server.&/p&&p&If you & & entered the URL manually please check your spelling and try again.&/p&当我们请求 id #2 的资源时候,我们获取到了,但是当我们请求 #3 的时候返回了 404 错误。有关错误奇怪的是返回的是 HTML 信息而不是 JSON,这是因为 Flask 按照默认方式生成 404 响应。由于这是一个 Web service 客户端希望我们总是以 JSON 格式回应,所以我们需要改善我们的 404 错误处理程序:from flask import make_response@app.errorhandler(404)def not_found(error):& &return make_response(jsonify({'error': 'Not found'}), 404)我们会得到一个友好的错误提示:$ curl -i http://localhost:5000/todo/api/v1.0/tasks/3HTTP/1.0 404 NOT FOUNDContent-Type: application/jsonContent-Length: 26Server: Werkzeug/0.8.3 Python/2.7.3Date: Mon, 20 May :54 GMT{&&error&: &Not found&}接下来就是 POST 方法,我们用来在我们的任务数据库中插入一个新的任务:from flask import request@app.route('/todo/api/v1.0/tasks', methods=['POST'])def create_task():& &if not request.json or not 'title' in request.json:& & & &abort(400)& &task = {& & & &'id': tasks[-1]['id'] + 1,& & & &'title': request.json['title'],& & & &'description': request.json.get('description', &&),& & & &'done': False& &}& &tasks.append(task)& &return jsonify({'task': task}), 201添加一个新的任务也是相当容易地。只有当请求以 JSON 格式形式,request.json 才会有请求的数据。如果没有数据,或者存在数据但是缺少 title 项,我们将会返回 400,这是表示请求无效。接着我们会创建一个新的任务字典,使用最后一个任务的 id + 1 作为该任务的 id。我们允许 description 字段缺失,并且假设 done 字段设置成 False。我们把新的任务添加到我们的任务数组中,并且把新添加的任务和状态 201 响应给客户端。使用如下的 curl 命令来测试这个新的函数:$ curl -i -H &Content-Type: application/json& -X POST -d '{&title&:&Read a book&}' http://localhost:5000/todo/api/v1.0/tasksHTTP/1.0 201 CreatedContent-Type: application/jsonContent-Length: 104Server: Werkzeug/0.8.3 Python/2.7.3Date: Mon, 20 May :21 GMT{&&task&: {& &&description&: &&,& &&done&: false,& &&id&: 3,& &&title&: &Read a book&&}}注意:如果你在 Windows 上并且运行 Cygwin 版本的 curl,上面的命令不会有任何问题。然而,如果你使用原生的 curl,命令会有些不同:curl -i -H &Content-Type: application/json& -X POST -d &{&&&title&&&:&&&Read a book&&&}& http://localhost:5000/todo/api/v1.0/tasks当然在完成这个请求后,我们可以得到任务的更新列表:$ curl -i http://localhost:5000/todo/api/v1.0/tasksHTTP/1.0 200 OKContent-Type: application/jsonContent-Length: 423Server: Werkzeug/0.8.3 Python/2.7.3Date: Mon, 20 May :44 GMT{&&tasks&: [& &{& & &&description&: &Milk, Cheese, Pizza, Fruit, Tylenol&,& & &&done&: false,& & &&id&: 1,& & &&title&: &Buy groceries&& &},& &{& & &&description&: &Need to find a good Python tutorial on the web&,& & &&done&: false,& & &&id&: 2,& & &&title&: &Learn Python&& &},& &{& & &&description&: &&,& & &&done&: false,& & &&id&: 3,& & &&title&: &Read a book&& &}&]}剩下的两个函数如下所示:@app.route('/todo/api/v1.0/tasks/&int:task_id&', methods=['PUT'])def update_task(task_id):& &task = filter(lambda t: t['id'] == task_id, tasks)& &if len(task) == 0:& & & &abort(404)& &if not request.json:& & & &abort(400)& &if 'title' in request.json and type(request.json['title']) != unicode:& & & &abort(400)& &if 'description' in request.json and type(request.json['description']) is not unicode:& & & &abort(400)。设计一个简单的 web service坚持 REST 的准则设计一个 web service 或者 API 的任务就变成一个标识资源被展示出来以及它们是怎样受不同的请求方法影响的练习; & & & &nbsp。在 URL 中包含应用名称有助于提供一个命名空间以便区分同一系统上的其它服务。在 URL 中包含版本号能够帮助以后的更新,如果新版本中存在新的和潜在不兼容的功能,可以不影响依赖于较旧的功能的应用程序,我们只有任务,因此在我们待办事项中唯一的资源就是任务。我们的任务资源将要使用 HTTP 方法如下.com/api/ordersPUT & & & & & &nbsp。 资源可以用& & &nbsp.com/api/orders/123DELETE & & &nbsp://[hostname]/todo/api/v1.0/tasks & & & & & &==================================HTTP 方法 & 行为 & &===================== & & & & & 更新资源 & & & & &nbsp。HTTP 标准的方法有如下:========== &=============================================== &nbsp:========== &=============================================== &=============================HTTP 方法 & URL & & &动作========== &nbsp:// & &nbsp。在请求中数据可以以&JSON&形式; http:删除资源 & &nbsp。比如说,我们要编写一个待办事项应用程序而且我们想要为它设计一个 web service。要做的第一件事情就是决定用什么样的根 URL 来访问该服务。例如; & http://example.com/api/orders/123========== &====================== ==================================REST 设计不需要特定的数据格式;==============================GET & & & & & &nbsp,我们可以通过这个来访问://[hostname]/todo/api/v1.0/在这里我已经决定在 URL 中包含应用的名称以及 API 的版本号; & &===================== &nbsp:// & & & & & &nbsp, 服务器不会存储客户端上一次请求的信息用来给下一次使用; & &URI&来表示。客户端使用 HTTP 协议定义的方法来发送请求到这些 URIs,当然可能会导致这些被访问的”资源“状态的改变; 获取资源的信息 & & & &nbsp: 客户端和服务器之间隔离,服务器提供服务,客户端进行消费。无状态: 从客户端到服务器的每个请求都必须包含理解请求所必需的信息。换句话说。下一步骤就是选择将由该服务暴露(展示)的资源; & & & &nbsp://example.com/api/ordersGET & & & 示例========== &nbsp: 服务器必须明示客户端请求能否缓存。可缓存
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。15被浏览2,616分享邀请回答namespace enemy {
void first_blood(int id);
} // namespace enemy
void double_kill();
void double_kill(int killer);
class Silencer
std::string watch_and_learn();
包装之后大概是这样的:extern "C" {
void enemy_first_blood(int id)
enemy::first_blood(id);
void double_kill_by_roshan()
double_kill();
void double_kill_by_hero(int killer)
double_kill(killer);
void* new_silencer()
return new Sliencer;
void silencer_watch_and_learn(void *instacne, char *buffer)
std::string what = reinterpret_cast&Silencer*&(instance)-&watch_and_learn();
strcpy(buffer, what.c_str());
void release_silencer(void *instacne)
delete reinterpret_cast&Silencer*&(instance);
} // extern "C"
另外PyPy在搞一个,可以去看看能不能用。3添加评论分享收藏感谢收起写回答1381人阅读
阅读原文:
京东金融量化交流群:
写策略需要了解的语法包括两方面,一方面是语言本身的语法(包括相关库),另一方面是量化平台提供的api。量化平台提供的api帮助文件里都有了,大家可以很方便的在这个网址查看:。本文主要介绍写策略经常用到的库(datetime、numpy、pandas)中的一些函数。
1、 利用datetime库做日期、时间操作
利用context.now可以获得当前策略运行的时间,返回的是datetime.datetime格式。datetime.datetime格式可以很方便的进行日期、时间操作。比如timedelta可以很方便的在日期上做日、小时、分钟、秒的运算。例如,需要策略运行时间1天前的时间,可以这样写:context.now+datetime.timedelta(days=-1),返回的便是一天前的时间。
2、 利用pandas做数据变频。
量化平台一般只提供分钟或者日频的数据,如果我们需要周、月的数据怎么办呢?pandas的resample函数可以很好的解决这个问题。举个例子,假如我们需要沪深300每月最后一个交易日的收盘价,我们可以这样写:
d= get_history(100,'1d','close')[‘000300.SH’].resample(‘m’,how=’last’)
更多的关于pandas的内容,可以参考pandas的官网(链接:)以及“利用python进行数据分析”这本书(链接:
3、利用set格式选取交集
有的时候我们利用不同标准会得到不同的股票池,如果想得到不同股票池的共同股票,那么可以使用set格式。Set格式可以很方便的进行交集、并集等集合运算。这里举一个例子,比如我们通过设置一定的财务数据条件会得到一个dataframe,记作df。df的列为股票代码,但可能并不都是我们所需的,比如我们只想得到沪深300的成份股,那么可以这样操作:1、s=get_index_constituents(‘000300.SH’) 得到沪深300的成份股。2、z=set(s) & set(df.columns) 得到交集z。3、得到的z是set格式,需要转换为list格式,可以这样操作
zl=list(z)。4、利用pandas 函数 筛选出我们需要的个股 d=df.loc[:zl] d即位我们所需要的数据。
更多的关于set格式的使用方法,可以参考:
4、 利用try…except跳过出错部分代码
有时候我们会遇到一些不是很重要的问题,但是由于遇到这类问题会报错,从而影响程序执行,这时我们希望的是忽略这些错误就可以了。下面举一个例子说明try…except 的用法。
比如:我们用p表示一只股票某一时刻的价格,v表示这只股票的成交量,我们想计算p/v,但是有可能该股票没有成交量(停牌,或者涨跌停了)这时直接计算就会出错,程序会跳出。这是我们可以try…except做如下处理:
except:d=0
意思就是如果计算p/v发生错误,那么就将d赋值为0
5、 利用pickle模块保存变量
有时候我们需要将当前工作空间的变量保存下来,这时可以使用pickle来解决,举个例子,假如目前工作空间有a,b,c三个变量,我们可以进行如下操作:1、f=open(‘file.pkl’,’wb’) 建立一个文件链接。2、pickle.dump([a,b,c],f) 这样就可以保存了。读取时1、f=open(‘file.pkl’,’rb’) 2、z=pickle.load([a,b,c],f) 这样将读取的变量都保存到了z变量中,通过z[0],z[1],z[2]可以获取a,b,c变量。
阅读原文:他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 api函数怎么使用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信