利用20天移动平均交易策略,构建数据查询和可视化函数kline_plot,完整的代码将在知识星球上共享。可视化选择的股票日K线、20日移动平均线、成交量和交易信号。以002790和300573股票的K线为例。
kline_plot("002790.SZ")
复制代码
kline_plot("300573.SZ")
复制代码
Python实战案例
对筛选出的股票进一步分析:
select_data=pd.DataFrame()
for code in codes:
try:
df_= df_all_data[df_all_data.ts_code.values==code]
df_.index=pd.to_datetime(df_.trade_date)
df_=df_.sort_index()
select_data[code]=df_.close
except:
pass
select_data.fillna(method="ffill",inplace=True)
select_data.tail()
ret=select_data.apply(lambda x:x/x.shift(1)-1)
ret=ret.dropna()
ret.tail()
prod_ret=ret.apply(lambda x:(1 x).cumprod())
prod_ret.plot(figsize=(12,5))
plt.xlabel("",fontsize=15)
plt.title(“股票池累计净值”,size=15)
ax = plt.gca()
ax.spines["right"].set_color("none")
ax.spines["top"].set_color("none")
plt.show()
复制代码
#根据代码从数据库中获取数据
def get_data_from_sql(code):
from sqlalchemy import create_engine
engine = create_engine("postgresql psycopg2://postgres:123456@localhost:5432/postgres")
data=pd.read_sql(f"select * from stock_data where ts_code="{code}"",engine)
data.index=pd.to_datetime(data.trade_date)
data=data.sort_index()
#计算20日均线
data[ma20]=data.close.rolling(20).mean()
return data
复制代码
查询股价日跌幅超过-5%的股票数据分布:
c3="pct_chg<-9.5"
t3=“股价跌幅超过-9.5%的股票时间分布”
plot_data(c3,t3)
复制代码
构建一个数据更新函数,可以下载并插入其他时间周期。2018年1月1日至2019年4月25日,数据达到108万条。
#更新或下载其他期间的数据
def update_sql(start,end,db_name):
from datetime import datetime,timedelta
for code in get_code():
data=get_data(code,start,end)
insert_sql(data,db_name)
print(f"{start}:{end}期间数据已成功更新)
#20180101-2018123年下载数据
#只需操作一次,不再操作后可注释
#下载数据比较慢,大约需要20-35分钟
start="20180101"
end="20181231"
db_name="stock_data"
#数据下载和存储数据库
update_sql(start,end,db_name)
#使用pandasread_sql读取数据
df_all_data=pd.read_sql("stock_data",engine)
print(len(df_all_data))
#输出结果:1087050
#查看交易代码和交易日的数量
print(len(df_all_data.ts_code.unique()))
print(len(df_all_data.trade_date.unique()))
#输出结果:3604;319
d=df_all_data.trade_date.unique()
print(d.max())
print(d.min())
2019-04-25T00:00:00.000000000
2018-01-02T00:00:00.000000000
#2019年4月25日获取交易日数据
pd.read_sql("select * from stock_data where trade_date="2019-04-25" ",engine).head()
复制代码
构建数据查询和可视化函数:
def plot_data(condition,title):
from pyecharts import Bar
from sqlalchemy import create_engine
engine = create_engine("postgresql psycopg2://postgres:123456@localhost:5432/postgres")
data=pd.read_sql("select * from stock_data where " condition,engine)
count_=data.groupby("trade_date")["ts_code"].count()
attr=count_.index
v1=count_.values
bar=Bar(title,title_text_size=15)
bar.add("",attr,v1,is_splitline_show=False,linewidth=2)
return bar
查询股价低于2元的股票数据分布
c1="close<2"
t1=“股价低于2元个股时间分布”
plot_data(c1,t1)
复制代码
由于市场数据量大,下载速度慢,20190101-20190425期间日交易。
点击此免费领取:CSDN礼包:免费分享《python学习路线&全套学习资料》
默认时间可以随时更改数据获取函数。
#如果报错,将tushare升级到最新
def get_data(code,start="20190101",end="20190425"):
df=ts.pro_bar(ts_code=code, adj="qfq", start_date=start, end_date=end)
return df
获取股票代码函数,获取最新交易日代码。
#获取当前交易日最新的股票代码和缩写
def get_code():
codes = pro.stock_basic(list_status="L").ts_code.values
return codes
复制代码
Python学习大纲
整理Python各个方向的技术点,形成各个领域的知识点总结。它的目的是根据上述知识点找到相应的学习资源,以确保你学习得更全面。
插入PostgreSQL数据库操作,try用于函数...except..pass是为了避免一些数据错误导致程序崩溃。
from sqlalchemy import create_engine
import psycopg2
engine = create_engine("postgresql psycopg2://postgres:123456@localhost:5432/postgres")
def insert_sql(data,db_name,if_exists="append"):
#使用try...except..continue避免错误,运行崩溃
try:
data.to_sql(db_name,engine,index=False,if_exists=if_exists)
#print(code “成功写入数据库”
except:
pass
复制代码
实例应用
利用tushare获取当地3000多个股票市场数据,以psycopg2和sqlalchemy为接口,将数据存储在当地postgresql数据库中,便于进一步查询和操作。
#首先介绍可能使用的库,以后分析和可视化
import tushare as ts
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#中文和负号出现在正常显示屏中
from pylab import mpl
mpl.rcParams["font.sans-serif"]=["SimHei"]
mpl.rcParams["axes.unicode_minus"]=False
#设置token
token=“输入你的token”
pro = ts.pro_api(token)
复制代码
事实上,每个程序员也可以意识到自己面临的困难,但能及时做出改变的人太少了。毕竟,更多的人忙于工作,没有指导,他们不擅长计划。大多数人显然“泰山崩溃了,脸像土壤”只能看着自己被这个行业淘汰吗?
查询股价日涨幅超过5%的股票数据分布:
c2="pct_chg>9.5"
t2=“股价涨幅超过9.5%的股票时间分布”
plot_data(c2,t2)
复制代码
一切都要尽快,特别是在技术行业,必须提高技术基础。
PostgresQL安装和使用
数据,后续不断更新。
#下载20190101-20190425年数据,插入数据库stock_data
#这一步大约需要25-35分钟
for code in get_code():
data=get_data(code)
insert_sql(data,"stock_data")
#读取整个表数据
df=pd.read_sql("stock_data",engine)
print(len(df))
#输出结果:270998
#选取ts_code=000001.SZ的股票数据
df=pd.read_sql("select * from stock_data where ts_code="000001.SZ"",engine)
print(len(df))
复制代码
这些材料是学习软件测试合作伙伴的完整宝库,包括一些真实的面试问题和一些学习材料,但也有助于许多学习软件测试合作伙伴。
Python学习教程:手把手教你建立自己的量化分析数据库
结合选股策略,查询和提取数据库:
#筛选代码
#获取当前交易的股票代码和名称
def get_new_code(date):
#获取当前所有交易的股票代码
df0 = pro.stock_basic(exchange="", list_status="L")
df1 =pro.daily_basic(trade_date=date)
df=pd.merge(df0,df1,on="ts_code")
#排除2017年以后上市的新股
df=df[df["list_date"].apply(int).values<20170101]
#剔除st股
df=df[-df["name"].apply(lambda x:x.startswith("*ST"))]
#消除动态市盈率为负的情况
df=df[df.pe_ttm>0]
#排除大市值股
df=df[df.circ_mv<10**5]
#排除价格高于20元的股票
#df=df[df.close<20]
codes=df.ts_code.values
return codes
len(get_new_code("20190425"))
#输出结果:46
import talib as ta
#20日均线交易策略
def find_stock(date):
f_code=[]
for code in get_new_code(date):
try:
data=df_all_data.loc[df_all_data.ts_code==code].copy()
data.index=pd.to_datetime(data.trade_date)
data=data.sort_index()
data["ma_20"]=ta.MA(data.close,timeperiod=20)
if data.iloc[-1]["close"]>data.iloc[-1]["ma_20"]:
f_code.append(code)
except:
pass
return f_code
fs=find_stock("20190305")
print(f“筛选出的股票数量:{len(fs)}")
if fs:
df_find_stocks=pd.DataFrame(fs,columns=["ts_code"])
#将选定的股票存储在数据库中,如果表已经存在,则相当于每次更新
insert_sql(df_find_stocks,"find_stocks",if_exists="replace")
print(“筛选出的股票已入库”)
筛选出的股票数量:9
筛选的股票已入库
#查看数据库中筛选出的股票池
codes=pd.read_sql("find_stocks",engine)
codes=codes.values.tolist()
codes=[c[0] for c in codes]
#print(codes)
复制代码
文章为作者独立观点,不代表股票配资公司观点