WEBVTT 00:00:00.000 --> 00:00:03.360 - Hello, YouTube. 00:00:03.360 --> 00:00:04.680 Hello, James. 00:00:04.680 --> 00:00:07.160 - Michael, thank you for having me. 00:00:07.160 --> 00:00:08.000 - Yeah, it's great to be here. 00:00:08.000 --> 00:00:09.960 Are you ready to kick this podcast off? 00:00:09.960 --> 00:00:10.800 - Let's do it. 00:00:10.800 --> 00:00:11.620 - All right, awesome. 00:00:11.620 --> 00:00:13.460 People out there watching, please throw in some questions, 00:00:13.460 --> 00:00:15.440 comments, feedback in the live chat. 00:00:15.440 --> 00:00:17.640 If you're watching later, well, there is no live chat 00:00:17.640 --> 00:00:19.680 'cause it's in the past, but thanks for watching anyway. 00:00:19.680 --> 00:00:23.600 All right, James, welcome to Talk Bythonomy. 00:00:23.600 --> 00:00:25.560 - Yeah, no, thank you so much for having us. 00:00:25.560 --> 00:00:28.280 I'm looking forward to the next hour or so. 00:00:28.280 --> 00:00:30.300 - Yeah, so am I. 00:00:30.300 --> 00:00:33.460 I ran across OpenBB not too long ago. 00:00:33.460 --> 00:00:34.780 I talked about it on my other podcast, 00:00:34.780 --> 00:00:36.580 Python Bytes, I do with Brian Okken. 00:00:36.580 --> 00:00:40.180 We cover like interesting projects and news and whatnot. 00:00:40.180 --> 00:00:42.060 I'm like, dang, this thing is, 00:00:42.060 --> 00:00:45.380 this thing is loaded with the Python data science stack. 00:00:45.380 --> 00:00:49.220 And on top of that, it's a newly, 00:00:49.220 --> 00:00:53.140 really successful open source project 00:00:53.140 --> 00:00:57.660 in the sort of business VC space as well. 00:00:57.660 --> 00:01:01.560 So congratulations on building a project and on that. 00:01:01.560 --> 00:01:03.880 And I think people are gonna be pretty fascinated 00:01:03.880 --> 00:01:05.240 to hear the story behind it. 00:01:05.240 --> 00:01:06.800 - Yeah, thank you so much. 00:01:06.800 --> 00:01:07.700 - Yeah, you bet. 00:01:07.700 --> 00:01:10.000 Before we get to the story of OpenBB, 00:01:10.000 --> 00:01:11.960 let's get to the story of James. 00:01:11.960 --> 00:01:13.920 How'd you get into programming Python? 00:01:13.920 --> 00:01:18.920 - So I've only been in Python for a couple years. 00:01:18.920 --> 00:01:22.320 My background, I'm, along with OpenBB, 00:01:22.320 --> 00:01:25.440 I'm a PhD student at University of Maryland Physics. 00:01:27.200 --> 00:01:29.800 Got into Python when I was getting bored of MATLAB. 00:01:29.800 --> 00:01:34.300 So started taking an interest 00:01:34.300 --> 00:01:37.460 in some machine learning, data science. 00:01:37.460 --> 00:01:39.360 Python seemed to be the way to go. 00:01:39.360 --> 00:01:41.340 It was super straightforward. 00:01:41.340 --> 00:01:44.420 A lot of similarities with MATLAB, 00:01:44.420 --> 00:01:47.180 especially NumPy, PyPlot. 00:01:47.180 --> 00:01:49.460 So it was straightforward, never looked back. 00:01:49.460 --> 00:01:50.300 - That's awesome. 00:01:50.300 --> 00:01:54.180 Yeah, the Jupyter side, data science side of Python 00:01:54.180 --> 00:01:56.260 is quite similar to MATLAB. 00:01:56.260 --> 00:01:58.340 Although it's a slightly cleaner language, 00:01:58.340 --> 00:02:00.460 starts with zero, not one on the indexes. 00:02:00.460 --> 00:02:02.540 - It does. 00:02:02.540 --> 00:02:06.300 And MATLAB, their attempt at Jupyter 00:02:06.300 --> 00:02:09.060 is not exactly where Jupyter is yet. 00:02:09.060 --> 00:02:12.180 - So they had a head start, right? 00:02:12.180 --> 00:02:15.260 I mean, MATLAB predates Jupyter by a long ways. 00:02:15.260 --> 00:02:18.660 - Yeah, well, their live editor is only a couple years old. 00:02:18.660 --> 00:02:19.480 - Okay. 00:02:19.480 --> 00:02:21.820 - Or at least a couple years old to me. 00:02:21.820 --> 00:02:22.660 - Yeah, yeah, sure. 00:02:22.660 --> 00:02:23.980 It probably is. 00:02:23.980 --> 00:02:26.700 My last experience with MATLAB was 00:02:26.700 --> 00:02:27.980 when I was in grad school as well, 00:02:27.980 --> 00:02:30.860 which has been a while. 00:02:30.860 --> 00:02:34.060 So it's a little bit back there. 00:02:34.060 --> 00:02:34.900 Awesome. 00:02:34.900 --> 00:02:36.880 Well, that sounds like really fun. 00:02:36.880 --> 00:02:39.980 I guess you started playing with Jupyter 00:02:39.980 --> 00:02:43.060 and the various data science tools for physics, right? 00:02:43.060 --> 00:02:45.020 Not for finance. 00:02:45.020 --> 00:02:46.060 - Correct. 00:02:46.060 --> 00:02:46.900 Correct. 00:02:46.900 --> 00:02:49.700 It was, you know, NumPy, all that fun stuff 00:02:49.700 --> 00:02:53.820 for doing some physics, SciPy calculations. 00:02:53.820 --> 00:02:56.660 - I did go right into the machine learning Kaggle 00:02:56.660 --> 00:03:00.660 fantastic exercise, really actually my first dive 00:03:00.660 --> 00:03:03.820 into Python, I love doing these NFL challenges 00:03:03.820 --> 00:03:05.120 that they have every year. 00:03:05.120 --> 00:03:08.220 So that was where I first fell in love 00:03:08.220 --> 00:03:09.900 with the language, if you will. 00:03:09.900 --> 00:03:11.780 - The NFL's challenge sounds really interesting. 00:03:11.780 --> 00:03:13.520 I've seen some Kaggle challenges 00:03:13.520 --> 00:03:15.860 and done other similar type of challenges, 00:03:15.860 --> 00:03:18.600 but I'm not familiar with this one, tell us about it. 00:03:18.600 --> 00:03:20.660 - So every year it seems like they, 00:03:20.660 --> 00:03:23.500 actually they have a couple as far as I know. 00:03:23.500 --> 00:03:25.060 they usually do like an analytics one 00:03:25.060 --> 00:03:27.100 where you got to present some kind of notebook 00:03:27.100 --> 00:03:28.740 and then a numeric one, 00:03:28.740 --> 00:03:30.940 think of you're watching Sunday football AWS, 00:03:30.940 --> 00:03:34.300 which actually if you got my bills flag in the background. 00:03:34.300 --> 00:03:39.340 So this particular one that I started on, 00:03:39.340 --> 00:03:40.260 you were looking at, 00:03:40.260 --> 00:03:44.060 you were given the information at a given point in time 00:03:44.060 --> 00:03:47.620 and you were to estimate using whatever machine learning, 00:03:47.620 --> 00:03:50.260 not machine learning, how far the runner would go. 00:03:51.180 --> 00:03:52.540 And so that was a great introduction, 00:03:52.540 --> 00:03:57.540 Voronoi regions and decision trees, all that fun stuff. 00:03:57.540 --> 00:04:01.420 - I think those kinds of challenges are really interesting 00:04:01.420 --> 00:04:04.820 because they don't require you to be 00:04:04.820 --> 00:04:09.380 developer or code enthusiasts. 00:04:09.380 --> 00:04:11.860 You can just be excited about football 00:04:11.860 --> 00:04:14.740 and it could drag you into programming 00:04:14.740 --> 00:04:16.400 instead of the other way around. 00:04:16.400 --> 00:04:17.700 - Yeah, actually the way that I did it, 00:04:17.700 --> 00:04:23.240 And I don't think I did, I didn't do too great on the challenge, you know, no medals or anything, 00:04:23.240 --> 00:04:29.360 but I actually treated it as a physics problem as a, all the players as a gas particles and 00:04:29.360 --> 00:04:30.360 this fun, fun stuff. 00:04:30.360 --> 00:04:32.960 So there really wasn't any machine learning there. 00:04:32.960 --> 00:04:33.960 Yeah. 00:04:33.960 --> 00:04:34.960 But interesting. 00:04:34.960 --> 00:04:39.680 And just sidebar, I gotta say the Chiefs, Bills, I'm a Chiefs fan, grew up in Kent City. 00:04:39.680 --> 00:04:42.920 Gotta say that was one, that's probably the best game of all last year out of all the 00:04:42.920 --> 00:04:43.920 games. 00:04:43.920 --> 00:04:45.640 That was, that's the best game of all time. 00:04:45.640 --> 00:04:50.320 I mean, I mean, maybe not a little painful if you're on the bill side, but wow, what 00:04:50.320 --> 00:04:51.320 an insane game. 00:04:51.320 --> 00:04:52.320 All right. 00:04:52.320 --> 00:04:55.480 I don't want to make it a football show, but boy, that was, that was the highlight of the 00:04:55.480 --> 00:04:56.480 entire year. 00:04:56.480 --> 00:05:00.800 I think actually, well, low light, low light on my side. 00:05:00.800 --> 00:05:01.800 Yeah. 00:05:01.800 --> 00:05:05.480 Cause for those who don't know, basically the, the chiefs came back and beat the bills 00:05:05.480 --> 00:05:10.480 in the last like minute and a half in some insane way, which is unfortunate, but it was 00:05:10.480 --> 00:05:11.480 really exciting. 00:05:11.480 --> 00:05:12.480 All right. 00:05:12.480 --> 00:05:13.560 Final, final background question. 00:05:13.560 --> 00:05:15.480 What kind of physics did you study? 00:05:15.480 --> 00:05:19.120 - So I do atomic, molecular, and optical, 00:05:19.120 --> 00:05:22.480 particularly cold atoms and optical lattices, 00:05:22.480 --> 00:05:26.000 Fouquet periodically driving, this kind of stuff. 00:05:26.000 --> 00:05:28.080 - Cool, that sounds awesome. 00:05:28.080 --> 00:05:31.800 All right, well, let's talk about this, 00:05:31.800 --> 00:05:34.680 the space of these things, this thing you've created here. 00:05:34.680 --> 00:05:39.680 So what you've created is something called OpenBB, 00:05:39.680 --> 00:05:44.400 which described as the most affordable, 00:05:44.400 --> 00:05:49.400 advanced, open, customizable investment research platform. 00:05:49.400 --> 00:05:54.220 And to me, from the outside, 00:05:54.220 --> 00:05:55.680 not having a ton of experience, 00:05:55.680 --> 00:06:00.360 this looks like maybe a competitor to a Bloomberg terminal, 00:06:00.360 --> 00:06:04.800 which I hear is required basically 00:06:04.800 --> 00:06:07.760 if you're a stock trader, an investor, 00:06:07.760 --> 00:06:12.560 that's doing sort of real-time interaction with the market. 00:06:12.560 --> 00:06:16.720 Yeah, yeah, so, I do have to take a step back as well and say that 00:06:16.720 --> 00:06:19.440 uh, the 00:06:19.440 --> 00:06:22.880 founder of this program, or this project didier 00:06:22.880 --> 00:06:27.760 Um, you know, he's the one with the real insight. I was just lucky enough to join on early 00:06:27.760 --> 00:06:34.400 Um to build a lot of this with him. he spent his christmas, uh coding this and you know 00:06:34.400 --> 00:06:39.120 from there, but but to but to talk a little bit about it, yeah, so the 00:06:40.080 --> 00:06:42.320 I don't like to call us a Bloomberg competitor. 00:06:42.320 --> 00:06:45.680 You know, Bloomberg has been in the game for quite a long time. 00:06:45.680 --> 00:06:46.400 They're very advanced. 00:06:46.400 --> 00:06:48.480 They have all the markets and whatnot. 00:06:48.480 --> 00:06:48.800 Sure. 00:06:48.800 --> 00:06:51.040 But people will say, well, do you have this one feature? 00:06:51.040 --> 00:06:51.760 Well, then we can't. 00:06:51.760 --> 00:06:54.240 You know, I guess it's not like a competitor because it has that other. 00:06:54.240 --> 00:06:55.040 Yeah, sure. 00:06:55.040 --> 00:06:59.040 But from a really high level perspective, it kind of is in that realm, right? 00:06:59.040 --> 00:07:01.040 Right, right, right. 00:07:01.040 --> 00:07:02.160 At a high level, yes. 00:07:02.160 --> 00:07:04.800 We're trying to achieve a lot of the same goals, right? 00:07:04.800 --> 00:07:05.760 Investment research. 00:07:05.760 --> 00:07:07.520 That's free. 00:07:07.520 --> 00:07:08.720 Open source. 00:07:08.720 --> 00:07:11.840 and available to anyone. 00:07:11.840 --> 00:07:15.400 We want to target the people who can't drop 25 grand a year 00:07:15.400 --> 00:07:17.780 for the terminal. 00:07:17.780 --> 00:07:18.760 - Yeah. 00:07:18.760 --> 00:07:20.520 Well, what's interesting to me, 00:07:20.520 --> 00:07:25.520 what struck me about this is it's not just, 00:07:25.520 --> 00:07:28.960 here's an open source version, 00:07:28.960 --> 00:07:30.400 or here's a free version, 00:07:30.400 --> 00:07:34.220 or a cheaper version that would be something of a stand-in 00:07:34.220 --> 00:07:35.200 for that type of thing. 00:07:35.200 --> 00:07:39.000 but here is something that is from the ground up 00:07:39.000 --> 00:07:42.280 embracing all of these data science tools 00:07:42.280 --> 00:07:45.680 and libraries from the Python space. 00:07:45.680 --> 00:07:49.920 So to me, this looks like a completely customizable, 00:07:49.920 --> 00:07:51.540 programmable, extendable thing 00:07:51.540 --> 00:07:53.620 for people who have Python skills. 00:07:53.620 --> 00:07:56.480 And in that way, it's massively better 00:07:56.480 --> 00:07:59.560 than a lot of these commercial projects, right? 00:07:59.560 --> 00:08:02.080 - That's exactly it, right? 00:08:02.080 --> 00:08:04.040 So Bloomberg is the big name in this space. 00:08:04.040 --> 00:08:06.000 You got your icons, your refinitives. 00:08:06.000 --> 00:08:08.040 There's a lot of great other tools. 00:08:08.040 --> 00:08:11.200 You got coinfinmoney.net terminals out there. 00:08:11.200 --> 00:08:14.120 But none of them provide the level of customization 00:08:14.120 --> 00:08:15.580 and open source that we do. 00:08:15.580 --> 00:08:19.400 As you said, it's super Python based. 00:08:19.400 --> 00:08:22.160 The reason we chose Python is that's up and coming. 00:08:22.160 --> 00:08:24.400 Everyone in data science seems to be learning it. 00:08:24.400 --> 00:08:28.600 Finance is very embedded in Excel. 00:08:29.660 --> 00:08:34.660 And there's some shift towards more Python learning 00:08:34.660 --> 00:08:36.000 in the space. 00:08:36.000 --> 00:08:38.420 So doing this in Python, as you said, 00:08:38.420 --> 00:08:39.740 is super customizable. 00:08:39.740 --> 00:08:41.280 You can do it the way, you know, 00:08:41.280 --> 00:08:44.900 you can add on very easily, fork it, add on a feature, 00:08:44.900 --> 00:08:49.900 add on your own datasets, and pretty user-friendly. 00:08:49.900 --> 00:08:51.100 - Yeah, absolutely. 00:08:51.100 --> 00:08:54.740 You know, just to sort of back up what you're saying, 00:08:54.740 --> 00:08:58.640 pre-COVID, I was hired by an investment firm 00:08:58.640 --> 00:09:01.520 to actually spend time with their day traders. 00:09:01.520 --> 00:09:02.880 And it was weird because they're like, 00:09:02.880 --> 00:09:05.200 well, they can't be away from their desk 00:09:05.200 --> 00:09:06.080 when the market is open. 00:09:06.080 --> 00:09:09.120 So this class has to start at 4.30 or 5 p.m. 00:09:09.120 --> 00:09:11.480 and then go for a little afterwards. 00:09:11.480 --> 00:09:14.280 So it was an interesting setup, but it was just that. 00:09:14.280 --> 00:09:17.180 It was a bunch of traders who were using Excel 00:09:17.180 --> 00:09:19.680 to try to figure out how well they were doing. 00:09:19.680 --> 00:09:21.920 And then a couple of people on the team were like, 00:09:21.920 --> 00:09:25.080 we have to learn Python, we have to get better tools. 00:09:25.080 --> 00:09:27.580 So I went and helped them learn Python 00:09:27.580 --> 00:09:30.020 so that they could stop using Excel and start using Python. 00:09:30.020 --> 00:09:34.300 It's absolutely where a lot of this momentum is going. 00:09:34.300 --> 00:09:36.900 - Yeah, and I think that they complement each other 00:09:36.900 --> 00:09:39.140 very well, you know, pandas. 00:09:39.140 --> 00:09:40.300 I don't think anyone can say enough 00:09:40.300 --> 00:09:41.340 about how great pandas is. 00:09:41.340 --> 00:09:44.000 You know, you can enter in all of your, 00:09:44.000 --> 00:09:46.140 whatever your trades are, whatever your research is, 00:09:46.140 --> 00:09:48.860 and it's right in a Jupyter notebook in one line. 00:09:48.860 --> 00:09:50.540 - Yeah, yeah, absolutely. 00:09:50.540 --> 00:09:51.540 Not to say stop using it, 00:09:51.540 --> 00:09:54.300 but there's a ton of stuff happening 00:09:54.300 --> 00:09:57.820 in the financial space around Python. 00:09:57.820 --> 00:10:00.120 And I do believe that Pandas actually came out 00:10:00.120 --> 00:10:03.060 of investment out of Wall Street. 00:10:03.060 --> 00:10:05.740 I'm not 100% sure, but I think that's the history. 00:10:05.740 --> 00:10:08.780 So let's start with open source, right? 00:10:08.780 --> 00:10:12.460 So we could go to the website. 00:10:12.460 --> 00:10:16.780 Your website is openbb.co, fan of the .co. 00:10:16.780 --> 00:10:18.240 We don't need that M. 00:10:18.240 --> 00:10:23.100 But we can go over to GitHub here and there it is. 00:10:23.100 --> 00:10:25.700 we can fork it, do whatever we want. 00:10:25.700 --> 00:10:27.140 Let's see, what is your license? 00:10:27.140 --> 00:10:30.860 It's MIT, which is like go crazy sort of thing, right? 00:10:30.860 --> 00:10:32.580 - Yeah, we're permissive. 00:10:32.580 --> 00:10:34.840 Feel free to do whatever you want with it. 00:10:34.840 --> 00:10:38.740 - Yeah, it's really nice. 00:10:38.740 --> 00:10:41.140 Even commercial uses the MIT license has. 00:10:41.140 --> 00:10:42.740 But what stood out most to me 00:10:42.740 --> 00:10:44.300 when I thought, oh, this is really interesting. 00:10:44.300 --> 00:10:45.420 And then I looked at this, I'm like, 00:10:45.420 --> 00:10:48.380 oh, this actually has a lot of momentum here. 00:10:48.380 --> 00:10:53.380 is you've got 12,000 stars and 1.3 thousand forks, right? 00:10:53.380 --> 00:10:56.020 That's a lot for any project. 00:10:56.020 --> 00:11:00.020 I mean, we're on par with some of the big web frameworks 00:11:00.020 --> 00:11:02.420 not long ago and stuff like that. 00:11:02.420 --> 00:11:04.500 You all must be really happy with the uptake 00:11:04.500 --> 00:11:05.980 that it's getting. 00:11:05.980 --> 00:11:09.780 - Yeah, the community response has been overwhelming. 00:11:09.780 --> 00:11:12.680 When I joined on, it was a couple thousand stars. 00:11:12.680 --> 00:11:16.220 Didier and I, you know, we've fired up Discord. 00:11:16.220 --> 00:11:21.220 We were hitting Reddit with posts weekly, monthly, 00:11:21.220 --> 00:11:25.020 and it took very well. 00:11:25.020 --> 00:11:27.760 People were very excited and we're super thankful 00:11:27.760 --> 00:11:31.400 for the community that's gotten us to where we are. 00:11:31.400 --> 00:11:32.240 - Yeah. 00:11:32.240 --> 00:11:36.380 I guess one thing I would maybe, 00:11:36.380 --> 00:11:38.100 that's not what I was hoping to happen. 00:11:38.100 --> 00:11:41.540 I guess one thing I maybe would like to see possibly, 00:11:41.540 --> 00:11:43.020 I think what would be really fun 00:11:43.020 --> 00:11:44.380 is maybe you could just talk us through 00:11:44.380 --> 00:11:46.820 what the experience of using this is, 00:11:46.820 --> 00:11:50.860 because it's an unusual UI. 00:11:50.860 --> 00:11:52.740 And I don't mean that like, oh, it's weird, 00:11:52.740 --> 00:11:55.440 but it's just, it's not a webpage. 00:11:55.440 --> 00:11:58.700 It's not a Jupyter notebook. 00:11:58.700 --> 00:12:03.700 It's, imagine pretty much exactly opening up iTerm 00:12:03.700 --> 00:12:04.700 or terminal. 00:12:04.700 --> 00:12:06.860 - Yeah, it's a terminal. 00:12:06.860 --> 00:12:09.780 - And it's weird in like, in very much the sense 00:12:09.780 --> 00:12:10.620 that it's as a terminal, 00:12:10.620 --> 00:12:13.340 it means it runs as a Tui, 00:12:13.340 --> 00:12:16.460 a text-based user interface type thing. 00:12:16.460 --> 00:12:20.820 But then as you do reports and interact with it 00:12:20.820 --> 00:12:25.820 through a CLI style or almost of a IPython style experience, 00:12:25.820 --> 00:12:31.900 it pops up windows of really beautiful interactive graphs, 00:12:31.900 --> 00:12:33.980 the various things you're asking for. 00:12:33.980 --> 00:12:35.980 Can you give people a sense of what it's like to use? 00:12:35.980 --> 00:12:37.700 What's the user experience there? 00:12:37.700 --> 00:12:42.580 Yeah, so the terminal is a command line interface tool. 00:12:42.580 --> 00:12:47.860 So you open it, you launch it, python terminal.py, 00:12:47.860 --> 00:12:51.900 and you're presented with a list of choices. 00:12:51.900 --> 00:12:53.140 So we call these contexts. 00:12:53.140 --> 00:12:57.740 That's either going to be your stocks or your crypto ETFs. 00:12:57.740 --> 00:13:01.140 We provide a lot of data. 00:13:01.140 --> 00:13:03.700 And in order to access these, you type in. 00:13:03.700 --> 00:13:05.420 It's one of these old video games 00:13:05.420 --> 00:13:07.620 where you got to type in what you want. 00:13:07.620 --> 00:13:11.160 So if you want to go into stocks, you type in stocks, 00:13:11.160 --> 00:13:13.700 and then you're presented with a new menu. 00:13:13.700 --> 00:13:20.940 So you hit it exactly how it is, that it's completely textual. 00:13:20.940 --> 00:13:24.740 All of our commands have additional options flags 00:13:24.740 --> 00:13:25.500 as well. 00:13:25.500 --> 00:13:27.780 Our documentation for some of these functions 00:13:27.780 --> 00:13:30.540 is listed on our GitHub page. 00:13:30.540 --> 00:13:33.540 We're trying to really enhance the user experience in terms 00:13:33.540 --> 00:13:35.380 of guides and documentation, since we 00:13:35.380 --> 00:13:40.820 do know that this is a very unusual user experience. 00:13:40.820 --> 00:13:42.620 As you said, it's not a website. 00:13:42.620 --> 00:13:44.620 There's nothing to click. 00:13:44.620 --> 00:13:48.180 It's all textual-based, which we understand is going to be-- 00:13:48.180 --> 00:13:51.260 not everyone using this product is 00:13:51.260 --> 00:13:55.740 going to be familiar with the command line interface. 00:13:55.740 --> 00:13:58.900 And our team, we actually like to call it hacker man, 00:13:58.900 --> 00:14:03.260 because you feel like you're using it. 00:14:03.260 --> 00:14:07.180 doing your financial research, you feel kind of hackery. 00:14:07.180 --> 00:14:08.020 - Yeah, absolutely. 00:14:08.020 --> 00:14:12.020 You're just, you're typing away stuff is streaming by, 00:14:12.020 --> 00:14:17.020 you know, it's so funny to have normal people 00:14:17.020 --> 00:14:20.960 who are not coders watch people doing stuff with terminals, 00:14:20.960 --> 00:14:22.420 especially if there's colors. 00:14:22.420 --> 00:14:25.460 They think something nefarious is going on 00:14:25.460 --> 00:14:26.980 or something crazy is going on. 00:14:26.980 --> 00:14:29.700 'Cause that's how it's always represented for hackers. 00:14:29.700 --> 00:14:31.760 I remember somebody asked me at a coffee shop, 00:14:31.760 --> 00:14:34.580 I had like five terminal windows all running scripts 00:14:34.580 --> 00:14:35.420 with stuff scrolling by. 00:14:35.420 --> 00:14:36.720 Like, are you trying to hack the coffee shop? 00:14:36.720 --> 00:14:37.680 Like, no, I'm just working. 00:14:37.680 --> 00:14:39.720 Don't interrupt me, please. 00:14:39.720 --> 00:14:42.180 I'm not hacking anyone, leave me alone. 00:14:42.180 --> 00:14:43.600 Yeah, it kind of has that feel, right? 00:14:43.600 --> 00:14:46.640 But it also, something that I think that speaks to 00:14:46.640 --> 00:14:49.320 is like the seriousness and the real, 00:14:49.320 --> 00:14:51.200 like this is for people who are trying to do real work. 00:14:51.200 --> 00:14:52.440 It doesn't come up and just go, 00:14:52.440 --> 00:14:54.460 like here's some buttons you can click and it's flashy. 00:14:54.460 --> 00:14:56.900 It's like, you gotta get in there, 00:14:56.900 --> 00:15:00.560 focus on the various aspects, 00:15:00.560 --> 00:15:03.160 whether you're doing stocks or whatever it is 00:15:03.160 --> 00:15:04.120 and learn the commands, 00:15:04.120 --> 00:15:06.300 but then you should be able to fly through it, right? 00:15:06.300 --> 00:15:07.880 - Yeah, and we actually, 00:15:07.880 --> 00:15:10.200 one of the things that we spent a little bit of time on 00:15:10.200 --> 00:15:12.520 earlier this year was making it 00:15:12.520 --> 00:15:14.800 so that you can actually chain commands, right? 00:15:14.800 --> 00:15:18.140 You can, if you know what your workflow is, 00:15:18.140 --> 00:15:19.800 you can either run it through a script, 00:15:19.800 --> 00:15:23.400 so you can basically go into the terminal, 00:15:23.400 --> 00:15:27.020 set up what we call an OpenBB file. 00:15:27.020 --> 00:15:28.520 You know, every morning what you do, 00:15:28.520 --> 00:15:31.320 you go, you do stocks, you look at, I don't know, 00:15:31.320 --> 00:15:33.400 the top gainers, and then you look at 00:15:33.400 --> 00:15:34.860 what Apple's volume was yesterday. 00:15:34.860 --> 00:15:36.800 You can put this all in a script, run it, 00:15:36.800 --> 00:15:38.660 go fire up your coffee, come back, 00:15:38.660 --> 00:15:40.600 and you've got all your graphs, 00:15:40.600 --> 00:15:42.320 you've got all of your tables, 00:15:42.320 --> 00:15:45.760 and really simplifying the workflow. 00:15:45.760 --> 00:15:46.820 And then when you're done with that, 00:15:46.820 --> 00:15:48.660 if you forgot something in one line, 00:15:48.660 --> 00:15:50.160 you know what it is, you can type in, 00:15:50.160 --> 00:15:52.420 you can do a backslash stocks, 00:15:52.420 --> 00:15:55.280 load in your ticker and whatever you want. 00:15:55.280 --> 00:15:57.840 So as you said, once you know the terminal, 00:15:57.840 --> 00:15:59.620 it's really easy to hop around. 00:15:59.620 --> 00:16:01.860 - Yeah, that's awesome. 00:16:01.860 --> 00:16:05.640 Now, before we talk about some of the features 00:16:05.640 --> 00:16:06.900 and some of the things you can do, 00:16:06.900 --> 00:16:09.380 because I think I'll point people 00:16:09.380 --> 00:16:10.820 to the right part on your website, 00:16:10.820 --> 00:16:13.300 but once you see what you've got here, 00:16:13.300 --> 00:16:16.260 it's like, wow, this has a bunch 00:16:16.260 --> 00:16:18.420 of great visualizations and so on. 00:16:18.420 --> 00:16:22.500 But let's just talk about some of the Python libraries 00:16:22.500 --> 00:16:23.500 that are available. 00:16:23.500 --> 00:16:25.020 It sounds like a lot of the big hitters 00:16:25.020 --> 00:16:29.660 from the data science and machine learning space are there? 00:16:29.660 --> 00:16:31.260 - Very much so, right? 00:16:31.260 --> 00:16:35.180 So the number one library we pretty much use 00:16:35.180 --> 00:16:36.940 is gonna be requests. 00:16:36.940 --> 00:16:39.220 You know, we're hitting APIs, 00:16:39.220 --> 00:16:40.940 turning those into data frames, 00:16:40.940 --> 00:16:45.300 you know, reading HTMLs, displaying. 00:16:45.300 --> 00:16:46.140 Yeah, so. 00:16:46.140 --> 00:16:47.780 - All right, before we move on from requests, 00:16:47.780 --> 00:16:51.660 because a request is a very cool library, 00:16:51.660 --> 00:16:54.180 but it also opens up the question of 00:16:54.180 --> 00:16:55.300 where does requests go? 00:16:55.300 --> 00:16:59.660 Like it looks like there's tons of real-time data here. 00:16:59.660 --> 00:17:01.740 And I know that financial data, 00:17:01.740 --> 00:17:03.140 especially in the real-time variation 00:17:03.140 --> 00:17:05.140 can be tricky to get ahold of, 00:17:05.140 --> 00:17:07.760 or maybe not tricky, but requires money. 00:17:07.760 --> 00:17:09.980 - This is a very good-- 00:17:09.980 --> 00:17:12.580 - That's some variant of tricky, isn't it? 00:17:12.580 --> 00:17:15.540 - That is, and actually you do raise a very good point. 00:17:15.540 --> 00:17:20.340 So in the terminal, we do provide different endpoints 00:17:20.340 --> 00:17:23.700 for different sources. 00:17:23.700 --> 00:17:26.100 So for example, if you want to load in stocks, 00:17:26.100 --> 00:17:28.140 you can either go from Yahoo Finance, 00:17:28.140 --> 00:17:29.980 you can go from an Alpha Vantage, 00:17:29.980 --> 00:17:33.300 or you can go from Polygon or IEX Cloud. 00:17:33.300 --> 00:17:37.380 All of these require your own API key. 00:17:37.380 --> 00:17:40.880 So in order to-- part of the onboarding into the terminal 00:17:40.880 --> 00:17:43.820 is to explore all the data sources we have available. 00:17:43.820 --> 00:17:45.580 Go get your API keys. 00:17:45.580 --> 00:17:47.620 And we do have-- 00:17:47.620 --> 00:17:50.300 we try to keep it free, but we are 00:17:50.300 --> 00:17:53.340 starting to incorporate some more kind of paid, 00:17:53.340 --> 00:17:56.020 you know, endpoints that can be paid. 00:17:56.020 --> 00:17:56.860 - Right, right. 00:17:56.860 --> 00:17:59.460 So if somebody already has a subscription 00:17:59.460 --> 00:18:01.840 to some data source, 00:18:01.840 --> 00:18:03.660 why not let them integrate that, right? 00:18:03.660 --> 00:18:05.380 - Exactly, that's exactly it. 00:18:05.380 --> 00:18:06.220 - Okay. 00:18:06.220 --> 00:18:07.500 - So we're not, you know, 00:18:07.500 --> 00:18:09.380 we're not distributing any of the data. 00:18:09.380 --> 00:18:11.140 We're just basically providing the tools 00:18:11.140 --> 00:18:12.240 for you to access it. 00:18:12.240 --> 00:18:14.380 - Got it. 00:18:14.380 --> 00:18:16.460 Yeah, that sounds really neat. 00:18:16.460 --> 00:18:19.980 Is there some web scraping, some beautiful soup, 00:18:19.980 --> 00:18:21.780 Or is it all APIs? 00:18:21.780 --> 00:18:26.780 - There is, so we try to keep it to APIs. 00:18:26.780 --> 00:18:28.580 - They're more stable. 00:18:28.580 --> 00:18:31.060 - Yeah, you never know what tag's gonna change. 00:18:31.060 --> 00:18:33.460 But yeah, Beautiful Soup is in there, right? 00:18:33.460 --> 00:18:35.160 Beautiful Soup's a great library. 00:18:35.160 --> 00:18:38.620 There is web scraping, yeah. 00:18:38.620 --> 00:18:40.380 - Yeah, I figured, you know, like, 00:18:40.380 --> 00:18:43.420 sometimes that's just how it works, right? 00:18:43.420 --> 00:18:44.980 Sometimes people don't have APIs, 00:18:44.980 --> 00:18:46.540 but they've got websites, which is kind of-- 00:18:46.540 --> 00:18:48.220 - They do. - A cumbersome API 00:18:48.220 --> 00:18:49.660 if you go to it. 00:18:49.660 --> 00:18:51.900 I've also become a fan of pandas. 00:18:51.900 --> 00:18:54.820 Just you can, pandas will do all that for you 00:18:54.820 --> 00:18:57.260 and do the scraping for you with their read HTML 00:18:57.260 --> 00:18:58.780 if you just type in a link. 00:18:58.780 --> 00:19:00.740 - Oh, yeah. 00:19:00.740 --> 00:19:02.700 I was blown away. 00:19:02.700 --> 00:19:06.700 Chris Moffett did a course for TalkBython 00:19:06.700 --> 00:19:10.140 on replacing Excel with pandas and stuff. 00:19:10.140 --> 00:19:12.740 And some of the things you can do 00:19:12.740 --> 00:19:15.340 to get data off the internet with pandas. 00:19:15.340 --> 00:19:17.260 I'm like, why don't I just do this? 00:19:17.260 --> 00:19:18.580 This is so much better. 00:19:18.580 --> 00:19:20.380 you can put it in a webpage that might have 00:19:20.380 --> 00:19:21.780 a whole bunch of text and images 00:19:21.780 --> 00:19:23.540 and somewhere in there is a table, 00:19:23.540 --> 00:19:24.580 could be multiple tables, 00:19:24.580 --> 00:19:25.840 you can say, go to the third table 00:19:25.840 --> 00:19:28.040 and get me that as a data frame and bam. 00:19:28.040 --> 00:19:31.380 Like evil and beautiful soup, 00:19:31.380 --> 00:19:35.140 there's a lot of steps to get to a parsed data frame 00:19:35.140 --> 00:19:36.340 with header values. 00:19:36.340 --> 00:19:41.860 - Yeah, pandas is fantastic and that's a lot of requests, 00:19:41.860 --> 00:19:44.580 a lot of pandas, a lot of soup. 00:19:44.580 --> 00:19:45.420 - Yeah, awesome. 00:19:45.420 --> 00:19:47.780 Okay, so I sort of derailed your conversation 00:19:47.780 --> 00:19:49.900 but one of the things that first came to mind is like, 00:19:49.900 --> 00:19:51.680 okay, this is open source. 00:19:51.680 --> 00:19:54.860 Where is it getting all this interesting data from? 00:19:54.860 --> 00:19:57.780 So thanks for some of the story there. 00:19:57.780 --> 00:19:58.620 What else? 00:19:58.620 --> 00:20:00.740 What other major libraries are at play here? 00:20:00.740 --> 00:20:05.900 - So all of our plotting right now is through PyPlot. 00:20:05.900 --> 00:20:07.860 We have-- 00:20:07.860 --> 00:20:08.700 - Okay. 00:20:08.700 --> 00:20:11.100 When people see those, when you're in the terminal 00:20:11.100 --> 00:20:12.980 and you ask for some kind of visualization, 00:20:12.980 --> 00:20:14.620 it pops up with that interactive window. 00:20:14.620 --> 00:20:15.940 Those are PyPlots? 00:20:15.940 --> 00:20:16.780 - Yes. 00:20:16.780 --> 00:20:17.620 - Okay. - So, PyPlots, 00:20:17.620 --> 00:20:19.460 all the styling is done in-house. 00:20:19.460 --> 00:20:22.020 We have a fantastic designer, fantastic engineer, 00:20:22.020 --> 00:20:24.220 did a great job of doing some style sheets. 00:20:24.220 --> 00:20:26.700 - Yeah. 00:20:26.700 --> 00:20:29.880 Yeah, it really does look quite strikingly nice, so. 00:20:29.880 --> 00:20:32.260 Awesome. - Yeah, and all of these 00:20:32.260 --> 00:20:35.220 are, as we like to say, it's customizable. 00:20:35.220 --> 00:20:37.260 All these style sheets are available to the end user. 00:20:37.260 --> 00:20:39.540 They're packaged right into the terminal. 00:20:39.540 --> 00:20:41.420 You can go through, if you don't like our blue, 00:20:41.420 --> 00:20:42.780 you can change that to green. 00:20:42.780 --> 00:20:45.220 - Uh-huh, okay. 00:20:45.220 --> 00:20:46.820 - Yeah, you've got machine learning, 00:20:46.820 --> 00:20:49.880 PyTorch, TensorFlow, SKLearn. 00:20:49.880 --> 00:20:53.520 - So PyTorch is a tricky subject for us 00:20:53.520 --> 00:20:57.460 because it's tough to bundle into an installer. 00:20:57.460 --> 00:21:02.460 Currently we have some Keras models built in. 00:21:02.460 --> 00:21:05.860 You do have to install that, right, 00:21:05.860 --> 00:21:08.080 'cause TensorFlow's a pretty big library. 00:21:08.080 --> 00:21:11.060 We are working on incorporating 00:21:11.060 --> 00:21:12.820 the open source in Dart's library, 00:21:12.820 --> 00:21:14.940 which is PyTorch based. 00:21:14.940 --> 00:21:18.860 And that'll also allow for, you know, 00:21:18.860 --> 00:21:22.260 flares like an example of an NLP model 00:21:22.260 --> 00:21:24.420 that's deep learning based, 00:21:24.420 --> 00:21:26.060 you know, talking about machine learning, 00:21:26.060 --> 00:21:29.280 you know, we do also have NLP models using Vader sentiment. 00:21:29.280 --> 00:21:31.500 - Oh, interesting. 00:21:31.500 --> 00:21:33.940 Because if you could say, 00:21:33.940 --> 00:21:36.540 what is the sentiment on Twitter? 00:21:36.540 --> 00:21:39.940 Or what is it on, you know, the news sites? 00:21:39.940 --> 00:21:42.500 Maybe that's going to affect. 00:21:42.500 --> 00:21:44.380 - Yeah, so that's actually something we had done. 00:21:44.380 --> 00:21:46.360 You can actually try to do some correlation 00:21:46.360 --> 00:21:48.680 with beta sentiment on news headlines 00:21:48.680 --> 00:21:49.800 from one of our data providers, 00:21:49.800 --> 00:21:52.380 and we'll actually throw that on the same chart 00:21:52.380 --> 00:21:55.860 as the price, as the stock price. 00:21:55.860 --> 00:21:57.580 - Yeah, okay. 00:21:57.580 --> 00:21:58.420 Super cool. 00:21:58.420 --> 00:22:01.860 All right, now before I was gonna ask you 00:22:01.860 --> 00:22:03.940 about how to like sort of do your, 00:22:03.940 --> 00:22:05.220 add your own extras to it, 00:22:05.220 --> 00:22:06.660 but let's actually go and just talk about 00:22:06.660 --> 00:22:08.220 some more of the visualizations 00:22:08.220 --> 00:22:09.640 and some of the pictures, 00:22:10.980 --> 00:22:12.220 on the graphs that you guys, 00:22:12.220 --> 00:22:14.140 types of questions you can answer basically. 00:22:14.140 --> 00:22:15.060 Okay. - Yeah, of course. 00:22:15.060 --> 00:22:19.820 - Yeah, so you can get it through a Windows 00:22:19.820 --> 00:22:22.220 or a macOS installer. 00:22:22.220 --> 00:22:26.320 Are you doing something like using Pi to app 00:22:26.320 --> 00:22:29.340 or Pi to EXE or Pi installer or something like that 00:22:29.340 --> 00:22:33.480 to try to bundle all up or is it just sort of a scripted-- 00:22:33.480 --> 00:22:35.340 - We bundle with Pi installer. 00:22:35.340 --> 00:22:36.340 - Pi installer, okay. 00:22:36.340 --> 00:22:38.220 - Yes, so we use Pi installer, 00:22:39.500 --> 00:22:41.300 by we, I mean our engineering team. 00:22:41.300 --> 00:22:43.860 That's a little above my ability there. 00:22:43.860 --> 00:22:47.740 And yeah, so we are in the process 00:22:47.740 --> 00:22:51.140 of getting this signed through Apple 00:22:51.140 --> 00:22:52.900 and I believe Windows came through today. 00:22:52.900 --> 00:22:55.220 So at the end of the week-- 00:22:55.220 --> 00:22:56.520 - You don't get the yellow, 00:22:56.520 --> 00:22:58.460 do you wanna let this happen? 00:22:58.460 --> 00:23:00.980 You get the just a regular, do you wanna let this happen? 00:23:00.980 --> 00:23:01.820 - Yes. 00:23:01.820 --> 00:23:03.100 - UAC dialogue in Windows 00:23:03.100 --> 00:23:04.900 and you'll get something similar in Mac. 00:23:04.900 --> 00:23:07.000 - Yes, and the reason we have this installer 00:23:07.000 --> 00:23:10.360 is we understand the end user is not necessarily 00:23:10.360 --> 00:23:12.000 gonna be someone that wants to go through 00:23:12.000 --> 00:23:13.660 and change all the Python. 00:23:13.660 --> 00:23:15.800 - Sure, well, it's awesome that it is Python 00:23:15.800 --> 00:23:16.720 and that people could do it, 00:23:16.720 --> 00:23:19.880 but it's certainly not intended just for Python people. 00:23:19.880 --> 00:23:22.440 It's intended for investors who may or may not be. 00:23:22.440 --> 00:23:26.640 - And we have, I don't wanna give an accurate, 00:23:26.640 --> 00:23:29.320 but we've got what, almost 200 dependencies. 00:23:29.320 --> 00:23:33.520 So, and everyone's machine acts differently. 00:23:33.520 --> 00:23:36.600 You do a GIF pull and then you run poetry install, 00:23:36.600 --> 00:23:40.640 Maybe it acts differently on everyone's machine. 00:23:40.640 --> 00:23:43.120 So we wanted to provide this option for folks 00:23:43.120 --> 00:23:46.440 to be able to just click a button and have it right there. 00:23:46.440 --> 00:23:47.520 - Well, I think it's great. 00:23:47.520 --> 00:23:51.520 And that is ideally how software should be delivered. 00:23:51.520 --> 00:23:55.520 You shouldn't have to build it and download all the pieces. 00:23:55.520 --> 00:23:57.160 You just go, here's the thing I click. 00:23:57.160 --> 00:23:58.740 I put it there and now it runs. 00:23:58.740 --> 00:24:01.760 But it's often not how it is distributed. 00:24:01.760 --> 00:24:04.500 I guess just calling out two other ways people get it. 00:24:04.500 --> 00:24:06.980 they can go to Anaconda and get it there. 00:24:06.980 --> 00:24:10.860 And you can also do a Docker type of thing, right? 00:24:10.860 --> 00:24:12.220 If you want, but. 00:24:12.220 --> 00:24:13.660 - Yeah. 00:24:13.660 --> 00:24:14.740 - Yeah, cool. 00:24:14.740 --> 00:24:16.300 - For developers, if you wanna, you know, 00:24:16.300 --> 00:24:19.500 you can do a Git pull with your content environment for Git, 00:24:19.500 --> 00:24:22.060 feel free to change it. 00:24:22.060 --> 00:24:25.420 We're always open to any pull requests. 00:24:25.420 --> 00:24:27.060 - Awesome. 00:24:27.060 --> 00:24:29.460 All right, so let's maybe talk through some of the things 00:24:29.460 --> 00:24:31.180 that I can do, and then we'll talk about 00:24:31.180 --> 00:24:32.500 some of the internals. 00:24:32.500 --> 00:24:36.140 So you mentioned that there's this whole stock section 00:24:36.140 --> 00:24:38.460 and I just totally encourage people to come over 00:24:38.460 --> 00:24:41.540 to openbb.co/products/terminal 00:24:41.540 --> 00:24:42.860 and then you sort of just scroll through here 00:24:42.860 --> 00:24:45.660 and you get a bunch of cool visualizations. 00:24:45.660 --> 00:24:47.860 You'll see why I was impressed, I think. 00:24:47.860 --> 00:24:49.780 So here's like you come up and say, 00:24:49.780 --> 00:24:53.060 I want the Qsum, I guess the cumulative sum 00:24:53.060 --> 00:24:56.500 as a sequential analysis technique 00:24:56.500 --> 00:25:00.060 that shows any sort of cumulative function 00:25:00.060 --> 00:25:03.700 applied to something like a stock price over time or whatever. 00:25:03.700 --> 00:25:05.060 - So this is just an example. 00:25:05.060 --> 00:25:08.940 So if you go into stocks and just for everyone listening, 00:25:08.940 --> 00:25:10.140 we're going through the website right now. 00:25:10.140 --> 00:25:12.780 And the first thing you'll see on our stocks, 00:25:12.780 --> 00:25:15.860 on our product, on our terminal product page under stocks, 00:25:15.860 --> 00:25:16.900 is this QSUM. 00:25:16.900 --> 00:25:19.820 And for example, you would load in whatever your ticker is, 00:25:19.820 --> 00:25:22.180 and this would be found under quantitative analysis. 00:25:22.180 --> 00:25:26.500 So stocks load in Apple, and then you'd type in QA, 00:25:26.500 --> 00:25:27.820 and then you'd have all these options. 00:25:27.820 --> 00:25:29.460 QSUM is one of them. 00:25:29.460 --> 00:25:32.340 And this is a time series, like you said there, 00:25:32.340 --> 00:25:37.340 it's a time series technique of detecting anomalies, 00:25:37.340 --> 00:25:39.500 if you will. 00:25:39.500 --> 00:25:44.420 - Yeah, you got little call outs of those events and so on. 00:25:44.420 --> 00:25:48.420 You've got 3D graphs of volatility surfaces 00:25:48.420 --> 00:25:50.300 for in this case for Apple. 00:25:50.300 --> 00:25:53.860 - Yep, volatility surface, you know, they're big, 00:25:53.860 --> 00:25:56.300 everyone loves their volatility smiles. 00:25:57.180 --> 00:26:02.180 And so, you can show the implied volatility 00:26:02.180 --> 00:26:05.880 as a function of time to expiration and strike price. 00:26:05.880 --> 00:26:09.940 - And I guess because these are, do you say Plotly? 00:26:09.940 --> 00:26:11.100 I'm sorry, I forgot that. 00:26:11.100 --> 00:26:13.940 - So we have some-- - Pipe lots, we said. 00:26:13.940 --> 00:26:15.660 - We use Pipe lot. - Okay. 00:26:15.660 --> 00:26:18.060 - Plotly, I think, so I've kind of, 00:26:18.060 --> 00:26:20.420 early on I did some plots in Plotly 00:26:20.420 --> 00:26:23.460 and there may be some laying around that, 00:26:23.460 --> 00:26:26.820 the interactivity of Plotly is very nice. 00:26:26.820 --> 00:26:28.740 - Right, so what I was gonna say is when these pop up 00:26:28.740 --> 00:26:33.500 with the Piplot stuff, you can basically explore the graphs 00:26:33.500 --> 00:26:36.700 just because it's like the nature of those tools, right? 00:26:36.700 --> 00:26:40.180 - Yeah, Piplot has a, what is it, plt.ion 00:26:40.180 --> 00:26:42.060 that'll allow you to use the interactive. 00:26:42.060 --> 00:26:45.860 So you'll pop up, you'll be able to zoom or pan 00:26:45.860 --> 00:26:48.180 with the usual buttons in the window. 00:26:48.180 --> 00:26:51.740 - Okay, let's, you mentioned the sentiment. 00:26:51.740 --> 00:26:53.660 So there's sentiment news. 00:26:53.660 --> 00:26:56.620 - Instantly correlating article headline sentiment 00:26:56.620 --> 00:27:01.980 through NLP models with historical price. 00:27:01.980 --> 00:27:02.820 Yeah. 00:27:02.820 --> 00:27:05.060 - Yeah, so for this example, yeah. 00:27:05.060 --> 00:27:08.020 This example, this applies a Vader sentiment, right? 00:27:08.020 --> 00:27:11.020 Which is basically just a rules mapping to certain words 00:27:11.020 --> 00:27:12.600 to give you a sentiment score. 00:27:12.600 --> 00:27:16.300 And you can see the stock price on the same chart 00:27:16.300 --> 00:27:18.760 as from the headlines from our given source. 00:27:18.760 --> 00:27:21.220 - Super cool. 00:27:21.220 --> 00:27:22.180 All right, yeah. 00:27:22.180 --> 00:27:25.820 So all these nice different visualizations and so on here, 00:27:25.820 --> 00:27:29.800 maybe talk us through what, 00:27:29.800 --> 00:27:32.320 so to get these cool things generated 00:27:32.320 --> 00:27:34.900 by the Python libraries, 00:27:34.900 --> 00:27:36.940 what is my experience as somebody sitting 00:27:36.940 --> 00:27:37.980 at the terminal CLI? 00:27:37.980 --> 00:27:40.780 Like how do I pull up, say, the sentiment news thing 00:27:40.780 --> 00:27:43.340 or the QSUM or so on? 00:27:43.340 --> 00:27:44.460 - Right. 00:27:44.460 --> 00:27:48.100 So as I mentioned, once you launch the terminal, 00:27:48.100 --> 00:27:51.820 you either use the installer, two clicks and it's up, 00:27:51.820 --> 00:27:55.620 or you run Python terminal.py 00:27:55.620 --> 00:27:57.660 and you're provided with some options. 00:27:57.660 --> 00:28:01.060 The first thing you wanna do, let's say, 00:28:01.060 --> 00:28:03.900 for example, we're doing this QSUM that's up right here. 00:28:03.900 --> 00:28:07.380 You would type into the command line interface, 00:28:07.380 --> 00:28:09.460 you would type in stocks. 00:28:09.460 --> 00:28:11.580 - Okay, yeah, and it kind of puts it into the stocks mode 00:28:11.580 --> 00:28:13.620 where different subcommands apply or something, right? 00:28:13.620 --> 00:28:15.100 - Yep, and then once you have there, 00:28:15.100 --> 00:28:16.420 you'll have a bunch of different menus. 00:28:16.420 --> 00:28:18.100 You can look at fundamental analysis, 00:28:18.100 --> 00:28:19.820 you can look at technical analysis, 00:28:19.820 --> 00:28:21.300 you can do due diligence. 00:28:21.300 --> 00:28:23.380 we've got a bunch of menus on there. 00:28:23.380 --> 00:28:25.300 So you would load in your relevant ticker. 00:28:25.300 --> 00:28:28.480 So you'd either do load Apple, 00:28:28.480 --> 00:28:31.420 or we do have some, if you have the feature flag enabled, 00:28:31.420 --> 00:28:35.620 if you just type in Apple, or A-A-P-L, it'll load in. 00:28:35.620 --> 00:28:39.140 So once you have that ticker loaded in, 00:28:39.140 --> 00:28:41.640 it does a pandas data frame in memory. 00:28:41.640 --> 00:28:47.700 So from there, we can pass it to the different functions. 00:28:48.140 --> 00:28:52.540 And for this particular one, to do the quantitative analysis, 00:28:52.540 --> 00:28:53.980 I would then type in QA. 00:28:53.980 --> 00:28:56.220 So when you're on the Stocks menu, 00:28:56.220 --> 00:28:59.340 you would-- you can type H for help, 00:28:59.340 --> 00:29:02.420 or you can do a question mark, and it'll parse that. 00:29:02.420 --> 00:29:04.580 And you'd see QA, quantitative analysis, 00:29:04.580 --> 00:29:06.940 with a couple of examples of what you can do there. 00:29:06.940 --> 00:29:09.460 And then once you go into that menu, 00:29:09.460 --> 00:29:11.980 it would pop up with different functions. 00:29:11.980 --> 00:29:14.220 And you would type in the function you want. 00:29:14.220 --> 00:29:16.340 If there's arguments, maybe there's 00:29:16.340 --> 00:29:26.740 Windows or exporting data, you would just type in -help and you'll get a pop-up of the 00:29:26.740 --> 00:29:29.660 usage and the optional arguments. 00:29:29.660 --> 00:29:33.940 And you would type in QSUM with whatever your arguments are and you would get this plot. 00:29:33.940 --> 00:29:34.940 Nice. 00:29:34.940 --> 00:29:35.940 All right. 00:29:35.940 --> 00:29:38.460 That's very cool to hear how that sort of flows through there. 00:29:38.460 --> 00:29:39.460 All right. 00:29:39.460 --> 00:29:40.460 What else? 00:29:40.460 --> 00:29:44.620 Got a bunch of stuff on crypto, like you've got Bitcoin rainbow charts, which I've never 00:29:44.620 --> 00:29:45.620 seen but... 00:29:45.620 --> 00:29:46.460 - That's fun. 00:29:46.460 --> 00:29:47.280 - Interesting. 00:29:47.280 --> 00:29:52.280 Yeah, just a bunch of open interest by exchange, 00:29:52.280 --> 00:29:56.140 different exchanges, how much traffic there is, 00:29:56.140 --> 00:29:56.980 things like that. 00:29:56.980 --> 00:29:57.800 It's pretty awesome. 00:29:57.800 --> 00:30:00.040 The ETFs, let's see. 00:30:00.040 --> 00:30:03.660 Some of these are coming up as just almost like, 00:30:03.660 --> 00:30:07.180 some of them even come up almost like a report. 00:30:07.180 --> 00:30:09.220 You've got an Excel report and you've got, 00:30:09.220 --> 00:30:11.380 - Yeah, so actually the ETFs. 00:30:11.380 --> 00:30:13.380 - It's like a train station looking, 00:30:13.380 --> 00:30:15.900 Like here's the incoming information or whatever, right? 00:30:15.900 --> 00:30:18.160 - Yeah, and actually, 'cause for example, 00:30:18.160 --> 00:30:23.160 this ETF Excel report is a third party or third, 00:30:23.160 --> 00:30:29.420 so one of our contributors has their own database. 00:30:29.420 --> 00:30:32.580 It's the author of the finance database 00:30:32.580 --> 00:30:34.440 and he has this workbook. 00:30:34.440 --> 00:30:36.420 It loads in an ETF and it basically does 00:30:36.420 --> 00:30:38.080 what you see on the screen there. 00:30:38.080 --> 00:30:41.540 And it pops up in an Excel. 00:30:41.540 --> 00:30:45.380 - Yeah, it pops this up in an Excel workbook. 00:30:45.380 --> 00:30:47.940 We do have another feature that's DCF. 00:30:47.940 --> 00:30:51.660 Someone who was working on their MBA at the time said, 00:30:51.660 --> 00:30:53.020 "Hey, you guys provide the data. 00:30:53.020 --> 00:30:57.060 "I need to do a DCF analysis." 00:30:57.060 --> 00:31:01.500 And so we coded it up, and now we have a DCF analysis tool 00:31:01.500 --> 00:31:04.460 that uses some linear regression in the terminal, 00:31:04.460 --> 00:31:06.140 and it all saves to an Excel file. 00:31:06.140 --> 00:31:07.860 - That's cool. 00:31:07.860 --> 00:31:08.940 And the fact that it goes out to Excel, 00:31:08.940 --> 00:31:10.460 that means you could hand it off to somebody 00:31:10.460 --> 00:31:15.160 who just lives in Excel and they can still use that, right? 00:31:15.160 --> 00:31:16.100 - Exactly. 00:31:16.100 --> 00:31:18.460 So, you know, we don't want to completely replace Excel 00:31:18.460 --> 00:31:22.760 because we know it's very widely used, but. 00:31:22.760 --> 00:31:25.680 - Yeah, but hook into all these different data sources, 00:31:25.680 --> 00:31:27.780 real-time data sources and pulling it together, 00:31:27.780 --> 00:31:30.220 like that's not Excel's forte. 00:31:30.220 --> 00:31:31.780 - Yeah, yeah, that's why. 00:31:31.780 --> 00:31:36.660 - That's why I should be doing it for everything. 00:31:36.660 --> 00:31:39.920 - Yeah, okay, so you've got sort of 00:31:39.920 --> 00:31:41.340 technical analysis stuff, 00:31:41.340 --> 00:31:43.520 you can compare different stocks 00:31:43.520 --> 00:31:46.880 and even check out the news over for the ETF. 00:31:46.880 --> 00:31:50.440 - Yeah, we do have over, well, I don't wanna say over, 00:31:50.440 --> 00:31:53.260 we're sitting around 700 different functionalities. 00:31:53.260 --> 00:31:56.880 So we do understand it can be slightly 00:31:56.880 --> 00:31:59.620 intimidating at first. 00:31:59.620 --> 00:32:02.080 - Yeah, that was my feeling as well 00:32:02.080 --> 00:32:04.000 when I first saw this is like, wow, 00:32:04.000 --> 00:32:06.120 this is pretty intense. 00:32:06.120 --> 00:32:07.120 There's a lot going on. 00:32:07.120 --> 00:32:10.920 You have to be an expert, which is what I was talking about at the beginning. 00:32:10.920 --> 00:32:15.880 You get into the terminal and you've got to really become an expert, but then you get 00:32:15.880 --> 00:32:18.800 this really great quick power to do it. 00:32:18.800 --> 00:32:25.720 But I would also imagine you're probably not doing stocks, crypto, ETF, economic analysis, 00:32:25.720 --> 00:32:26.720 all the same. 00:32:26.720 --> 00:32:29.800 You're probably focused on one of these areas, right? 00:32:29.800 --> 00:32:35.720 If you narrow it down, it probably gets more doable as you go. 00:32:35.720 --> 00:32:39.880 And I mean, you know, maybe you're trying, one of the things, for example, we have this 00:32:39.880 --> 00:32:46.440 econometrics menu, which, you know, one of our target audiences is kind of the academics 00:32:46.440 --> 00:32:49.680 and in your econometrics course, right? 00:32:49.680 --> 00:32:52.960 That's basically a linear regression of certain things. 00:32:52.960 --> 00:33:01.320 So maybe you want to look at the effect of a company's balance sheet on and relate that 00:33:01.320 --> 00:33:04.500 to inflation, I don't know, inflation is a hot topic. 00:33:04.500 --> 00:33:07.460 And you can actually go in into the econometrics menu, 00:33:07.460 --> 00:33:12.060 load in both of these and do your preferred 00:33:12.060 --> 00:33:15.340 regression techniques and get some insights. 00:33:15.340 --> 00:33:17.500 - Oh, that's cool. 00:33:17.500 --> 00:33:19.700 You know, thinking about education, 00:33:19.700 --> 00:33:22.340 that's a big opportunity for you all, right? 00:33:22.340 --> 00:33:23.180 - It is. 00:33:23.180 --> 00:33:28.220 - People, students are gonna be buying Bloomberg terminals 00:33:28.220 --> 00:33:31.360 and other commercial things most likely, right? 00:33:31.360 --> 00:33:33.020 Not the high-end ones anyway. 00:33:33.020 --> 00:33:33.860 - Yeah. 00:33:33.860 --> 00:33:37.140 Here's a really simple way that you could actually, 00:33:37.140 --> 00:33:40.360 if you're a teacher teaching economics 00:33:40.360 --> 00:33:42.360 or finance or investing, 00:33:42.360 --> 00:33:44.620 here's something you could bring into your class 00:33:44.620 --> 00:33:49.100 as a resource and really analyze it, right? 00:33:49.100 --> 00:33:51.340 When your projects could be, okay, pick a stock. 00:33:51.340 --> 00:33:52.600 These are the questions we have, 00:33:52.600 --> 00:33:54.300 back it up with the other data that you can find 00:33:54.300 --> 00:33:57.020 through these other areas and make predictions, right? 00:33:57.020 --> 00:33:59.060 - Exactly, that's one thing we love. 00:34:00.420 --> 00:34:06.580 some of our some of the people we talk with their experiences for their courses, they have they have 00:34:06.580 --> 00:34:10.980 assignments that they need to do use the one Bloomberg terminal that they have among 30 00:34:10.980 --> 00:34:16.500 students. So they're queued up for, you know, an hour or two, just just to get basically the same 00:34:16.500 --> 00:34:23.860 data, if you will. And, you know, we, that's one of the things we pain points we'd like to address 00:34:23.860 --> 00:34:27.780 is everyone can have this on their machine and get the data they need and do the analysis they want 00:34:27.780 --> 00:34:32.540 - Sure, I don't think it would be a very detailed thing, 00:34:32.540 --> 00:34:36.020 but it would be also interesting that the professor 00:34:36.020 --> 00:34:39.620 or the instructor could say, look here in the source code, 00:34:39.620 --> 00:34:42.540 these four lines of code, this is showing, 00:34:42.540 --> 00:34:44.780 this is where it's doing that theory 00:34:44.780 --> 00:34:45.880 we talked about last week. 00:34:45.880 --> 00:34:48.540 Like here's how it's applying this model. 00:34:48.540 --> 00:34:50.940 And I don't expect you to totally understand the code, 00:34:50.940 --> 00:34:54.140 but like you can see this is how software does it. 00:34:54.140 --> 00:34:55.780 You know, you could have a little bit more insight, 00:34:55.780 --> 00:34:57.380 whereas a lot of the commercial things, 00:34:57.380 --> 00:34:58.980 through a website for sure. 00:34:58.980 --> 00:35:01.520 But even if they're just compiled closed source, 00:35:01.520 --> 00:35:02.360 - Yeah. 00:35:02.360 --> 00:35:03.560 - You won't be able to do that. 00:35:03.560 --> 00:35:06.020 - We had a contributor reach out to us, 00:35:06.020 --> 00:35:07.420 part of the from Greece, 00:35:07.420 --> 00:35:10.820 part of their software business course 00:35:10.820 --> 00:35:13.000 was to submit a pull request somewhere. 00:35:13.000 --> 00:35:14.420 So he reached out to us, 00:35:14.420 --> 00:35:16.600 he did a nice little report. 00:35:16.600 --> 00:35:17.560 He did a pull request, 00:35:17.560 --> 00:35:19.620 added a feature to the terminal. 00:35:19.620 --> 00:35:21.700 So you know, using the theory in class there. 00:35:21.700 --> 00:35:24.460 Another professor reached out to us, 00:35:24.460 --> 00:35:27.620 he had his students write a kind of an intro guide 00:35:27.620 --> 00:35:30.420 for us that we're kind of working with 00:35:30.420 --> 00:35:32.820 and we're gonna make available. 00:35:32.820 --> 00:35:33.780 - Okay, awesome. 00:35:33.780 --> 00:35:36.260 Yeah, the intro guide for OpenBB for his students 00:35:36.260 --> 00:35:38.300 or something like that, yeah. 00:35:38.300 --> 00:35:39.140 - Yeah. 00:35:39.140 --> 00:35:40.180 - Yeah, nice. 00:35:40.180 --> 00:35:41.540 All right, let me just sort of skim through here. 00:35:41.540 --> 00:35:45.140 There's a, you said 700 people. 00:35:45.140 --> 00:35:47.060 I'm not so sure I wanna touch on all of them, 00:35:47.060 --> 00:35:49.300 but every single one of them you come to, 00:35:49.300 --> 00:35:51.220 almost like some of them are just sort of tables, 00:35:51.220 --> 00:35:56.040 But so many of them, like this portfolio optimization, 00:35:56.040 --> 00:35:59.100 you know, it's beautiful, it looks really good. 00:35:59.100 --> 00:36:00.140 And-- 00:36:00.140 --> 00:36:03.540 - Thanks, we have a lot and the pipeline's really good. 00:36:03.540 --> 00:36:05.180 The rainbow chart's always a fun one. 00:36:05.180 --> 00:36:06.940 It's, you know, it's really pretty. 00:36:06.940 --> 00:36:10.540 - Yeah, I like it a lot. 00:36:10.540 --> 00:36:11.580 These are great. 00:36:11.580 --> 00:36:13.940 So I just, to me, it feels like something 00:36:13.940 --> 00:36:17.300 if I were working, doing this kind of stuff, 00:36:17.300 --> 00:36:19.380 it would be pleasing to sit down 00:36:19.380 --> 00:36:22.700 and look at these graphs and this analysis rather than, 00:36:22.700 --> 00:36:24.500 oh, well, there's just some software you look at, 00:36:24.500 --> 00:36:28.260 like it does the job, but it doesn't make you feel good 00:36:28.260 --> 00:36:29.960 using it while it's doing the job. 00:36:29.960 --> 00:36:31.740 - Yeah. 00:36:31.740 --> 00:36:33.380 - Battleship gray or I don't know, something like that. 00:36:33.380 --> 00:36:35.780 - And also, like I mentioned too, 00:36:35.780 --> 00:36:37.060 you can customize the colors, 00:36:37.060 --> 00:36:40.320 even if you wanna change the terminal colors. 00:36:40.320 --> 00:36:43.780 When you launch our terminal, 00:36:43.780 --> 00:36:46.500 you'll see some blues and reds. 00:36:46.500 --> 00:36:48.980 If you want it to be orange and green, 00:36:48.980 --> 00:36:51.620 you can go in and change it, it's fully customizable. 00:36:51.620 --> 00:36:55.900 - Cool. 00:36:55.900 --> 00:36:59.580 So there's a Jupyter section as well. 00:36:59.580 --> 00:37:00.420 - There is? 00:37:00.420 --> 00:37:01.700 - Yeah, tell us about the Jupyter section. 00:37:01.700 --> 00:37:05.180 I think that's a super big tie-in for iGN people. 00:37:05.180 --> 00:37:08.980 - Yeah, so there's two ways you can really 00:37:08.980 --> 00:37:11.160 make the most out of Jupyter. 00:37:11.160 --> 00:37:13.420 The first way is we've started kind of building 00:37:13.420 --> 00:37:17.020 an API wrapper for a lot of our functions. 00:37:17.020 --> 00:37:20.300 So one thing we haven't gone into is a little bit the architecture. 00:37:20.300 --> 00:37:24.560 And we use like an MVC model view controller 00:37:24.560 --> 00:37:27.060 where all these plots are generated in the view, 00:37:27.060 --> 00:37:30.060 and we can wrap that into an API and you can import that. 00:37:30.060 --> 00:37:36.100 So in Jupyter, if your workflow is X, Y, and Z, 00:37:36.100 --> 00:37:39.820 in the terminal, you can, from OpenBB terminal, 00:37:39.820 --> 00:37:42.940 import the API as whatever, as OpenBB. 00:37:42.940 --> 00:37:47.940 OpenBB, Vue, Vue Stock, Apple, whatever, 00:37:47.940 --> 00:37:49.240 however that works. 00:37:49.240 --> 00:37:51.380 And you can create your workflows there. 00:37:51.380 --> 00:37:52.220 One other-- 00:37:52.220 --> 00:37:54.900 - You get a plot back and you just plot.show 00:37:54.900 --> 00:37:58.500 or just like empty one line and it goes on there, yeah? 00:37:58.500 --> 00:37:59.800 - Yeah, I mean, you do an inline, 00:37:59.800 --> 00:38:02.080 you can also do, you can adjust it, right? 00:38:02.080 --> 00:38:05.800 So we'll wrap, the API wraps our load function. 00:38:05.800 --> 00:38:08.540 So you can load in your stock and, you know, 00:38:08.540 --> 00:38:10.060 maybe you want to resample it 00:38:10.060 --> 00:38:12.200 or maybe you want to make your own machine learning model 00:38:12.200 --> 00:38:16.120 or whatever you want to do, you can do that with the API. 00:38:16.120 --> 00:38:19.360 Another interesting thing is that we use Paper Mill 00:38:19.360 --> 00:38:22.320 to automatically run some reports. 00:38:22.320 --> 00:38:26.840 So the example in the terminal, 00:38:26.840 --> 00:38:31.840 there's a default example called equity.ipy notebook. 00:38:31.840 --> 00:38:36.400 And if you go into the terminal, 00:38:36.400 --> 00:38:38.920 so once it launches, you go to the reports menu, 00:38:38.920 --> 00:38:40.400 just by typing reports, 00:38:40.400 --> 00:38:44.320 you type in equity, Apple, or whatever your ticker is, 00:38:44.320 --> 00:38:46.080 it'll run through paper mill, 00:38:46.080 --> 00:38:49.320 which automatically fills in your ticker, 00:38:49.320 --> 00:38:54.320 whatnot generates a predefined PDF basically 00:38:54.320 --> 00:38:56.520 with it's fully customizable. 00:38:56.520 --> 00:39:00.540 We have some fun widgets that you can play around with. 00:39:00.540 --> 00:39:02.360 And you can add KPIs. 00:39:02.360 --> 00:39:05.960 Hey, if, I don't know, if the RSI is high 00:39:05.960 --> 00:39:07.720 or if insider trading is low, 00:39:07.720 --> 00:39:09.640 I think those are some of the examples. 00:39:09.640 --> 00:39:13.280 So you can create your own custom notebooks 00:39:13.280 --> 00:39:16.920 and kind of automate your research workflow. 00:39:16.920 --> 00:39:21.480 - That's, yeah, that's super interesting. 00:39:21.480 --> 00:39:24.480 I haven't spoken about Paper Mill for a while in here, 00:39:24.480 --> 00:39:26.840 but it's a really interesting project, 00:39:26.840 --> 00:39:29.680 I think from the Netflix team, right? 00:39:29.680 --> 00:39:30.640 - I have no idea. 00:39:30.640 --> 00:39:32.700 - Yeah, I think so. 00:39:32.700 --> 00:39:34.480 Maybe tell people just a bit about 00:39:36.880 --> 00:39:40.260 about what the whole purpose of paper millage, what it is. 00:39:40.260 --> 00:39:45.760 - So, what we use paper mill for 00:39:45.760 --> 00:39:47.960 is to basically just automatically 00:39:47.960 --> 00:39:50.000 execute a notebook template. 00:39:50.000 --> 00:39:52.600 So there's, you kind of have to go a little bit 00:39:52.600 --> 00:39:54.840 into the metadata of the Jupyter notebook 00:39:54.840 --> 00:39:58.120 and there's a cell that has like parameters 00:39:58.120 --> 00:40:02.200 and by the terminal, we can parse what the argument is. 00:40:02.200 --> 00:40:05.540 You know, for example, the ticker. 00:40:05.540 --> 00:40:10.540 And basically all the same commands will be run 00:40:10.540 --> 00:40:14.940 just replacing the ticker with whatever is executed. 00:40:14.940 --> 00:40:17.240 So paper mill is just a really nice, 00:40:17.240 --> 00:40:21.140 very, very great tool at wrapping Jupyter. 00:40:21.140 --> 00:40:23.540 - It turns notebooks almost into functions 00:40:23.540 --> 00:40:26.160 that you can call, but the output is the notebook 00:40:26.160 --> 00:40:29.300 in the form that has the results, 00:40:29.300 --> 00:40:31.220 the intermediate results and the pictures and everything, 00:40:31.220 --> 00:40:34.100 not just the answer like a function would have. 00:40:34.100 --> 00:40:35.260 - Yep, you get the whole notebook 00:40:35.260 --> 00:40:38.340 and you know you can customize it, PDF, HTML, 00:40:38.340 --> 00:40:39.860 you can send it to your buddies. 00:40:39.860 --> 00:40:42.580 - Yeah, well, you touched on the architecture a bit. 00:40:42.580 --> 00:40:45.820 Maybe we could dive into that just a little bit more. 00:40:45.820 --> 00:40:48.660 What are some of the notable things about how this is built? 00:40:48.660 --> 00:40:52.140 - Yeah, so as I kind of hinted at, 00:40:52.140 --> 00:40:53.940 actually specifically said, 00:40:53.940 --> 00:40:56.740 our code is, we use an MVC structure, 00:40:56.740 --> 00:40:58.300 so Model View Controller. 00:40:58.300 --> 00:41:03.620 So how this goes, and for example, 00:41:03.620 --> 00:41:08.060 every submenu will have a controller, 00:41:08.060 --> 00:41:10.900 and we have abstracted that, 00:41:10.900 --> 00:41:12.540 so that there's a base controller 00:41:12.540 --> 00:41:13.900 and a base docs controller 00:41:13.900 --> 00:41:15.920 that inherit all the same methods, 00:41:15.920 --> 00:41:19.140 save ourselves a little bit of redundancy. 00:41:19.140 --> 00:41:23.020 - So there's controllers like parsing and processing 00:41:23.020 --> 00:41:25.780 the commands you send in the terminal CLI. 00:41:25.780 --> 00:41:29.940 - Yes, so something I failed to mention 00:41:29.940 --> 00:41:31.700 was that we use arg parse. 00:41:31.700 --> 00:41:32.580 - Yeah. 00:41:32.580 --> 00:41:36.100 So the controller wraps in, it basically takes in, 00:41:36.100 --> 00:41:41.460 it creates an argparse object, adds the arguments, 00:41:41.460 --> 00:41:45.100 and then does the parsing, makes sure that if I type in, 00:41:45.100 --> 00:41:48.060 if I try to load a stock ticker that's four, 00:41:48.060 --> 00:41:51.220 not an actual ticker, if I try to enter a number, 00:41:51.220 --> 00:41:53.220 it'll say, "Hey, you need to be a ticker," 00:41:53.220 --> 00:41:55.220 it does some of the logic. 00:41:55.220 --> 00:41:58.220 Our model functions get the data, 00:41:58.540 --> 00:42:02.800 transfer the data, edit the data, 00:42:02.800 --> 00:42:05.200 modify it, manipulate it in certain ways. 00:42:05.200 --> 00:42:09.960 And then the views do either tables, graphs. 00:42:09.960 --> 00:42:12.580 So, for example, if you wanted, 00:42:12.580 --> 00:42:15.840 if you look at how we do our fundamental analysis, 00:42:15.840 --> 00:42:19.480 the workflow is the controller has income 00:42:19.480 --> 00:42:23.480 and the way we do it, the function is called callIncome. 00:42:23.480 --> 00:42:25.640 We just kind of add this call underscore 00:42:25.640 --> 00:42:27.720 to whatever you type into the terminal 00:42:27.720 --> 00:42:30.720 And callIncome is a method of the controller. 00:42:30.720 --> 00:42:34.480 So that'll, you can add the arguments. 00:42:34.480 --> 00:42:38.040 And for example, the income statement has an argument 00:42:38.040 --> 00:42:41.620 that's -L, that tells you how many quarters you want to get. 00:42:41.620 --> 00:42:46.080 So the namespace, the namespace, 00:42:46.080 --> 00:42:50.360 so the parser, the argparse namespace 00:42:50.360 --> 00:42:53.260 then has the information stored. 00:42:53.260 --> 00:42:56.560 So we know, hey, we're trying to get income 00:42:56.560 --> 00:42:58.360 and we're trying to get five quarters. 00:42:58.360 --> 00:43:02.860 So that will call, it'll call the view, 00:43:02.860 --> 00:43:04.660 which will then pass in, you know, 00:43:04.660 --> 00:43:09.240 the view will say, hey, alpha vantage model, 00:43:09.240 --> 00:43:13.780 get me my five quarters of Apple income statements, 00:43:13.780 --> 00:43:15.880 and that'll return it as a data frame. 00:43:15.880 --> 00:43:17.520 And, you know, either, 00:43:17.520 --> 00:43:19.420 I guess that function doesn't have a graph, 00:43:19.420 --> 00:43:20.800 but if it's a graphing function, 00:43:20.800 --> 00:43:22.640 it would do the graph. 00:43:22.640 --> 00:43:25.140 - Call graph, pops up the window in the pipelot window. 00:43:25.140 --> 00:43:27.260 and then off it goes. 00:43:27.260 --> 00:43:28.100 That's really interesting. 00:43:28.100 --> 00:43:30.660 I have never really thought about 00:43:30.660 --> 00:43:35.660 how you might do the processing of CLI commands, 00:43:35.660 --> 00:43:37.340 but within an application. 00:43:37.340 --> 00:43:39.740 When I think arg pars, I think startup. 00:43:39.740 --> 00:43:42.780 Like what commands are passed to my application 00:43:42.780 --> 00:43:44.100 during startup to figure it out? 00:43:44.100 --> 00:43:48.220 But of course, as you continue to issue commands, 00:43:48.220 --> 00:43:50.140 if that's text on a line, 00:43:50.140 --> 00:43:53.100 it makes sense to sort of treat it the same, right? 00:43:53.100 --> 00:43:55.380 - Yeah, and while we actually do on startup 00:43:55.380 --> 00:43:56.820 actually do have our parts. 00:43:56.820 --> 00:44:01.820 So you can, for example, my favorite flag 00:44:01.820 --> 00:44:04.540 that we have for the terminal is debug. 00:44:04.540 --> 00:44:05.900 That way you can actually get a full 00:44:05.900 --> 00:44:07.880 instead of catching all the errors, right? 00:44:07.880 --> 00:44:09.660 'Cause if we're not catching all the errors 00:44:09.660 --> 00:44:12.180 in the terminal, it would crash every time 00:44:12.180 --> 00:44:13.980 you had an exception or whatnot. 00:44:13.980 --> 00:44:15.700 But with this debug flag, 00:44:15.700 --> 00:44:18.500 it'll actually show you the full stack trace 00:44:18.500 --> 00:44:20.720 and just instead of just the exception. 00:44:20.720 --> 00:44:23.520 So we actually do wrap around the startup and whatnot. 00:44:23.520 --> 00:44:27.680 And we also do like, we have a reset command 00:44:27.680 --> 00:44:30.800 that if you're in the terminal, you type in reset, 00:44:30.800 --> 00:44:33.680 maybe you changed an API key or you're developing 00:44:33.680 --> 00:44:36.200 and you change your function, you need to reload it. 00:44:36.200 --> 00:44:39.480 You hit reset, it'll relaunch the terminal, 00:44:39.480 --> 00:44:40.560 exit then relaunch. 00:44:40.560 --> 00:44:44.480 So that's the general workflow. 00:44:44.480 --> 00:44:47.560 - Yeah, does the terminal run in whatever terminal 00:44:47.560 --> 00:44:49.040 of your OS? 00:44:49.040 --> 00:44:52.000 Like if I have iTerm set up on my Mac, 00:44:52.000 --> 00:44:52.840 it'll run there. 00:44:52.840 --> 00:44:54.240 If I have Windows Terminal and PowerShell, 00:44:54.240 --> 00:44:55.440 it'll run over there. 00:44:55.440 --> 00:44:58.800 - Yeah, just make sure you're in the right directory. 00:44:58.800 --> 00:45:00.580 - Yeah, okay, fantastic. 00:45:00.580 --> 00:45:04.600 Yeah, super, super interesting. 00:45:04.600 --> 00:45:06.600 Let's see, what did I wanna ask you about here? 00:45:06.600 --> 00:45:08.620 One other thing I'm trying to remember. 00:45:08.620 --> 00:45:12.160 It's gone, it's lost. 00:45:12.160 --> 00:45:14.200 I wanted to follow up with something, but that's okay. 00:45:14.200 --> 00:45:17.680 - Well, I can also, I can even add a statement 00:45:17.680 --> 00:45:22.440 that doing this MVC allows us to have different views. 00:45:22.440 --> 00:45:24.120 I know one thing you'll probably ask me about 00:45:24.120 --> 00:45:29.120 is that we have these bots on our website and the ideas. 00:45:29.120 --> 00:45:31.480 - Yeah, I did notice over here that you have a products, 00:45:31.480 --> 00:45:33.120 you got a terminal and then documentation 00:45:33.120 --> 00:45:35.280 and then you have bots. 00:45:35.280 --> 00:45:36.320 Yeah, coming soon bots. 00:45:36.320 --> 00:45:37.960 I do remember now what I would ask you, 00:45:37.960 --> 00:45:39.520 but let's talk bots for a second. 00:45:39.520 --> 00:45:40.880 - Yeah. - Come back to it. 00:45:40.880 --> 00:45:45.220 - So bots, I don't wanna give away, 00:45:45.220 --> 00:45:48.600 we do have some exciting announcement coming soon. 00:45:48.600 --> 00:45:50.640 And I would like to take this opportunity 00:45:50.640 --> 00:45:52.840 to apologize to anyone that's trying to get this, 00:45:52.840 --> 00:45:54.520 get the Discord bot in our server 00:45:54.520 --> 00:45:58.200 as we're currently limited to the maximum 100 servers 00:45:58.200 --> 00:46:00.360 we can be in without the verification 00:46:00.360 --> 00:46:01.440 that we're working on. 00:46:01.440 --> 00:46:03.520 - Got it. 00:46:03.520 --> 00:46:04.960 So under the listing here, 00:46:04.960 --> 00:46:08.760 you have bots coming for Discord, Telegram, Slack, and more. 00:46:08.760 --> 00:46:11.280 And yeah, I guess news is coming, huh? 00:46:11.280 --> 00:46:12.800 - Yeah, and all of this, 00:46:12.800 --> 00:46:17.440 one of the kind of using MVC, we're able to extract, 00:46:17.440 --> 00:46:21.680 extract, abstract all of our methods 00:46:21.680 --> 00:46:24.200 and then we can just, we do all the processing 00:46:24.200 --> 00:46:25.560 on the same model function 00:46:25.560 --> 00:46:27.320 and then we can pass it to different views 00:46:27.320 --> 00:46:29.560 for Discord or Telegram or Slack. 00:46:29.560 --> 00:46:32.640 - Nice, yeah, I'm sure, or comment as much as you can, 00:46:32.640 --> 00:46:36.800 but you can build a Slack bot in Flask, for example, 00:46:36.800 --> 00:46:37.840 or something like that, right, 00:46:37.840 --> 00:46:39.880 where it kind of uses a web communication 00:46:39.880 --> 00:46:41.760 to talk to your bot. 00:46:41.760 --> 00:46:44.020 And so I guess you could do things like go into Slack 00:46:44.020 --> 00:46:46.700 and say, "Hey, OpenBB bot, 00:46:46.700 --> 00:46:51.500 "tell me about important events in stock 00:46:51.500 --> 00:46:52.980 "or I've been watching this thing. 00:46:52.980 --> 00:46:54.420 "If it crosses the threshold, 00:46:54.420 --> 00:46:56.020 "just yell at me about it, right? 00:46:56.020 --> 00:46:56.860 "Let me know." 00:46:56.860 --> 00:46:57.680 Something like that. 00:46:57.680 --> 00:46:58.860 Is that kind of the flow? 00:46:58.860 --> 00:46:59.840 - Pretty much. 00:46:59.840 --> 00:47:01.860 Yeah, just some async stuff. 00:47:01.860 --> 00:47:03.660 It's running on a server somewhere 00:47:03.660 --> 00:47:06.360 and it waits to read in the command. 00:47:06.360 --> 00:47:08.940 So. - Cool. 00:47:08.940 --> 00:47:10.780 One other question I wanted to ask you 00:47:10.780 --> 00:47:15.460 Is what I've seen so far looks like really cool ways to, 00:47:15.460 --> 00:47:19.480 all of it's static, so you can only read so much into it, 00:47:19.480 --> 00:47:22.260 but it looks like, let me answer a question 00:47:22.260 --> 00:47:25.020 about this information, either historical 00:47:25.020 --> 00:47:27.580 or sort of up to now about some stock 00:47:27.580 --> 00:47:29.260 or the economy or whatever. 00:47:29.260 --> 00:47:31.660 Is there a way to have like a dashboard 00:47:31.660 --> 00:47:32.700 where I can put different things up 00:47:32.700 --> 00:47:35.940 and they're just constantly churning with real data? 00:47:39.100 --> 00:47:40.980 - That is possible, yes. 00:47:40.980 --> 00:47:48.120 - Not to make a case, but possible. 00:47:48.120 --> 00:47:53.140 - I mean, it is possible and I'll leave it at that, 00:47:53.140 --> 00:47:54.460 that it is possible. 00:47:54.460 --> 00:47:55.660 - All right, sounds good. 00:47:55.660 --> 00:47:58.580 That was the one I was asking about. 00:47:58.580 --> 00:48:02.740 All right, now one thing I wanna touch on here 00:48:02.740 --> 00:48:06.140 before we get too far away with time 00:48:07.300 --> 00:48:10.220 is two things stood out to me when I went 00:48:10.220 --> 00:48:12.100 and sort of clicked around your site. 00:48:12.100 --> 00:48:13.060 Now that's pretty interesting. 00:48:13.060 --> 00:48:15.540 I can't remember, you know, some news article 00:48:15.540 --> 00:48:18.300 that talked about OpenBB that I thought 00:48:18.300 --> 00:48:19.140 was pretty interesting. 00:48:19.140 --> 00:48:20.900 I come over here, okay, wow, this is really pretty. 00:48:20.900 --> 00:48:21.740 It's pretty cool. 00:48:21.740 --> 00:48:23.660 It's open source and so on. 00:48:23.660 --> 00:48:25.140 The other one is like right across the top, 00:48:25.140 --> 00:48:30.100 it says announcing our $8.5 million seed fund funding 00:48:30.100 --> 00:48:31.280 and public launch. 00:48:31.280 --> 00:48:36.580 And that sounds like a non-trivial deal. 00:48:36.580 --> 00:48:38.520 - That's awesome, congratulations. 00:48:38.520 --> 00:48:39.580 - Yeah, thank you so much. 00:48:39.580 --> 00:48:43.560 I mean, yeah, that's a pretty big deal for us. 00:48:43.560 --> 00:48:45.540 - I would think. 00:48:45.540 --> 00:48:50.540 - So yeah, I mean, actually fun fact about this was that, 00:48:50.540 --> 00:48:57.020 so Didier and I were just doing this for fun on the side, 00:48:57.020 --> 00:49:00.140 you know, and then my wife and I, 00:49:00.140 --> 00:49:03.020 we got married in 20, about a year ago, 00:49:03.020 --> 00:49:06.060 actually a year ago in 11 days. 00:49:06.060 --> 00:49:07.060 - Oh cool, great. 00:49:07.060 --> 00:49:11.580 - So we're on our honeymoon in Napa Valley, 00:49:11.580 --> 00:49:13.540 good old land of the VC. 00:49:13.540 --> 00:49:15.140 And on our last night there, 00:49:15.140 --> 00:49:18.540 last night there, you know, 00:49:18.540 --> 00:49:21.340 fun day of wine touring and whatnot, 00:49:21.340 --> 00:49:24.420 I get a LinkedIn message from someone saying, 00:49:24.420 --> 00:49:27.700 "Hey, we're interested in investing in you." 00:49:27.700 --> 00:49:31.020 And needless to say, that turned into 00:49:33.740 --> 00:49:40.860 meeting up with meeting up with him on quick 20 minute chat the day of driving through 00:49:40.860 --> 00:49:47.100 San Francisco before actually trying to get out to Alcatraz because we had that scheduled. 00:49:47.100 --> 00:49:52.260 Wow. What funny timing on one hand, it's like terrible timing on other it's perfect. You're 00:49:52.260 --> 00:49:57.900 right there. Yeah, I mean, I was like, Hey, I'm in Napa. And so I'll give a shout out 00:49:57.900 --> 00:50:05.160 to JJ over at OSS Capital. He's been fantastic working with us. JJ was like, I will meet 00:50:05.160 --> 00:50:09.240 you wherever you are right now. And I'm like, man, I am not in any state to be talking to 00:50:09.240 --> 00:50:18.520 anyone right now. So yeah, no, it was a great opportunity to reach out with him. They led 00:50:18.520 --> 00:50:24.920 the round. We have a great group of angels on board as well. 00:50:24.920 --> 00:50:30.040 So yeah, well I guess there's a couple other call outs I want to make real quick. 00:50:30.040 --> 00:50:34.200 One Travis Oliphant is an advisor to you all, which is pretty awesome. 00:50:34.200 --> 00:50:38.240 People surely know him as one of the founders of Anaconda. 00:50:38.240 --> 00:50:39.240 Yep. 00:50:39.240 --> 00:50:40.960 Travis is on board as an advisor for us. 00:50:40.960 --> 00:50:44.360 It's been fantastic working with him, getting to know him a little bit. 00:50:44.360 --> 00:50:45.360 That's super cool. 00:50:45.360 --> 00:50:53.920 Then also Naval Rivacant is one of the investors and I know him from this Twitter storm thing 00:50:53.920 --> 00:50:56.120 turned into a discussion called how to get rich. 00:50:56.120 --> 00:50:57.880 Have you listened to this? 00:50:57.880 --> 00:50:59.120 - Parts. 00:50:59.120 --> 00:51:01.560 - Yeah, it's pretty interesting, pretty fascinating. 00:51:01.560 --> 00:51:06.440 So he's involved as well, which is pretty cool. 00:51:06.440 --> 00:51:08.560 Awesome, I think that's really neat. 00:51:08.560 --> 00:51:10.080 Like I said, congratulations to you guys. 00:51:10.080 --> 00:51:11.800 Keep good, gonna keep working on this. 00:51:11.800 --> 00:51:16.700 But open source projects often struggle to get support, 00:51:16.700 --> 00:51:19.220 even when it blows my mind that they do. 00:51:20.600 --> 00:51:25.600 see projects like requests or flask or something like that. 00:51:25.600 --> 00:51:31.160 And so much of the world and the tech world in particular, 00:51:31.160 --> 00:51:33.260 where there's tons of extra money 00:51:33.260 --> 00:51:36.820 and there's not very much support, right? 00:51:36.820 --> 00:51:39.160 You know, as far as I know, 00:51:39.160 --> 00:51:41.720 David Lord isn't just mostly on his yacht 00:51:41.720 --> 00:51:44.240 and periodically accepting PRs, right? 00:51:44.240 --> 00:51:47.980 Like, but if you think of how foundational 00:51:47.980 --> 00:51:52.580 some of these projects are for so many companies. 00:51:52.580 --> 00:51:56.360 It seems almost like David should be on a yacht. 00:51:56.360 --> 00:51:57.200 You know what I mean? 00:51:57.200 --> 00:52:00.060 Like it should be easier for them 00:52:00.060 --> 00:52:01.620 to get really strong support. 00:52:01.620 --> 00:52:04.340 And here's an example of a company 00:52:04.340 --> 00:52:05.740 getting really good support, 00:52:05.740 --> 00:52:08.480 giving away to some degree. 00:52:08.480 --> 00:52:11.500 Can you talk about what the business model is 00:52:11.500 --> 00:52:13.940 or is it just growth and- 00:52:13.940 --> 00:52:15.620 - Right now we primarily, 00:52:15.620 --> 00:52:17.460 primarily we wanna focus on growth 00:52:17.460 --> 00:52:21.660 and really hammering home the user experience, right? 00:52:21.660 --> 00:52:23.400 One of the things you talked about is, 00:52:23.400 --> 00:52:25.180 maybe when someone fires this up, 00:52:25.180 --> 00:52:29.780 they're not used to seeing a textual type thing 00:52:29.780 --> 00:52:33.180 where I need to type in all the commands there. 00:52:33.180 --> 00:52:37.260 Everyone's just used to buttons, fancy web apps. 00:52:37.260 --> 00:52:40.500 So right now we really wanna hammer home 00:52:40.500 --> 00:52:44.060 the user experience, make it as fluid as possible. 00:52:44.060 --> 00:52:46.980 We're working on documentation, we're working on guides. 00:52:46.980 --> 00:52:52.020 Yeah, it seems like something that would lend itself really well to a bunch of small video 00:52:52.020 --> 00:52:57.420 videos on like you could just say help this goes, would you like to watch a video on how 00:52:57.420 --> 00:52:58.420 to do this? 00:52:58.420 --> 00:52:59.420 Two minutes? 00:52:59.420 --> 00:53:00.420 Yes. 00:53:00.420 --> 00:53:01.420 All right, I'll watch the video. 00:53:01.420 --> 00:53:02.420 Just like pop that up or something. 00:53:02.420 --> 00:53:03.420 Yeah, yeah, no, that's it. 00:53:03.420 --> 00:53:05.420 And you know, some series of those. 00:53:05.420 --> 00:53:06.420 Yeah. 00:53:06.420 --> 00:53:09.500 Because for example, you know, fundamental analysis or technical analysis are buried 00:53:09.500 --> 00:53:10.500 three or four menus down. 00:53:10.500 --> 00:53:16.020 And if you're downloading the tool to do that, you know, maybe you're going to be intimidated 00:53:16.020 --> 00:53:17.620 at first, 'cause you don't know where it is. 00:53:17.620 --> 00:53:18.460 - Right, right. 00:53:18.460 --> 00:53:20.660 I tried, I couldn't find it or whatever, yeah. 00:53:20.660 --> 00:53:23.300 - Yeah, so right now we wanna focus on the community 00:53:23.300 --> 00:53:25.900 and we wanna focus on the user experience. 00:53:25.900 --> 00:53:27.300 - Cool. 00:53:27.300 --> 00:53:30.020 All right, well, you've definitely got a little runway there 00:53:30.020 --> 00:53:31.420 so that's great. 00:53:31.420 --> 00:53:33.660 How many people are working on it now? 00:53:33.660 --> 00:53:38.140 - So our team is, so our team, 00:53:38.140 --> 00:53:40.460 first off, shout out to everyone 00:53:40.460 --> 00:53:42.400 bothering me on Slack during this. 00:53:44.300 --> 00:53:46.820 - I'm ignoring you because I'm talking about you, okay. 00:53:46.820 --> 00:53:47.660 - Pretty much. 00:53:47.660 --> 00:53:52.220 So shout out, we're at 15 right now. 00:53:52.220 --> 00:53:54.340 - Awesome. 00:53:54.340 --> 00:53:59.020 - I'll take this opportunity to mention 00:53:59.020 --> 00:54:00.820 that we do have some open job postings 00:54:00.820 --> 00:54:03.900 on our website as well at the moment. 00:54:03.900 --> 00:54:04.860 - Oh really, okay. 00:54:04.860 --> 00:54:11.180 - So yeah, just throwing that out there on our website, 00:54:12.140 --> 00:54:14.900 Openbb.co/company/careers. 00:54:14.900 --> 00:54:20.980 - Yeah, so I'm guessing some of these are Python-related ones? 00:54:20.980 --> 00:54:23.740 - Yep, yep. 00:54:23.740 --> 00:54:29.780 Or currently, currently we're looking for DevOps 00:54:29.780 --> 00:54:33.420 and we're also looking for some social media managers 00:54:33.420 --> 00:54:35.040 at the time. - Sure, cool. 00:54:35.040 --> 00:54:39.860 Remote, remote an option? 00:54:39.860 --> 00:54:41.340 - 100%. 00:54:41.340 --> 00:54:42.740 - Yeah. 00:54:42.740 --> 00:54:46.020 - Yeah, 100% remote, flexible hours. 00:54:46.020 --> 00:54:48.620 - Cool, very cool. 00:54:48.620 --> 00:54:51.100 Yeah, I know a lot of people are interested 00:54:51.100 --> 00:54:52.020 in finding new jobs. 00:54:52.020 --> 00:54:55.100 On one hand, if you're a software developer, 00:54:55.100 --> 00:54:59.540 you can kind of find jobs pretty easily these days 00:54:59.540 --> 00:55:00.860 because there's such a demand, 00:55:00.860 --> 00:55:02.960 but on the other, it's like, well, you can have this job, 00:55:02.960 --> 00:55:05.960 but all right, you've got to move to this city 00:55:05.960 --> 00:55:07.100 that you don't already live in, 00:55:07.100 --> 00:55:08.020 or you don't wanna move to, 00:55:08.020 --> 00:55:10.460 or you wanna change countries or whatever, right? 00:55:10.460 --> 00:55:12.500 So I think remote's pretty awesome. 00:55:12.500 --> 00:55:16.980 - Yeah, and we're spread out all over the globe. 00:55:16.980 --> 00:55:19.460 So it's a good time. 00:55:19.460 --> 00:55:20.420 - Yeah, absolutely. 00:55:20.420 --> 00:55:23.380 That's the way it should be, beautiful. 00:55:23.380 --> 00:55:27.740 Okay, well, I think that's about all I had to ask 00:55:27.740 --> 00:55:30.820 about all the things I wanted to make sure we covered, 00:55:30.820 --> 00:55:34.740 but yeah, it's something really cool you all built 00:55:34.740 --> 00:55:36.620 with Python and the data science stack 00:55:36.620 --> 00:55:39.660 and the open source growth is cool 00:55:39.660 --> 00:55:43.600 and the funding is, looks real positive, so awesome. 00:55:43.600 --> 00:55:47.540 I guess, you know, sounds like you accept PRs, 00:55:47.540 --> 00:55:49.180 people wanna contribute. 00:55:49.180 --> 00:55:50.020 - Yeah. 00:55:50.020 --> 00:55:51.860 - It seems like one of those projects that is very easy, 00:55:51.860 --> 00:55:54.100 not easy, but very open to contributions 00:55:54.100 --> 00:55:56.860 'cause it has so many sort of standalone little features, 00:55:56.860 --> 00:55:58.460 like, oh, I wanna add this new algorithm 00:55:58.460 --> 00:56:01.700 or this new picture to this part of it, right? 00:56:01.700 --> 00:56:03.900 You don't have to understand the whole system massively 00:56:03.900 --> 00:56:05.420 in order to do that, right? 00:56:05.420 --> 00:56:08.060 - Yeah, this was actually the first open source project 00:56:08.060 --> 00:56:09.740 that I myself worked on. 00:56:09.740 --> 00:56:12.280 I picked a good one to start on. 00:56:12.280 --> 00:56:17.280 No PR is too small, no issue. 00:56:17.280 --> 00:56:20.700 We are on Discord. 00:56:20.700 --> 00:56:23.340 I know a lot of people aren't huge fans of, 00:56:23.340 --> 00:56:25.900 you know, are putting the support there, 00:56:25.900 --> 00:56:27.300 saying, "Hey, come on Discord." 00:56:27.300 --> 00:56:29.940 But we're there if anyone has questions on how to install 00:56:29.940 --> 00:56:34.940 and how to submit a PR, any ideas, we're around to talk. 00:56:34.940 --> 00:56:36.240 - Yeah. 00:56:37.060 --> 00:56:37.900 - Awesome. 00:56:37.900 --> 00:56:40.380 All right, James, before you get out of here, though, 00:56:40.380 --> 00:56:43.140 I've got to ask you the final two questions. 00:56:43.140 --> 00:56:43.980 - Shoot. 00:56:43.980 --> 00:56:45.720 - All right, so if you're gonna work on this, 00:56:45.720 --> 00:56:46.660 write some Python code, 00:56:46.660 --> 00:56:49.420 what editor do you open up these days? 00:56:49.420 --> 00:56:54.420 - Oh, man, so I'm gonna get a lot of bad feedback 00:56:54.420 --> 00:56:57.260 from my team on this one, 00:56:57.260 --> 00:56:59.780 but I am a PyCharm person. 00:56:59.780 --> 00:57:04.220 Git scares me, and the fact that I can open up 00:57:04.220 --> 00:57:09.220 a GUI window makes my life a lot easier. 00:57:09.220 --> 00:57:12.940 Everyone else uses VS Code, 00:57:12.940 --> 00:57:15.060 so there's always a constant debate, 00:57:15.060 --> 00:57:16.360 but I'm a PyCharm. 00:57:16.360 --> 00:57:20.460 - Well, you won't get any negative feedback from me. 00:57:20.460 --> 00:57:21.700 I think PyCharm's awesome. 00:57:21.700 --> 00:57:25.740 I use it as well, and all the PR features 00:57:25.740 --> 00:57:28.660 and get features built into it are pretty excellent. 00:57:28.660 --> 00:57:30.340 - Yeah, VS Code's also great. 00:57:30.340 --> 00:57:33.340 Love to those guys as well. 00:57:33.340 --> 00:57:34.300 - Yeah, I think, you know, 00:57:34.300 --> 00:57:35.940 when I started asking this question, 00:57:35.940 --> 00:57:38.140 six, seven years ago, whatever it was, 00:57:38.140 --> 00:57:40.500 it was like, I don't know what this person, 00:57:40.500 --> 00:57:43.260 like, I really don't know what this person is gonna say. 00:57:43.260 --> 00:57:44.340 It could be anything. 00:57:44.340 --> 00:57:45.740 It could be something like random thing 00:57:45.740 --> 00:57:46.580 I haven't even heard of. 00:57:46.580 --> 00:57:47.400 Like, that's an editor? 00:57:47.400 --> 00:57:49.040 Okay, let me research that. 00:57:49.040 --> 00:57:50.340 These days, it's really down, 00:57:50.340 --> 00:57:53.400 it's down to two contenders, pretty much, 00:57:53.400 --> 00:57:56.340 unless you get the Vim, Emacs, Engel, 00:57:56.340 --> 00:57:58.660 which is not as popular, but yeah, 00:57:58.660 --> 00:58:00.140 it's down to those two pretty much. 00:58:00.140 --> 00:58:00.980 Awesome. - Yeah. 00:58:02.580 --> 00:58:03.820 - Notepad. 00:58:03.820 --> 00:58:04.660 - Yeah. 00:58:04.660 --> 00:58:06.820 You just gotta read something. 00:58:06.820 --> 00:58:07.920 All right, and then, 00:58:07.920 --> 00:58:10.580 notable PyPI package, 00:58:10.580 --> 00:58:12.180 something you wanna give a shout out to? 00:58:12.180 --> 00:58:14.140 - Oh man, we have so many, as I said, 00:58:14.140 --> 00:58:17.900 you know, 200-ish. 00:58:17.900 --> 00:58:20.320 One of the ones that's been really great, 00:58:20.320 --> 00:58:22.900 another open source project, the rich package. 00:58:22.900 --> 00:58:27.900 That's what we use to add all the colorful text interfaces, 00:58:27.900 --> 00:58:30.060 as well as the prompt toolkit, 00:58:30.060 --> 00:58:31.500 another great open source package 00:58:31.500 --> 00:58:34.860 that's what does our auto-completes and whatnot 00:58:34.860 --> 00:58:36.740 to try to make it a little bit easier 00:58:36.740 --> 00:58:38.220 on the user experience. 00:58:38.220 --> 00:58:39.900 - That's fantastic, okay. 00:58:39.900 --> 00:58:40.740 - So there's two. 00:58:40.740 --> 00:58:42.460 - Yeah, I like Prompt Toolkit as well, 00:58:42.460 --> 00:58:44.700 and of course Rich. 00:58:44.700 --> 00:58:47.380 And you know, speaking of-- 00:58:47.380 --> 00:58:50.540 - Textual. - Oh, I/O, right. 00:58:50.540 --> 00:58:52.760 Speaking of open source projects, 00:58:52.760 --> 00:58:54.180 that is not the right one. 00:58:54.180 --> 00:58:59.220 But it's really cool that 00:59:00.400 --> 00:59:05.400 Will McGugan has got textualize.io 00:59:05.400 --> 00:59:07.120 is what I was looking for. 00:59:07.120 --> 00:59:11.440 Has really found a place building great TUIs, 00:59:11.440 --> 00:59:13.960 text user interfaces with Rich, 00:59:13.960 --> 00:59:15.720 and there's just so many things based on it. 00:59:15.720 --> 00:59:20.200 And he also has some funding as well to keep going there, 00:59:20.200 --> 00:59:24.080 which is, I think, another one of the bright, 00:59:24.080 --> 00:59:26.500 awesome pieces of news around sort of, you know, 00:59:26.500 --> 00:59:28.940 vibrant open source in Python. 00:59:28.940 --> 00:59:32.180 - Yeah, I mean, the rich package is fantastic. 00:59:32.180 --> 00:59:37.020 Yeah, it's all we use now. 00:59:37.020 --> 00:59:37.860 - That's awesome. 00:59:37.860 --> 00:59:39.980 It's like got some crazy new feature every week. 00:59:39.980 --> 00:59:41.380 It's all-- - Pretty much. 00:59:41.380 --> 00:59:42.900 - Never sitting still. 00:59:42.900 --> 00:59:46.140 All right, well, James, 00:59:46.140 --> 00:59:47.820 it's been great to have you on the show. 00:59:47.820 --> 00:59:49.580 Thank you so much for coming on 00:59:49.580 --> 00:59:51.820 and sharing a look with your project. 00:59:51.820 --> 00:59:54.120 - Yeah, no, thank you so much for having me. 00:59:54.120 --> 00:59:56.740 It's really great. 00:59:56.740 --> 00:59:58.380 - Yeah, you bet. 00:59:58.380 --> 00:59:59.220 See you later. 00:59:59.220 --> 01:00:00.380 - All right, take care. 01:00:00.380 --> 01:00:01.380 - Bye. - Go Bills.