This Gist hosts the code from my talk and brief coding session at Plotcon.
- tick data server with ZeroMQ
- tick data client with ZeroMQ
- tick data plotting with plotly
- Flask app embedding the streaming plot
Slides under http://hilpisch.com/plotcon.pdf
This Gist hosts the code from my talk and brief coding session at Plotcon.
Slides under http://hilpisch.com/plotcon.pdf
# | |
# Tick Data Server | |
# | |
import zmq | |
import time | |
import random | |
context = zmq.Context() | |
socket = context.socket(zmq.PUB) | |
socket.bind('tcp://0.0.0.0:5555') | |
AMZN = 100. | |
while True: | |
AMZN += random.gauss(0, 1) * 0.5 | |
msg = 'AMZN %s' % AMZN | |
socket.send_string(msg) | |
print(msg) | |
time.sleep(random.random() * 2) |
# | |
# Tick Data Client | |
# | |
import zmq | |
import datetime | |
context = zmq.Context() | |
socket = context.socket(zmq.SUB) | |
socket.connect('tcp://0.0.0.0:5555') | |
socket.setsockopt_string(zmq.SUBSCRIBE, '') | |
while True: | |
msg = socket.recv_string() | |
t = datetime.datetime.now() | |
print(str(t) + ' | ' + msg) |
# | |
# Tick Data Plot | |
# | |
import zmq | |
import datetime | |
import plotly.plotly as ply | |
from plotly.graph_objs import * | |
import plotly.tools as pls | |
stream_ids = pls.get_credentials_file()['stream_ids'] | |
# socket | |
context = zmq.Context() | |
socket = context.socket(zmq.SUB) | |
socket.connect('tcp://0.0.0.0:5555') | |
socket.setsockopt_string(zmq.SUBSCRIBE, '') | |
# plotly | |
s = Stream(maxpoints=100, token=stream_ids[0]) | |
t = Scatter(x=[], y=[], name='tick data', mode='lines+markers', stream=s) | |
d = Data([t]) | |
l = Layout(title='Tick Data Stream') | |
f = Figure(data=d, layout=l) | |
ply.plot(f, filename='plotcon', auto_open=True) | |
st = ply.Stream(stream_ids[0]) | |
st.open() | |
while True: | |
msg = socket.recv_string() | |
t = datetime.datetime.now() | |
sym, value = msg.split() | |
print(str(t) + ' | ' + msg) | |
st.write({'x': t, 'y': float(value)}) |
# | |
# Flask Hello World | |
# | |
from flask import Flask | |
app = Flask(__name__) | |
@app.route('/') | |
def hello_world(): | |
return '<iframe src="https://plot.ly/~yves/1041/tick-data-stream/" width="750px" height="550px"></iframe>' | |
if __name__ == '__main__': | |
app.run(port=9999, debug=True) |