Algorithmic Trading Using Python
01:37 OK
项目介绍:
利用iex api获取S&P 500的相关信息,并以excel文件的形式储存到本地。
学到的知识点:
1.将账户、Token等敏感信息储存到文件中,然后在程序中读取出来。
2.将列表分为几十个一个的“块”。
3.批量从API获取数据,大大提高获取数据的速度。
4.对用户输入的数据进行类型判断。
5.将数据储存到excel文件时进行格式化,美化表格。
一、申请iex api
在https://iexcloud.io/docs/api/申请一个Token,并且将token储存到secrets.py文件中。secrets.py文件的内容为:
IEX_CLOUD_API_TOKEN = 'Tpk_059b97af715d417d9f49f50b51b1cxxx'
二、获取单个股票信息
import numpy as np #The Numpy numerical computing library
import pandas as pd #The Pandas data science library
import requests #The requests library for HTTP requests in Python
import xlsxwriter #The XlsxWriter libarary for
import math #The Python math module
from secrets import IEX_CLOUD_API_TOKEN #import Token from secrets.py file
stocks = pd.read_csv('sp_500_stocks.csv')
my_columns = ['Ticker', 'Price','Market Capitalization', 'Number Of Shares to Buy']
symbol='AAPL'
api_url = f'https://sandbox.iexapis.com/stable/stock/{symbol}/quote?token={IEX_CLOUD_API_TOKEN}'
data = requests.get(api_url).json()
final_dataframe = pd.DataFrame(columns = my_columns)
final_dataframe = final_dataframe.append(
pd.Series(['AAPL',
data['latestPrice'],
data['marketCap'],
'N/A'],
index = my_columns),
ignore_index = True)
print(final_dataframe)
运行结果

三、批量获取股票信息
import numpy as np #The Numpy numerical computing library
import pandas as pd #The Pandas data science library
import requests #The requests library for HTTP requests in Python
import xlsxwriter #The XlsxWriter libarary for
import math #The Python math module
from secrets import IEX_CLOUD_API_TOKEN #import Token from secrets.py file
stocks = pd.read_csv('sp_500_stocks.csv')
my_columns = ['Ticker', 'Price','Market Capitalization', 'Number Of Shares to Buy'] #设定标题栏
# Function sourced from
# https://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks
def chunks(lst, n):
"""Yield successive n-sized chunks from lst."""
for i in range(0, len(lst), n):
yield lst[i:i + n]
symbol_groups = list(chunks(stocks['Ticker'], 100))
symbol_strings = []
for i in range(0, len(symbol_groups)):
symbol_strings.append(','.join(symbol_groups[i]))
# print(symbol_strings[i])
final_dataframe = pd.DataFrame(columns = my_columns)
for symbol_string in symbol_strings:
# print(symbol_strings)
batch_api_call_url = f'https://sandbox.iexapis.com/stable/stock/market/batch/?types=quote&symbols={symbol_string}&token={IEX_CLOUD_API_TOKEN}'
data = requests.get(batch_api_call_url).json()
for symbol in symbol_string.split(','):
final_dataframe = final_dataframe.append(
pd.Series([symbol,
data[symbol]['quote']['latestPrice'],
data[symbol]['quote']['marketCap'],
'N/A'],
index = my_columns),
ignore_index = True)
# print(final_dataframe)
portfolio_size = input("Enter the value of your portfolio:")
#判断输入的数据是否是数字
try:
val = float(portfolio_size)
except ValueError:
print("That's not a number! \n Try again:")
portfolio_size = input("Enter the value of your portfolio:")
position_size = float(portfolio_size) / len(final_dataframe.index)
for i in range(0, len(final_dataframe['Ticker'])-1):
final_dataframe.loc[i, 'Number Of Shares to Buy'] = math.floor(position_size / final_dataframe['Price'][i])
writer = pd.ExcelWriter('recommended_trades.xlsx', engine='xlsxwriter')
final_dataframe.to_excel(writer, sheet_name='Recommended Trades', index = False)
background_color = '#0a0a23'
font_color = '#ffffff'
string_format = writer.book.add_format(
{
'font_color': font_color,
'bg_color': background_color,
'border': 1
}
)
dollar_format = writer.book.add_format(
{
'num_format':'$0.00',
'font_color': font_color,
'bg_color': background_color,
'border': 1
}
)
integer_format = writer.book.add_format(
{
'num_format':'0',
'font_color': font_color,
'bg_color': background_color,
'border': 1
}
)
column_formats = {
'A': ['Ticker', string_format],
'B': ['Price', dollar_format],
'C': ['Market Capitalization', dollar_format],
'D': ['Number of Shares to Buy', integer_format]
}
for column in column_formats.keys():
writer.sheets['Recommended Trades'].set_column(f'{column}:{column}', 20, column_formats[column][1])
writer.sheets['Recommended Trades'].write(f'{column}1', column_formats[column][0], string_format)
writer.save()
运行结果


source: https://www.youtube.com/watch?v=xfzGZB4HhEE