优化代码,提高运行速度
时间: 2023-08-16 08:34:33 浏览: 154
Extjs优化(一)删除冗余代码提高运行速度
好的,以下是对代码的一些优化:
1. 使用多线程或协程加速数据获取过程
获取股票数据是一个相对较慢的过程,可以使用多线程或协程并发地获取数据,从而提高运行速度。例如可以使用Python的`concurrent.futures`模块来实现多线程或协程。
2. 使用pandas的查询操作来替代循环
在筛选股票的过程中,可以使用pandas的查询操作来替代循环,从而提高运行速度。例如可以使用`query`方法来查询符合条件的股票。
3. 缓存数据
在获取股票数据时,可以将数据缓存到本地,避免每次都重新获取数据。例如可以使用Python的`pickle`模块将数据序列化并保存到本地,下次运行时再读取缓存数据。
综上所述,以下是优化后的代码:
```python
import tushare as ts
import pandas as pd
import datetime
import concurrent.futures
import pickle
# 设置tushare token
ts.set_token('YOUR_TOKEN_HERE')
# 定义获取股票数据的函数
def get_stock_data(ts_code):
pro = ts.pro_api()
trade_date = datetime.date.today() - datetime.timedelta(days=30)
trade_date_str = trade_date.strftime('%Y%m%d')
df_k = pro.daily(ts_code=ts_code, start_date=trade_date_str, fields='trade_date,close,vol')
df_ma = ts.pro_bar(ts_code=ts_code, adj='qfq', start_date=trade_date_str, ma=[5])
return df_k, df_ma
# 定义筛选股票的函数
def filter_stocks(df):
# 筛选出每日成交额各前100的股票
df_grouped = df.groupby('trade_date').apply(lambda x: x.nlargest(100, 'vol'))
df_filtered = df_grouped.reset_index(drop=True)
# 获取今天的日期
today_str = datetime.date.today().strftime('%Y%m%d')
# 采用tushare均线接口,选出收盘价位于五日线上方且成交量小于前三天的股票
selected_stocks = set()
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
futures = []
for ts_code in df_filtered['ts_code'].unique():
futures.append(executor.submit(get_stock_data, ts_code))
for future in concurrent.futures.as_completed(futures):
df_k, df_ma = future.result()
if len(df_k) == 0 or len(df_ma) == 0:
continue
today_close = df_k.iloc[-1]['close']
ma5 = df_ma.iloc[-1]['ma5']
vol = df_k.iloc[-1]['vol']
prev_vol = df_k.iloc[-4]['vol']
if today_close > ma5 and vol < prev_vol:
selected_stocks.add(df_k.iloc[-1]['ts_code'])
return pd.DataFrame(list(selected_stocks), columns=['ts_code'])
# 先尝试从缓存中读取数据
try:
with open('stock_data.pkl', 'rb') as f:
df = pickle.load(f)
except:
# 缓存中没有数据时,从tushare获取股票数据
pro = ts.pro_api()
trade_date = datetime.date.today() - datetime.timedelta(days=30)
trade_date_str = trade_date.strftime('%Y%m%d')
df = pro.daily(trade_date=trade_date_str, fields='ts_code,trade_date,close,vol')
# 将数据缓存到本地
with open('stock_data.pkl', 'wb') as f:
pickle.dump(df, f)
# 筛选股票并保存结果到文件
selected_df = filter_stocks(df)
selected_df.to_csv('selected_stocks.csv', index=False)
```
请注意,以上代码仅供参考,具体实现方式会根据不同情况而有所不同。
阅读全文