siat 3.0.41__py3-none-any.whl → 3.0.43__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- siat/common.py +11 -0
- siat/financials_china.py +48 -23
- siat/financials_china2.py +4 -4
- siat/risk_adjusted_return2.py +30 -18
- siat/security_prices.py +24 -7
- siat/security_trend2.py +1 -0
- siat/stock.py +8 -2
- siat/stock_china.py +22 -22
- siat/translate.py +137 -63
- {siat-3.0.41.dist-info → siat-3.0.43.dist-info}/METADATA +1 -1
- {siat-3.0.41.dist-info → siat-3.0.43.dist-info}/RECORD +13 -13
- {siat-3.0.41.dist-info → siat-3.0.43.dist-info}/WHEEL +1 -1
- {siat-3.0.41.dist-info → siat-3.0.43.dist-info}/top_level.txt +0 -0
siat/common.py
CHANGED
@@ -3854,5 +3854,16 @@ def upgrade_siat(module_list=['siat','akshare','pandas','pandas_datareader', \
|
|
3854
3854
|
|
3855
3855
|
return
|
3856
3856
|
#==============================================================================
|
3857
|
+
|
3858
|
+
def df_index_timezone_remove(df):
|
3859
|
+
"""
|
3860
|
+
功能:去掉df索引日期中的时区信息,避免日期过滤时出错
|
3861
|
+
注意:从雅虎财经获取的数据中日期索引项很可能带有时区
|
3862
|
+
"""
|
3863
|
+
import pandas as pd
|
3864
|
+
df.index = pd.to_datetime(df.index)
|
3865
|
+
df.index = df.index.tz_localize(None)
|
3866
|
+
|
3867
|
+
return df
|
3857
3868
|
#==============================================================================
|
3858
3869
|
#==============================================================================
|
siat/financials_china.py
CHANGED
@@ -655,7 +655,8 @@ if __name__=='__main__':
|
|
655
655
|
|
656
656
|
def compare_dupont_china(tickerlist,fsdate='latest',scale1 = 10,scale2 = 10, \
|
657
657
|
hatchlist=['.', 'o', '\\'],printout=True,sort='PM', \
|
658
|
-
facecolor='papayawhip',font_size='16px'
|
658
|
+
facecolor='papayawhip',font_size='16px',
|
659
|
+
loc='best'):
|
659
660
|
"""
|
660
661
|
功能:获得tickerlist中每只股票的杜邦分析项目,绘制柱状叠加比较图
|
661
662
|
tickerlist:股票代码列表,建议在10只以内
|
@@ -724,6 +725,12 @@ def compare_dupont_china(tickerlist,fsdate='latest',scale1 = 10,scale2 = 10, \
|
|
724
725
|
}
|
725
726
|
|
726
727
|
df = pd.DataFrame(raw_data,columns=[ticker,name1,name2,name3,name4,name5])
|
728
|
+
if len(df)==0:
|
729
|
+
print('')
|
730
|
+
print(" #Error(compare_dupont_china): no data to plot dupont identity bar chart.")
|
731
|
+
print(" If the stock code is correct, you may suffer from anti-spyder from data source. Try later")
|
732
|
+
return None
|
733
|
+
|
727
734
|
if sort=='PM':
|
728
735
|
df.sort_values(name1,ascending=False,inplace=True)
|
729
736
|
elif sort=='TAT':
|
@@ -736,7 +743,7 @@ def compare_dupont_china(tickerlist,fsdate='latest',scale1 = 10,scale2 = 10, \
|
|
736
743
|
num=len(df['公司'])
|
737
744
|
for i in range(num):
|
738
745
|
code=df.loc[i,'公司']
|
739
|
-
df.loc[i,'公司']=ticker_name(code).replace("(A股)",'')
|
746
|
+
df.loc[i,'公司']=ticker_name(code,'stock').replace("(A股)",'')
|
740
747
|
|
741
748
|
f,ax1 = plt.subplots(1,figsize=(10,5))
|
742
749
|
w = 0.75
|
@@ -752,6 +759,11 @@ def compare_dupont_china(tickerlist,fsdate='latest',scale1 = 10,scale2 = 10, \
|
|
752
759
|
ax1.bar(x,df[name1],width=w,label=name1,alpha=0.5,color='blue', \
|
753
760
|
hatch=hatchlist[2], edgecolor='black',align='center')
|
754
761
|
|
762
|
+
#判断是否绘制零线
|
763
|
+
pm_max=df[name1].max(); pm_min=df[name1].min()
|
764
|
+
if pm_max * pm_min < 0:
|
765
|
+
plt.axhline(y=0,ls=":",c="black",linewidth=2,label='')
|
766
|
+
|
755
767
|
plt.xticks(tick_pos,df[ticker])
|
756
768
|
plt.ylabel("杜邦分析分解项目")
|
757
769
|
|
@@ -768,8 +780,17 @@ def compare_dupont_china(tickerlist,fsdate='latest',scale1 = 10,scale2 = 10, \
|
|
768
780
|
footnote2=footnote+'\n'+footnote1+'\n'+"数据来源:sina/EM,"+str(today)
|
769
781
|
plt.xlabel(footnote2)
|
770
782
|
|
771
|
-
plt.legend(loc=
|
772
|
-
|
783
|
+
plt.legend(loc=loc)
|
784
|
+
|
785
|
+
titletxt1="杜邦分析对比图:"
|
786
|
+
if sort=='PM':
|
787
|
+
titletxt2="按照"+name1+"降序排列"
|
788
|
+
elif sort=='TAT':
|
789
|
+
titletxt2="按照"+name2+"降序排列"
|
790
|
+
else:
|
791
|
+
titletxt2="按照"+name3+"降序排列"
|
792
|
+
|
793
|
+
plt.title(titletxt1+titletxt2)
|
773
794
|
plt.xlim([min(tick_pos)-w,max(tick_pos)+w])
|
774
795
|
|
775
796
|
plt.gca().set_facecolor('whitesmoke')
|
@@ -794,7 +815,7 @@ def compare_dupont_china(tickerlist,fsdate='latest',scale1 = 10,scale2 = 10, \
|
|
794
815
|
print("===== 杜邦分析分项数据表 =====")
|
795
816
|
print("*** 数据来源:sina/EM,"+str(today))
|
796
817
|
"""
|
797
|
-
title_txt="
|
818
|
+
title_txt="杜邦分析分项数据表:"+titletxt2
|
798
819
|
footnote0="1、表中各个上市公司的财报日期可能存在差异,但均为可获得(已公布)的最新财报"
|
799
820
|
footnote1="2、表中数值基于期末数字直接计算,而非期初期末均值,可能与公告数字存在差异。"
|
800
821
|
footnote2="*** 数据来源:sina/EM,"+str(today)
|
@@ -2274,12 +2295,12 @@ def cn_codetranslate(ticker):
|
|
2274
2295
|
"""
|
2275
2296
|
result,prefix,suffix=split_prefix_suffix(ticker)
|
2276
2297
|
if suffix in SUFFIX_LIST_CN:
|
2277
|
-
name=ticker_name(ticker)
|
2298
|
+
name=ticker_name(ticker,'stock')
|
2278
2299
|
|
2279
2300
|
if suffix =='':
|
2280
2301
|
for s in SUFFIX_LIST_CN:
|
2281
2302
|
ticker_try=ticker+'.'+s
|
2282
|
-
name=ticker_name(ticker_try)
|
2303
|
+
name=ticker_name(ticker_try,'stock')
|
2283
2304
|
print('\b'*99," Looking for the short name of stock",ticker)
|
2284
2305
|
if not (name == ticker_try): break
|
2285
2306
|
|
@@ -2446,7 +2467,7 @@ def compare_history_china(tickers,items,start,end,period_type='annual', \
|
|
2446
2467
|
#collabel=ectranslate(item1)
|
2447
2468
|
collabel=colname
|
2448
2469
|
ylabeltxt=''
|
2449
|
-
titletxt=ticker_name(ticker1)+": 财务指标历史"
|
2470
|
+
titletxt=ticker_name(ticker1,'stock')+": 财务指标历史"
|
2450
2471
|
|
2451
2472
|
colmin=round(df1[colname].min(),2)
|
2452
2473
|
colmax=round(df1[colname].max(),2)
|
@@ -2500,9 +2521,9 @@ def compare_history_china(tickers,items,start,end,period_type='annual', \
|
|
2500
2521
|
colmin2=round(df2[colname2].min(),2)
|
2501
2522
|
colmax2=round(df2[colname2].max(),2)
|
2502
2523
|
colmean2=round(df2[colname2].mean(),2)
|
2503
|
-
footnote1=ticker_name(ticker1)+":"+ \
|
2524
|
+
footnote1=ticker_name(ticker1,'stock')+":"+ \
|
2504
2525
|
str(colmin1)+" - "+str(colmax1)+",均值"+str(colmean1)
|
2505
|
-
footnote2=ticker_name(ticker2)+":"+ \
|
2526
|
+
footnote2=ticker_name(ticker2,'stock')+":"+ \
|
2506
2527
|
str(colmin2)+" - "+str(colmax2)+",均值"+str(colmean2)
|
2507
2528
|
footnote=footnote1+'\n'+footnote2+'\n'+footnote9
|
2508
2529
|
|
@@ -2589,7 +2610,7 @@ def compare_snapshot_china(tickers,itemk,endDate='latest',datatag=True,tag_offse
|
|
2589
2610
|
t=rdf['ticker'].values[0]
|
2590
2611
|
item=cols[1]
|
2591
2612
|
value=rdf[item].values[0]
|
2592
|
-
name=ticker_name(t)
|
2613
|
+
name=ticker_name(t,'stock')
|
2593
2614
|
if name == t:
|
2594
2615
|
name=rdf[cols[2]].values[0]
|
2595
2616
|
row=pd.Series({'ticker':t,'item':item,'value':value,'name':name})
|
@@ -2674,7 +2695,7 @@ def compare_tax_china(tickers,endDate='latest',datatag=True,tag_offset=0.01,grap
|
|
2674
2695
|
print(" #Error(compare_tax_china): failed to get financial info for",t)
|
2675
2696
|
continue
|
2676
2697
|
df1=df0.tail(1)
|
2677
|
-
name=ticker_name(t)
|
2698
|
+
name=ticker_name(t,'stock')
|
2678
2699
|
reportdate=df1.index[0]
|
2679
2700
|
taxrate=df1['tax rate'][0]
|
2680
2701
|
row=pd.Series({'ticker':t,'name':name,'date':reportdate,'tax rate%':round(taxrate*100,2)})
|
@@ -2773,7 +2794,7 @@ def compare_igr_sgr_china(tickers,endDate='latest',graph=True,axisamp1=1.3,axisa
|
|
2773
2794
|
if igr is None or sgr is None:
|
2774
2795
|
print(" #Warning(compare_igr_sgr_china): no stock info found for",t)
|
2775
2796
|
continue
|
2776
|
-
name=ticker_name(t)
|
2797
|
+
name=ticker_name(t,'stock')
|
2777
2798
|
row=pd.Series({'ticker':t,'name':name,'IGR%':round(igr*100,2),'SGR%':round(sgr*100,2)})
|
2778
2799
|
try:
|
2779
2800
|
df=df.append(row,ignore_index=True)
|
@@ -2848,7 +2869,7 @@ def dupont_decompose_china(ticker,fsdate,gview=False,facecolor='papayawhip'):
|
|
2848
2869
|
#亿元
|
2849
2870
|
yi=100000000
|
2850
2871
|
|
2851
|
-
company_name=ticker_name(ticker)
|
2872
|
+
company_name=ticker_name(ticker,'stock')
|
2852
2873
|
# 定义杜邦分解项目变量
|
2853
2874
|
|
2854
2875
|
roe='【'+company_name+'】\n('+fsdate+')\n'+'净资产收益率'
|
@@ -3231,7 +3252,7 @@ def dupont_decompose_china(ticker,fsdate,gview=False,facecolor='papayawhip'):
|
|
3231
3252
|
|
3232
3253
|
from graphviz import Digraph
|
3233
3254
|
#按各公司的层数生产分层的节点:
|
3234
|
-
g=Digraph(name=ticker_name(ticker)+fsdate)
|
3255
|
+
g=Digraph(name=ticker_name(ticker,'stock')+fsdate)
|
3235
3256
|
|
3236
3257
|
for key in dic:
|
3237
3258
|
for n in range(number_of_layers+1):
|
@@ -3256,7 +3277,7 @@ def dupont_decompose_china(ticker,fsdate,gview=False,facecolor='papayawhip'):
|
|
3256
3277
|
|
3257
3278
|
#打印信息
|
3258
3279
|
if not gview:
|
3259
|
-
print("\n注:",ticker_name(ticker),"\b,金额单位:亿元,财报日期:",fsdate)
|
3280
|
+
print("\n注:",ticker_name(ticker,'stock'),"\b,金额单位:亿元,财报日期:",fsdate)
|
3260
3281
|
print("1、为避免图示过大,这里未列出所有分解项目")
|
3261
3282
|
print("2、金融机构报表与普通企业结构不同,此处仅为约算")
|
3262
3283
|
print("3、应收款项包括应收账款、应收利息、应收保费以及应收票据等")
|
@@ -3429,7 +3450,7 @@ def get_fin_summary_1ticker_china(ticker,fsdates):
|
|
3429
3450
|
try:
|
3430
3451
|
dft2=dft[['选项','指标']+fsdates3]
|
3431
3452
|
except:
|
3432
|
-
print(" #Warning(get_fin_summary_1ticker_china): fin stmt of",fsdates3[0],"unavailable for",ticker+'('+ticker_name(ticker)+')')
|
3453
|
+
print(" #Warning(get_fin_summary_1ticker_china): fin stmt of",fsdates3[0],"unavailable for",ticker+'('+ticker_name(ticker,'stock')+')')
|
3433
3454
|
return None
|
3434
3455
|
|
3435
3456
|
# 金额变换:元-->亿元,小数位截取
|
@@ -3545,6 +3566,10 @@ if __name__=='__main__':
|
|
3545
3566
|
tickers=['000002.SZ','600048.SS','001979.SZ','600325.SS','000069.SZ','600383.SS','600895.SS','601155.SS']
|
3546
3567
|
fsdates='2022-12-31'
|
3547
3568
|
|
3569
|
+
tickers=['002373.SZ', '002279.SZ', '002368.SZ', '600410.SS', '603927.SS', '002405.SS']
|
3570
|
+
fsdates='2023-12-31'
|
3571
|
+
|
3572
|
+
|
3548
3573
|
def compare_fin_summary_china(tickers,fsdates,facecolor='whitesmoke',font_size='16px'):
|
3549
3574
|
"""
|
3550
3575
|
功能:分类别显示财报摘要中的指标
|
@@ -3715,7 +3740,7 @@ def compare_fin_summary_china(tickers,fsdates,facecolor='whitesmoke',font_size='
|
|
3715
3740
|
titletxt="\n===== 上市公司财务报表摘要:"+ticker_name(ticker1)+" ====="
|
3716
3741
|
print(titletxt)
|
3717
3742
|
"""
|
3718
|
-
titletxt=ticker_name(ticker1)+':'+"财报摘要"
|
3743
|
+
titletxt=ticker_name(ticker1,'stock')+':'+"财报摘要"
|
3719
3744
|
|
3720
3745
|
fsdf1=fsdf[fsdf['ticker']==ticker1]
|
3721
3746
|
for ty in typelist:
|
@@ -3766,7 +3791,7 @@ def compare_fin_summary_china(tickers,fsdates,facecolor='whitesmoke',font_size='
|
|
3766
3791
|
|
3767
3792
|
try:
|
3768
3793
|
dft2=dft[['选项','指标',fsdates3[0]]]
|
3769
|
-
dft2.rename(columns={fsdates3[0]:ticker_name(t)},inplace=True)
|
3794
|
+
dft2.rename(columns={fsdates3[0]:ticker_name(t,'stock')},inplace=True)
|
3770
3795
|
except:
|
3771
3796
|
print(" #Error(compare_fin_summary_china): fin stmt of",t,'not found on',fsdates3[0])
|
3772
3797
|
return None
|
@@ -3840,9 +3865,9 @@ def get_fin_indicator_1ticker_china(ticker,fsdates):
|
|
3840
3865
|
fsdate_field=list(dft)[0]
|
3841
3866
|
dft2=dft[dft[fsdate_field].isin(fsdates3)]
|
3842
3867
|
if len(dft2) < len(fsdates3):
|
3843
|
-
print(" #Warning(get_fin_summary_1ticker_china): fin stmt of some dates unavailable for",ticker+'('+ticker_name(ticker)+')')
|
3868
|
+
print(" #Warning(get_fin_summary_1ticker_china): fin stmt of some dates unavailable for",ticker+'('+ticker_name(ticker,'stock')+')')
|
3844
3869
|
if len(dft2) ==0:
|
3845
|
-
print(" #Error(get_fin_summary_1ticker_china): no fin stmts found for",ticker+'('+ticker_name(ticker)+') on',fsdates)
|
3870
|
+
print(" #Error(get_fin_summary_1ticker_china): no fin stmts found for",ticker+'('+ticker_name(ticker,'stock')+') on',fsdates)
|
3846
3871
|
return None
|
3847
3872
|
|
3848
3873
|
# 去掉重复行
|
@@ -4222,7 +4247,7 @@ def compare_fin_indicator_china(tickers,fsdates,facecolor='papayawhip',font_size
|
|
4222
4247
|
titletxt="\n===== 上市公司主要财务比率和重要指标:"+ticker_name(ticker1)+" ====="
|
4223
4248
|
print(titletxt)
|
4224
4249
|
"""
|
4225
|
-
titletxt="主要财务比率和指标:"+ticker_name(ticker1)
|
4250
|
+
titletxt="主要财务比率和指标:"+ticker_name(ticker1,'stock')
|
4226
4251
|
|
4227
4252
|
fsdf1=fsdf[fsdf['ticker']==ticker1]
|
4228
4253
|
for ty in typelist:
|
@@ -4282,7 +4307,7 @@ def compare_fin_indicator_china(tickers,fsdates,facecolor='papayawhip',font_size
|
|
4282
4307
|
|
4283
4308
|
try:
|
4284
4309
|
dft2=dft[['选项','指标',fsdates3[0]]]
|
4285
|
-
dft2.rename(columns={fsdates3[0]:ticker_name(t)},inplace=True)
|
4310
|
+
dft2.rename(columns={fsdates3[0]:ticker_name(t,'stock')},inplace=True)
|
4286
4311
|
except:
|
4287
4312
|
print(" #Error(compare_fin_summary_china): fin stmt of",fsdates3[0],'not found for',t)
|
4288
4313
|
return None
|
siat/financials_china2.py
CHANGED
@@ -1957,8 +1957,8 @@ if __name__=='__main__':
|
|
1957
1957
|
|
1958
1958
|
def fs_analysis_china(tickers,fsdates=[],analysis_type='balance sheet', \
|
1959
1959
|
category='profile',business_period='recent', \
|
1960
|
-
printout=False,gview=False, \
|
1961
|
-
loc1='
|
1960
|
+
sort='PM',printout=False,gview=False, \
|
1961
|
+
loc1='best',loc2='best', \
|
1962
1962
|
facecolor='papayawhip',font_size='16px'):
|
1963
1963
|
"""
|
1964
1964
|
【功能】财务报表分析,仅适用于中国A股,注意不适用于港股和美股(含中概股)
|
@@ -2134,8 +2134,8 @@ def fs_analysis_china(tickers,fsdates=[],analysis_type='balance sheet', \
|
|
2134
2134
|
|
2135
2135
|
# 多只股票的杜邦分析对比
|
2136
2136
|
from siat.financials_china import compare_dupont_china
|
2137
|
-
df_db=compare_dupont_china(tickers,fsdate=fsdates,printout=printout, \
|
2138
|
-
facecolor=facecolor,font_size=font_size)
|
2137
|
+
df_db=compare_dupont_china(tickers,fsdate=fsdates,sort=sort,printout=printout, \
|
2138
|
+
facecolor=facecolor,font_size=font_size,loc=loc1)
|
2139
2139
|
return
|
2140
2140
|
|
2141
2141
|
elif ('dupont' in analysis_type1) and ('decompose' in analysis_type1):
|
siat/risk_adjusted_return2.py
CHANGED
@@ -523,7 +523,8 @@ if __name__=='__main__':
|
|
523
523
|
|
524
524
|
def compare_1ticker_mrar(ticker,start,end,rar=['sharpe','sortino','treynor','alpha'], \
|
525
525
|
ret_type="Annual Ret%",RF=0,regression_period=365, \
|
526
|
-
graph=True,
|
526
|
+
graph=True,loc1='best', \
|
527
|
+
axhline_value=0,axhline_label='',facecolor='whitesmoke', \
|
527
528
|
printout=False,sortby='tpw_mean',trailing=7,trend_threshhold=0.01, \
|
528
529
|
annotate=False,annotate_value=False, \
|
529
530
|
mark_top=False,mark_bottom=False,mark_end=False, \
|
@@ -618,7 +619,7 @@ def compare_1ticker_mrar(ticker,start,end,rar=['sharpe','sortino','treynor','alp
|
|
618
619
|
title_txt=title_txt,data_label=False, \
|
619
620
|
annotate=annotate,annotate_value=annotate, \
|
620
621
|
mark_top=mark_top,mark_bottom=mark_bottom,mark_end=mark_end, \
|
621
|
-
facecolor=facecolor)
|
622
|
+
facecolor=facecolor,loc=loc1)
|
622
623
|
|
623
624
|
#制表
|
624
625
|
recommenddf=pd.DataFrame()
|
@@ -671,7 +672,8 @@ if __name__=='__main__':
|
|
671
672
|
|
672
673
|
def compare_mticker_1rar(ticker,start,end,rar='sharpe', \
|
673
674
|
ret_type="Annual Ret%",RF=0,regression_period=365, \
|
674
|
-
graph=True,
|
675
|
+
graph=True,loc1='best', \
|
676
|
+
axhline_value=0,axhline_label='', \
|
675
677
|
printout=False,sortby='tpw_mean',trailing=7,trend_threshhold=0.01, \
|
676
678
|
annotate=False,annotate_value=False, \
|
677
679
|
mark_top=False,mark_bottom=False,mark_end=False, \
|
@@ -767,7 +769,7 @@ def compare_mticker_1rar(ticker,start,end,rar='sharpe', \
|
|
767
769
|
title_txt=title_txt,data_label=False, \
|
768
770
|
annotate=annotate,annotate_value=annotate, \
|
769
771
|
mark_top=mark_top,mark_bottom=mark_bottom,mark_end=mark_end, \
|
770
|
-
facecolor=facecolor)
|
772
|
+
facecolor=facecolor,loc=loc1)
|
771
773
|
|
772
774
|
#制表
|
773
775
|
recommenddf=pd.DataFrame()
|
@@ -791,7 +793,7 @@ def compare_mticker_1rar(ticker,start,end,rar='sharpe', \
|
|
791
793
|
footnotey=footnote6+'\n'+footnote7+'\n'+footnotex
|
792
794
|
|
793
795
|
#删除含有Nan的行,否则可能引起近期优先加权平均计算结果市场出现Nan
|
794
|
-
df1.dropna(inplace=True)
|
796
|
+
df1.dropna(inplace=True,axis=1)
|
795
797
|
recommenddf=descriptive_statistics2(df1,title_txt,footnotey,decimals=4, \
|
796
798
|
sortby=sortby,recommend_only=True,trailing=trailing, \
|
797
799
|
trend_threshhold=trend_threshhold, \
|
@@ -820,7 +822,8 @@ if __name__=='__main__':
|
|
820
822
|
|
821
823
|
def compare_mticker_mrar(ticker,start,end,rar=['sharpe','alpha','sortino','treynor'], \
|
822
824
|
ret_type="Annual Ret%",RF=0,regression_period=365, \
|
823
|
-
graph=True,
|
825
|
+
graph=True,loc1='best', \
|
826
|
+
axhline_value=0,axhline_label='', \
|
824
827
|
printout=True,sortby='tpw_mean',trailing=7,trend_threshhold=0.01, \
|
825
828
|
annotate=False,annotate_value=False, \
|
826
829
|
mark_top=False,mark_bottom=False,mark_end=False, \
|
@@ -854,7 +857,7 @@ def compare_mticker_mrar(ticker,start,end,rar=['sharpe','alpha','sortino','treyn
|
|
854
857
|
annotate=annotate,annotate_value=annotate, \
|
855
858
|
mark_top=mark_top,mark_bottom=mark_bottom,mark_end=mark_end, \
|
856
859
|
mktidx=mktidx,source=source,style_print=True, \
|
857
|
-
ticker_type=ticker_type)
|
860
|
+
ticker_type=ticker_type,loc1=loc1)
|
858
861
|
if df_tmp is None:
|
859
862
|
break
|
860
863
|
else:
|
@@ -1010,7 +1013,8 @@ if __name__=='__main__':
|
|
1010
1013
|
def compare_1ticker_1rar_mret(ticker,start,end,rar='sharpe', \
|
1011
1014
|
ret_type=["Annual Ret%","Monthly Ret%"], \
|
1012
1015
|
RF=0,regression_period=365, \
|
1013
|
-
graph=True,
|
1016
|
+
graph=True,loc1='best', \
|
1017
|
+
axhline_value=0,axhline_label='',facecolor='whitesmoke', \
|
1014
1018
|
printout=False,sortby='tpw_mean',trailing=7,trend_threshhold=0.01, \
|
1015
1019
|
annotate=False,annotate_value=False, \
|
1016
1020
|
mark_top=False,mark_bottom=False,mark_end=False, \
|
@@ -1101,7 +1105,7 @@ def compare_1ticker_1rar_mret(ticker,start,end,rar='sharpe', \
|
|
1101
1105
|
title_txt=title_txt,data_label=False, \
|
1102
1106
|
annotate=annotate,annotate_value=annotate, \
|
1103
1107
|
mark_top=mark_top,mark_bottom=mark_bottom,mark_end=mark_end, \
|
1104
|
-
facecolor=facecolor)
|
1108
|
+
facecolor=facecolor,loc=loc1)
|
1105
1109
|
|
1106
1110
|
#制表
|
1107
1111
|
recommenddf=pd.DataFrame()
|
@@ -1155,7 +1159,8 @@ if __name__=='__main__':
|
|
1155
1159
|
|
1156
1160
|
def compare_1ticker_1rar_1ret_mRF(ticker,start,end,rar='sharpe', \
|
1157
1161
|
ret_type="Annual Ret%",RF=[0,0.02,0.05],regression_period=365, \
|
1158
|
-
graph=True,
|
1162
|
+
graph=True,loc1='best', \
|
1163
|
+
axhline_value=0,axhline_label='',facecolor='whitesmoke', \
|
1159
1164
|
printout=False,sortby='tpw_mean',trailing=7,trend_threshhold=0.01, \
|
1160
1165
|
annotate=False,annotate_value=False, \
|
1161
1166
|
mark_top=False,mark_bottom=False,mark_end=False, \
|
@@ -1244,7 +1249,7 @@ def compare_1ticker_1rar_1ret_mRF(ticker,start,end,rar='sharpe', \
|
|
1244
1249
|
title_txt=title_txt,data_label=False, \
|
1245
1250
|
annotate=annotate,annotate_value=annotate, \
|
1246
1251
|
mark_top=mark_top,mark_bottom=mark_bottom,mark_end=mark_end, \
|
1247
|
-
facecolor=facecolor)
|
1252
|
+
facecolor=facecolor,loc=loc1)
|
1248
1253
|
|
1249
1254
|
#制表
|
1250
1255
|
recommenddf=pd.DataFrame()
|
@@ -1313,7 +1318,8 @@ def compare_rar_security(ticker,start,end,rar='sharpe', \
|
|
1313
1318
|
ret_type="Annual Ret%", \
|
1314
1319
|
RF=0, \
|
1315
1320
|
regression_period=365, \
|
1316
|
-
graph=True,
|
1321
|
+
graph=True,loc1='best', \
|
1322
|
+
axhline_value=0,axhline_label='',facecolor='whitesmoke', \
|
1317
1323
|
printout=False,sortby='tpw_mean',trailing=7,trend_threshhold=0.05, \
|
1318
1324
|
annotate=False,annotate_value=False, \
|
1319
1325
|
mark_top=False,mark_bottom=False,mark_end=False, \
|
@@ -1343,7 +1349,8 @@ def compare_rar_security(ticker,start,end,rar='sharpe', \
|
|
1343
1349
|
if rar_num ==1: #一个RAR
|
1344
1350
|
df=compare_mticker_1rar(ticker=ticker,start=start,end=end,rar=rar, \
|
1345
1351
|
ret_type=ret_type,RF=RF,regression_period=regression_period, \
|
1346
|
-
graph=graph,
|
1352
|
+
graph=graph,loc1=loc1, \
|
1353
|
+
axhline_value=axhline_value,axhline_label=axhline_label, \
|
1347
1354
|
printout=printout, \
|
1348
1355
|
sortby=sortby,trailing=trailing,trend_threshhold=trend_threshhold, \
|
1349
1356
|
annotate=annotate,annotate_value=annotate, \
|
@@ -1356,7 +1363,8 @@ def compare_rar_security(ticker,start,end,rar='sharpe', \
|
|
1356
1363
|
printout=True #否则无法运行descriptive_statistics2函数
|
1357
1364
|
df=compare_mticker_mrar(ticker=ticker,start=start,end=end,rar=rar, \
|
1358
1365
|
ret_type=ret_type,RF=RF,regression_period=regression_period, \
|
1359
|
-
graph=graph,
|
1366
|
+
graph=graph,loc1=loc1, \
|
1367
|
+
axhline_value=axhline_value,axhline_label=axhline_label, \
|
1360
1368
|
printout=printout, \
|
1361
1369
|
sortby=sortby,trailing=trailing,trend_threshhold=trend_threshhold, \
|
1362
1370
|
annotate=annotate,annotate_value=annotate, \
|
@@ -1378,7 +1386,8 @@ def compare_rar_security(ticker,start,end,rar='sharpe', \
|
|
1378
1386
|
|
1379
1387
|
df=compare_1ticker_mrar(ticker=ticker,start=start,end=end,rar=rar, \
|
1380
1388
|
ret_type=ret_type,RF=RF,regression_period=regression_period, \
|
1381
|
-
graph=graph,
|
1389
|
+
graph=graph,loc1=loc1, \
|
1390
|
+
axhline_value=axhline_value,axhline_label=axhline_label, \
|
1382
1391
|
printout=printout,facecolor=facecolor, \
|
1383
1392
|
sortby=sortby,trailing=trailing,trend_threshhold=trend_threshhold, \
|
1384
1393
|
annotate=annotate,annotate_value=annotate, \
|
@@ -1398,7 +1407,8 @@ def compare_rar_security(ticker,start,end,rar='sharpe', \
|
|
1398
1407
|
|
1399
1408
|
df=compare_1ticker_1rar_mret(ticker=ticker,start=start,end=end,rar=rar, \
|
1400
1409
|
ret_type=ret_type,RF=RF,regression_period=regression_period, \
|
1401
|
-
graph=graph,
|
1410
|
+
graph=graph,loc1=loc1, \
|
1411
|
+
axhline_value=axhline_value,axhline_label=axhline_label, \
|
1402
1412
|
printout=printout, \
|
1403
1413
|
sortby=sortby,trailing=trailing,trend_threshhold=trend_threshhold, \
|
1404
1414
|
annotate=annotate,annotate_value=annotate, \
|
@@ -1416,7 +1426,8 @@ def compare_rar_security(ticker,start,end,rar='sharpe', \
|
|
1416
1426
|
|
1417
1427
|
df=compare_1ticker_1rar_1ret_mRF(ticker=ticker,start=start,end=end,rar=rar, \
|
1418
1428
|
ret_type=ret_type,RF=RF,regression_period=regression_period, \
|
1419
|
-
graph=graph,
|
1429
|
+
graph=graph,loc1=loc1, \
|
1430
|
+
axhline_value=axhline_value,axhline_label=axhline_label, \
|
1420
1431
|
printout=printout,facecolor=facecolor, \
|
1421
1432
|
sortby=sortby,trailing=trailing,trend_threshhold=trend_threshhold, \
|
1422
1433
|
annotate=annotate,annotate_value=annotate, \
|
@@ -1431,7 +1442,8 @@ def compare_rar_security(ticker,start,end,rar='sharpe', \
|
|
1431
1442
|
#情形5:1只证券,1个RAR,1个收益率类型,1个RF
|
1432
1443
|
df=compare_1ticker_mrar(ticker=ticker,start=start,end=end,rar=rar, \
|
1433
1444
|
ret_type=ret_type,RF=RF,regression_period=regression_period, \
|
1434
|
-
graph=graph,
|
1445
|
+
graph=graph,loc1=loc1, \
|
1446
|
+
axhline_value=axhline_value,axhline_label=axhline_label, \
|
1435
1447
|
printout=printout,sortby=sortby, \
|
1436
1448
|
trailing=trailing,trend_threshhold=trend_threshhold, \
|
1437
1449
|
annotate=annotate,annotate_value=annotate, \
|
siat/security_prices.py
CHANGED
@@ -309,7 +309,12 @@ def remove_timezone(pricedf):
|
|
309
309
|
def remove_timezone_tmp(pricedf):
|
310
310
|
"""
|
311
311
|
功能:去掉df索引中可能存在的时区信息,避免时区错误
|
312
|
-
|
312
|
+
注意:有问题,应该改用common中的df_index_timezone_remove函数
|
313
|
+
"""
|
314
|
+
#去掉时区
|
315
|
+
pricedf2=df_index_timezone_remove(pricedf)
|
316
|
+
return pricedf2
|
317
|
+
|
313
318
|
"""
|
314
319
|
if pricedf is None:
|
315
320
|
return pricedf
|
@@ -319,9 +324,6 @@ def remove_timezone_tmp(pricedf):
|
|
319
324
|
|
320
325
|
import pandas as pd
|
321
326
|
pricedf['date']=pricedf['date_y4m2d2'].apply(lambda x: pd.to_datetime(x))
|
322
|
-
"""
|
323
|
-
pricedf['date']=pricedf['date'].apply(lambda x: x.replace(tzinfo=None)) #去掉时区
|
324
|
-
"""
|
325
327
|
pricedf2=pricedf.reset_index(drop=True)
|
326
328
|
try:
|
327
329
|
pricedf2=pricedf2.set_index('Date',drop=True)
|
@@ -331,7 +333,7 @@ def remove_timezone_tmp(pricedf):
|
|
331
333
|
pricedf2.drop(['date_tz','date_y4m2d2'],axis=1,inplace=True)
|
332
334
|
|
333
335
|
return pricedf2
|
334
|
-
|
336
|
+
"""
|
335
337
|
|
336
338
|
#==============================================================================
|
337
339
|
if __name__=='__main__':
|
@@ -591,7 +593,10 @@ def get_price_stooq(ticker,start,end):
|
|
591
593
|
else:
|
592
594
|
#print(" Sorry, zero records found from stooq for",ticker,"from",start,'to',end)
|
593
595
|
return None
|
594
|
-
|
596
|
+
|
597
|
+
#仍然无记录
|
598
|
+
if len(prices)==0:return None
|
599
|
+
|
595
600
|
prices.sort_index(axis=0, ascending=True, inplace=True)
|
596
601
|
#prices.dropna(inplace=True)
|
597
602
|
|
@@ -1238,7 +1243,10 @@ def get_prices_yahoo(ticker,start,end,retry_count=3,pause=1):
|
|
1238
1243
|
if ptname == ticker: ptname=''
|
1239
1244
|
|
1240
1245
|
print(" Successfully retrieved",len(p),"records for",ticker,ptname)
|
1241
|
-
|
1246
|
+
|
1247
|
+
#去掉时区
|
1248
|
+
p=df_index_timezone_remove(p)
|
1249
|
+
|
1242
1250
|
return p
|
1243
1251
|
|
1244
1252
|
if __name__=='__main__':
|
@@ -1327,6 +1335,9 @@ def get_prices_yf(ticker,start,end,threads=False):
|
|
1327
1335
|
pass
|
1328
1336
|
#print(" #Error(get_prices_yf):",ticker1,"not found or no prices in the period or inaccessible to yahoo")
|
1329
1337
|
|
1338
|
+
#去掉时区
|
1339
|
+
p=df_index_timezone_remove(p)
|
1340
|
+
|
1330
1341
|
return p
|
1331
1342
|
|
1332
1343
|
if __name__=='__main__':
|
@@ -1391,6 +1402,9 @@ def get_index_fred(ticker,start,end):
|
|
1391
1402
|
print(" Successfully retrieved",num,"records for",ticker,ptname)
|
1392
1403
|
else:
|
1393
1404
|
print(" Sorry, no records retrieved for",ticker)
|
1405
|
+
|
1406
|
+
#去掉时区
|
1407
|
+
df=df_index_timezone_remove(df)
|
1394
1408
|
|
1395
1409
|
return df
|
1396
1410
|
|
@@ -1761,6 +1775,9 @@ def calc_expanding_return(drdf0,basedate):
|
|
1761
1775
|
日收益率数据集drdf。
|
1762
1776
|
输出:期间累计收益率序列,按照日期升序排列。
|
1763
1777
|
"""
|
1778
|
+
#去掉时区
|
1779
|
+
drdf0=df_index_timezone_remove(drdf0)
|
1780
|
+
|
1764
1781
|
import pandas as pd
|
1765
1782
|
basedate_pd=pd.to_datetime(basedate)
|
1766
1783
|
drdf=drdf0[drdf0.index >= basedate_pd]
|
siat/security_trend2.py
CHANGED
@@ -428,6 +428,7 @@ def security_trend(ticker,indicator='Close', \
|
|
428
428
|
df=compare_rar_security(ticker=tickers,start=fromdate,end=todate,rar=measures, \
|
429
429
|
ret_type=ret_type,RF=RF,regression_period=regression_period, \
|
430
430
|
graph=graph,axhline_value=0,axhline_label='', \
|
431
|
+
loc1=loc1, \
|
431
432
|
printout=printout, \
|
432
433
|
sortby=sortby,trailing=trailing,trend_threshhold=trend_threshhold, \
|
433
434
|
annotate=annotate,annotate_value=annotate_value, \
|
siat/stock.py
CHANGED
@@ -623,9 +623,15 @@ def security_indicator(ticker,indicator,fromdate,todate, \
|
|
623
623
|
if len(pricedf) == 0:
|
624
624
|
print(" #Error(security_indicator): zero record found for",ticker)
|
625
625
|
return None
|
626
|
-
|
627
|
-
#
|
626
|
+
|
627
|
+
# 去掉时区信息,避免日期时区冲突问题
|
628
|
+
pricedf=df_index_timezone_remove(pricedf)
|
629
|
+
"""
|
628
630
|
import pandas as pd
|
631
|
+
pricedf.index = pd.to_datetime(pricedf.index)
|
632
|
+
pricedf.index = pricedf.index.tz_localize(None)
|
633
|
+
"""
|
634
|
+
# 检查是否存在满足给定日期的记录
|
629
635
|
fromdate_pd=pd.to_datetime(fromdate)
|
630
636
|
tmp_df=pricedf[pricedf.index >= fromdate_pd]
|
631
637
|
if len(tmp_df)==0:
|
siat/stock_china.py
CHANGED
@@ -676,7 +676,7 @@ def price_direction_knn(ticker,df,ndays=1,diff=0.01,min_score=0.9,votes=100,max_
|
|
676
676
|
if not printout: return decision,today_close,today
|
677
677
|
|
678
678
|
print(" Model voting for stock price after "+str(ndays)+" trading days: Higher("+str(zhang)+'), Lower('+str(die)+')')
|
679
|
-
print(" "+ticker_name(ticker)+': previously closed '+str(known_close)+' @ '+str(known_day))
|
679
|
+
print(" "+ticker_name(ticker,'stock')+': previously closed '+str(known_close)+' @ '+str(known_day))
|
680
680
|
|
681
681
|
ndate=date_adjust(known_day,adjust=ndays)
|
682
682
|
print(" Prediction to close at",decision_text,"price trend ("+decision+') @',ndate)
|
@@ -726,7 +726,7 @@ def forecast_direction_knn(ticker,ndays=1,diff=0.01,min_score=0.9,votes=100,max_
|
|
726
726
|
max_RS=max_RS)
|
727
727
|
decisionlist=decisionlist+[decision]
|
728
728
|
|
729
|
-
print("\nStock information:",ticker_name(ticker),'\b, closed',known_close,'@',known_day)
|
729
|
+
print("\nStock information:",ticker_name(ticker,'stock'),'\b, closed',known_close,'@',known_day)
|
730
730
|
for nd in list(range(1,ndays+1)):
|
731
731
|
ndate=date_adjust(known_day, adjust=nd)
|
732
732
|
print("Forecasting stock close price trend on",ndate,end=': ')
|
@@ -952,7 +952,7 @@ def price_price_knn(ticker,df,ndays=1,max_neighbours=10,max_RS=20,printout=True)
|
|
952
952
|
if not printout: return decision,decision_score,today_close,today
|
953
953
|
|
954
954
|
print(" Model poll for stock price after "+str(ndays)+" trading days:",decision)
|
955
|
-
print(" Last close price: "+ticker_name(ticker)+', closed '+str(known_close)+', '+str(known_day))
|
955
|
+
print(" Last close price: "+ticker_name(ticker,'stock')+', closed '+str(known_close)+', '+str(known_day))
|
956
956
|
|
957
957
|
ndate=date_adjust(known_day,adjust=ndays)
|
958
958
|
|
@@ -1009,7 +1009,7 @@ def forecast_price_knn(ticker,ndays=1,max_neighbours=10,max_RS=20,end='latest'):
|
|
1009
1009
|
decisionlist=decisionlist+[decision]
|
1010
1010
|
confidencelist=confidencelist+[confidence]
|
1011
1011
|
|
1012
|
-
print("\nStock information:",ticker_name(ticker),'\b, closed',known_close,'@',known_day)
|
1012
|
+
print("\nStock information:",ticker_name(ticker,'stock'),'\b, closed',known_close,'@',known_day)
|
1013
1013
|
|
1014
1014
|
for nd in list(range(1,ndays+1)):
|
1015
1015
|
ndate=date_adjust(known_day, adjust=nd)
|
@@ -1237,7 +1237,7 @@ def stock_profile_china(ticker,category='profile', \
|
|
1237
1237
|
dftmp15=dftmp14.T
|
1238
1238
|
dftmp15.reset_index(inplace=True)
|
1239
1239
|
|
1240
|
-
titletxt=ticker_name(ticker)
|
1240
|
+
titletxt=ticker_name(ticker,'stock')
|
1241
1241
|
"""
|
1242
1242
|
if prettytab:
|
1243
1243
|
pandas2prettytable(dftmp15,titletxt,firstColSpecial=False,leftColAlign='l',otherColAlign='l',tabborder=tabborder)
|
@@ -1313,7 +1313,7 @@ def stock_profile_china(ticker,category='profile', \
|
|
1313
1313
|
cols2=['分类方向','分类','营业收入-同比增长','营业成本-同比增长','毛利率','毛利率-同比增长']
|
1314
1314
|
|
1315
1315
|
dftmp1=dftmp[cols1]
|
1316
|
-
titletxt1=ticker_name(ticker)+':主营业务构成,'+period
|
1316
|
+
titletxt1=ticker_name(ticker,'stock')+':主营业务构成,'+period
|
1317
1317
|
"""
|
1318
1318
|
if prettytab:
|
1319
1319
|
pandas2prettytable(dftmp1,titletxt1,firstColSpecial=True,leftColAlign='l',otherColAlign='c',tabborder=tabborder)
|
@@ -1331,7 +1331,7 @@ def stock_profile_china(ticker,category='profile', \
|
|
1331
1331
|
data_font_size=data_font_size)
|
1332
1332
|
|
1333
1333
|
dftmp2=dftmp[cols2]
|
1334
|
-
titletxt2=ticker_name(ticker)+':主营业务增长,'+period
|
1334
|
+
titletxt2=ticker_name(ticker,'stock')+':主营业务增长,'+period
|
1335
1335
|
"""
|
1336
1336
|
if prettytab:
|
1337
1337
|
pandas2prettytable(dftmp2,titletxt2,firstColSpecial=True,leftColAlign='l',otherColAlign='c',tabborder=tabborder)
|
@@ -1392,7 +1392,7 @@ def stock_profile_china(ticker,category='profile', \
|
|
1392
1392
|
#if category in ['dividend','split']:
|
1393
1393
|
if any(s in category for s in ['dividend','split']):
|
1394
1394
|
# 分红
|
1395
|
-
titletxt=ticker_name(ticker)+':分红历史'
|
1395
|
+
titletxt=ticker_name(ticker,'stock')+':分红历史'
|
1396
1396
|
try:
|
1397
1397
|
#df3=ak.stock_dividents_cninfo(symbol=ticker1)
|
1398
1398
|
df3=ak.stock_history_dividend_detail(symbol=ticker1, indicator="分红")
|
@@ -1416,7 +1416,7 @@ def stock_profile_china(ticker,category='profile', \
|
|
1416
1416
|
newcols=['公告日期','送股','转增','派息','股权登记日','除权除息日']
|
1417
1417
|
dftmp3=dftmp[newcols]
|
1418
1418
|
|
1419
|
-
titletxt=ticker_name(ticker)+':分红历史'
|
1419
|
+
titletxt=ticker_name(ticker,'stock')+':分红历史'
|
1420
1420
|
"""
|
1421
1421
|
if prettytab:
|
1422
1422
|
pandas2prettytable(dftmp3,titletxt,firstColSpecial=False,leftColAlign='l',otherColAlign='c',tabborder=tabborder)
|
@@ -1434,7 +1434,7 @@ def stock_profile_china(ticker,category='profile', \
|
|
1434
1434
|
data_font_size=data_font_size)
|
1435
1435
|
|
1436
1436
|
# 配股
|
1437
|
-
titletxt=ticker_name(ticker)+':配股历史'
|
1437
|
+
titletxt=ticker_name(ticker,'stock')+':配股历史'
|
1438
1438
|
try:
|
1439
1439
|
df3p=ak.stock_history_dividend_detail(symbol=ticker1, indicator="配股")
|
1440
1440
|
except:
|
@@ -1525,7 +1525,7 @@ def stock_profile_china(ticker,category='profile', \
|
|
1525
1525
|
enddate=str(dftmp.head(1)['截至日期'][0])
|
1526
1526
|
shareholder_num=dftmp.head(1)['股东总数'][0]
|
1527
1527
|
avg_shares=dftmp.head(1)['平均持股数'][0]
|
1528
|
-
titletxt=ticker_name(ticker)+':十大股东(截至'+str(enddate)+',股东总数'+str(int(shareholder_num))+',平均持股数'+str(int(avg_shares))+')'
|
1528
|
+
titletxt=ticker_name(ticker,'stock')+':十大股东(截至'+str(enddate)+',股东总数'+str(int(shareholder_num))+',平均持股数'+str(int(avg_shares))+')'
|
1529
1529
|
|
1530
1530
|
dftmp.drop(['截至日期','公告日期','股东说明','股东总数','平均持股数'],axis=1,inplace=True)
|
1531
1531
|
|
@@ -1595,7 +1595,7 @@ def stock_profile_china(ticker,category='profile', \
|
|
1595
1595
|
mv_min=round(dftmp2['total_mv(yi)'].min(),1)
|
1596
1596
|
mv_txt="总市值(亿元):"+str(mv_min)+'-'+str(mv_max)+",均值"+str(mv_mean)+",中位数"+str(mv_median)
|
1597
1597
|
|
1598
|
-
titletxt=ticker_name(ticker)+':估值与市值'
|
1598
|
+
titletxt=ticker_name(ticker,'stock')+':估值与市值'
|
1599
1599
|
import datetime as dt
|
1600
1600
|
today=dt.date.today()
|
1601
1601
|
footnote3="数据来源:乐咕乐股,"+str(today)
|
@@ -1627,7 +1627,7 @@ def stock_profile_china(ticker,category='profile', \
|
|
1627
1627
|
df2=dftmp2,ticker2='',colname2='total_mv(yi)',label2='总市值(亿元)', \
|
1628
1628
|
ylabeltxt='',titletxt=titletxt,footnote=footnote, \
|
1629
1629
|
twinx=True, \
|
1630
|
-
resample_freq='D',loc1=
|
1630
|
+
resample_freq='D',loc1=loc1,loc2=loc2, \
|
1631
1631
|
color1='red',color2='blue',facecolor='whitesmoke')
|
1632
1632
|
|
1633
1633
|
# 计算市净率的均值,中位数、最大最小值
|
@@ -1653,7 +1653,7 @@ def stock_profile_china(ticker,category='profile', \
|
|
1653
1653
|
df2=dftmp2,ticker2='',colname2='total_mv(yi)',label2='总市值(亿元)', \
|
1654
1654
|
ylabeltxt='',titletxt=titletxt,footnote=footnote, \
|
1655
1655
|
twinx=True, \
|
1656
|
-
resample_freq='D',loc1=
|
1656
|
+
resample_freq='D',loc1=loc1,loc2=loc2, \
|
1657
1657
|
color1='red',color2='blue',facecolor='whitesmoke')
|
1658
1658
|
|
1659
1659
|
# 计算市销率的均值,中位数、最大最小值
|
@@ -1679,7 +1679,7 @@ def stock_profile_china(ticker,category='profile', \
|
|
1679
1679
|
df2=dftmp2,ticker2='',colname2='total_mv(yi)',label2='总市值(亿元)', \
|
1680
1680
|
ylabeltxt='',titletxt=titletxt,footnote=footnote, \
|
1681
1681
|
twinx=True, \
|
1682
|
-
resample_freq='D',loc1=
|
1682
|
+
resample_freq='D',loc1=loc1,loc2=loc2, \
|
1683
1683
|
color1='red',color2='blue',facecolor='whitesmoke')
|
1684
1684
|
|
1685
1685
|
# 计算股息率的均值,中位数、最大最小值
|
@@ -1706,7 +1706,7 @@ def stock_profile_china(ticker,category='profile', \
|
|
1706
1706
|
df2=dftmp2,ticker2='',colname2='total_mv(yi)',label2='总市值(亿元)', \
|
1707
1707
|
ylabeltxt='',titletxt=titletxt,footnote=footnote, \
|
1708
1708
|
twinx=True, \
|
1709
|
-
resample_freq='D',loc1=
|
1709
|
+
resample_freq='D',loc1=loc1,loc2=loc2, \
|
1710
1710
|
color1='red',color2='blue',facecolor='whitesmoke')
|
1711
1711
|
|
1712
1712
|
|
@@ -1732,7 +1732,7 @@ def stock_profile_china(ticker,category='profile', \
|
|
1732
1732
|
if numOfQ > 8:
|
1733
1733
|
numOfQ=8
|
1734
1734
|
|
1735
|
-
titletxt=ticker_name(ticker)+":主要财务信息,每股指标(元)"
|
1735
|
+
titletxt=ticker_name(ticker,'stock')+":主要财务信息,每股指标(元)"
|
1736
1736
|
df7['加权每股收益']=df7['加权每股收益(元)']
|
1737
1737
|
df7['每股收益_调整后']=df7['每股收益_调整后(元)']
|
1738
1738
|
df7['扣非后每股收益']=df7['扣除非经常性损益后的每股收益(元)']
|
@@ -1783,7 +1783,7 @@ def stock_profile_china(ticker,category='profile', \
|
|
1783
1783
|
为了准确评估每股收益,就必须用稀释每股收益。
|
1784
1784
|
"""
|
1785
1785
|
|
1786
|
-
titletxt=ticker_name(ticker)+":主要财务信息,利润与成本"
|
1786
|
+
titletxt=ticker_name(ticker,'stock')+":主要财务信息,利润与成本"
|
1787
1787
|
df7['扣非后净利润(元)']=df7['扣除非经常性损益后的净利润(元)']
|
1788
1788
|
colList=['日期','财报类别','总资产利润率(%)','主营业务利润率(%)','总资产净利润率(%)','成本费用利润率(%)', \
|
1789
1789
|
'营业利润率(%)','主营业务成本率(%)','销售净利率(%)', '销售毛利率(%)','三项费用比重','非主营比重', \
|
@@ -1832,7 +1832,7 @@ def stock_profile_china(ticker,category='profile', \
|
|
1832
1832
|
成本费用利润率=利润总额/成本费用总额(即成本总额+费用总额)
|
1833
1833
|
"""
|
1834
1834
|
|
1835
|
-
titletxt=ticker_name(ticker)+":主要财务信息,报酬与收益"
|
1835
|
+
titletxt=ticker_name(ticker,'stock')+":主要财务信息,报酬与收益"
|
1836
1836
|
colList=['日期','财报类别', '股本报酬率(%)','净资产报酬率(%)','资产报酬率(%)', '股息发放率(%)','投资收益率(%)', \
|
1837
1837
|
'净资产收益率(%)','加权净资产收益率(%)']
|
1838
1838
|
dftmp=df7[colList].head(numOfQ)
|
@@ -1876,7 +1876,7 @@ def stock_profile_china(ticker,category='profile', \
|
|
1876
1876
|
股本报酬率/回报率=净利润/期初期末总股本的均值。股本是实收资本,而股权是股东权益。
|
1877
1877
|
"""
|
1878
1878
|
|
1879
|
-
titletxt=ticker_name(ticker)+":主要财务信息,增长率"
|
1879
|
+
titletxt=ticker_name(ticker,'stock')+":主要财务信息,增长率"
|
1880
1880
|
colList=['日期','财报类别','主营业务收入增长率(%)','净利润增长率(%)','总资产增长率(%)','净资产增长率(%)']
|
1881
1881
|
dftmp=df7[colList].head(numOfQ)
|
1882
1882
|
|
@@ -1909,7 +1909,7 @@ def stock_profile_china(ticker,category='profile', \
|
|
1909
1909
|
data_font_size=data_font_size)
|
1910
1910
|
|
1911
1911
|
|
1912
|
-
titletxt=ticker_name(ticker)+":主要财务信息,资产负债分析"
|
1912
|
+
titletxt=ticker_name(ticker,'stock')+":主要财务信息,资产负债分析"
|
1913
1913
|
colList=['日期','财报类别','流动比率','速动比率','现金比率(%)','利息支付倍数','长期债务与营运资金比率(%)', \
|
1914
1914
|
'股东权益比率(%)','长期负债比率(%)','股东权益与固定资产比率(%)','负债与所有者权益比率(%)', \
|
1915
1915
|
'长期资产与长期资金比率(%)','资本化比率(%)','固定资产净值率(%)','资本固定化比率(%)', \
|
@@ -1960,7 +1960,7 @@ def stock_profile_china(ticker,category='profile', \
|
|
1960
1960
|
|
1961
1961
|
"""
|
1962
1962
|
|
1963
|
-
titletxt=ticker_name(ticker)+":主要财务信息,现金流量指标(均为%)"
|
1963
|
+
titletxt=ticker_name(ticker,'stock')+":主要财务信息,现金流量指标(均为%)"
|
1964
1964
|
colList=['日期','财报类别','经营现金净流量对销售收入比率(%)','资产的经营现金流量回报率(%)','经营现金净流量与净利润的比率(%)', \
|
1965
1965
|
'经营现金净流量对负债比率(%)','现金流量比率(%)']
|
1966
1966
|
dftmp=df7[colList].head(numOfQ)
|
siat/translate.py
CHANGED
@@ -1459,6 +1459,7 @@ def codetranslate0(code):
|
|
1459
1459
|
# 找到目录C:\Users\Peter\anaconda3\Lib\site-packages\pandas_datareader\
|
1460
1460
|
# 打开stooq.py中的函数def _get_params(self, symbol, country="US")
|
1461
1461
|
# 在函数列表中加入一项"m"即可避免自动在ticker加上后缀.us的问题
|
1462
|
+
# 或者使用fix_package()函数自动修正
|
1462
1463
|
['CPIYKR.M','韩国CPI(同比)'],
|
1463
1464
|
['CPIYUK.M','英国CPI(同比)'],['CPIYDE.M','德国CPI(同比)'],
|
1464
1465
|
['CPIYJP.M','日本CPI(同比)'],['CPIYCN.M','中国CPI(同比)'],
|
@@ -1575,72 +1576,141 @@ def codetranslate0(code):
|
|
1575
1576
|
['EXPRCA.M','加拿大出口增速%'],['IMPRCA.M','加拿大进口增速%'],
|
1576
1577
|
['EXPRMX.M','墨西哥出口增速%'],['IMPRMX.M','墨西哥进口增速%'],
|
1577
1578
|
|
1579
|
+
#雅虎汇率
|
1580
|
+
['CNYUSD=X','CCY人民币兑美元汇率'],['CNY=X','CCY美元兑人民币汇率'],
|
1581
|
+
['JPYUSD=X','CCY日元兑美元汇率'],['JPY=X','CCY美元兑日元汇率'],
|
1582
|
+
['KRWUSD=X','CCY韩元兑美元汇率'],['KRW=X','CCY美元兑韩元汇率'],
|
1583
|
+
['HKDUSD=X','CCY港币兑美元汇率'],['HKD=X','CCY美元兑港币汇率'],
|
1584
|
+
['TWDUSD=X','CCY新台币兑美元汇率'],['TWD=X','CCY美元兑新台币汇率'],
|
1585
|
+
['PHPUSD=X','CCY菲律宾比索兑美元汇率'],['PHP=X','CCY比索美元兑菲律宾汇率'],
|
1586
|
+
['IDRUSD=X','CCY印尼盾兑美元汇率'],['IDR=X','CCY美元兑印尼盾汇率'],
|
1587
|
+
['THBUSD=X','CCY泰铢兑美元汇率'],['THB=X','CCY美元兑泰铢汇率'],
|
1588
|
+
['MYRUSD=X','CCY马来西亚林吉特兑美元汇率'],['MYR=X','CCY美元兑马来西亚林吉特汇率'],
|
1589
|
+
['SGDUSD=X','CCY新加坡币兑美元汇率'],['SGD=X','CCY美元兑新加坡币汇率'],
|
1590
|
+
['INRUSD=X','CCY印度卢比兑美元汇率'],['INR=X','CCY美元兑印度卢比汇率'],
|
1591
|
+
['AUDUSD=X','CCY澳大利亚元兑美元汇率'],['AUD=X','CCY美元兑澳大利亚元汇率'],
|
1592
|
+
['NZDUSD=X','CCY新西兰元兑美元汇率'],['NZD=X','CCY美元兑新西兰元汇率'],
|
1593
|
+
['TRYUSD=X','CCY土耳其里拉兑美元汇率'],['TRY=X','CCY美元兑土耳其里拉汇率'],
|
1594
|
+
['ILSUSD=X','CCY新谢克尔兑美元汇率'],['ILS=X','CCY美元兑新谢克尔汇率'],
|
1595
|
+
['VNDUSD=X','CCY越南盾兑美元汇率'],['VND=X','CCY美元兑越南盾汇率'],
|
1596
|
+
['MOPUSD=X','CCY澳门元兑美元汇率'],['MOP=X','CCY美元兑澳门元汇率'],
|
1597
|
+
['LAKUSD=X','CCY老挝基普兑美元汇率'],['LAK=X','CCY美元兑老挝基普汇率'],
|
1598
|
+
['KHRUSD=X','CCY柬埔寨瑞尔兑美元汇率'],['KHR=X','CCY美元兑柬埔寨瑞尔汇率'],
|
1599
|
+
['MMKUSD=X','CCY缅甸元兑美元汇率'],['MMK=X','CCY美元兑缅甸元汇率'],
|
1600
|
+
['LKRUSD=X','CCY斯里兰卡卢比兑美元汇率'],['LKR=X','CCY美元兑斯里兰卡卢比汇率'],
|
1601
|
+
['PKRUSD=X','CCY巴基斯坦卢比兑美元汇率'],['PKR=X','CCY美元兑巴基斯坦卢比汇率'],
|
1602
|
+
['NPRUSD=X','CCY尼泊尔卢比兑美元汇率'],['NPR=X','CCY美元兑尼泊尔卢比汇率'],
|
1603
|
+
['AFNUSD=X','CCY阿富汗尼兑美元汇率'],['AFN=X','CCY美元兑阿富汗尼汇率'],
|
1604
|
+
['IRRUSD=X','CCY伊朗里亚尔兑美元汇率'],['IRR=X','CCY美元兑伊朗里亚尔汇率'],
|
1605
|
+
['IQDUSD=X','CCY伊拉克第纳尔兑美元汇率'],['IQD=X','CCY美元兑伊拉克第纳尔汇率'],
|
1606
|
+
['SYPUSD=X','CCY叙利亚镑兑美元汇率'],['SYP=X','CCY美元兑叙利亚镑汇率'],
|
1607
|
+
['JODUSD=X','CCY约旦第纳尔兑美元汇率'],['JOD=X','CCY美元兑约旦第纳尔汇率'],
|
1608
|
+
['SARUSD=X','CCY沙特亚尔兑美元汇率'],['SAR=X','CCY美元兑沙特亚尔汇率'],
|
1609
|
+
['KWDUSD=X','CCY科威特第纳尔兑美元汇率'],['KWD=X','CCY美元兑科威特第纳尔汇率'],
|
1610
|
+
['LBPUSD=X','CCY黎巴嫩镑兑美元汇率'],['LBP=X','CCY美元兑黎巴嫩镑汇率'],
|
1611
|
+
['CADUSD=X','CCY加拿大元兑美元汇率'],['CAD=X','CCY美元兑加拿大元汇率'],
|
1612
|
+
['MXNUSD=X','CCY墨西哥比索兑美元汇率'],['MXN=X','CCY美元兑墨西哥比索汇率'],
|
1613
|
+
['ARSUSD=X','CCY阿根廷比索兑美元汇率'],['ARS=X','CCY美元兑阿根廷比索汇率'],
|
1614
|
+
['CLPUSD=X','CCY智利比索兑美元汇率'],['CLP=X','CCY美元兑智利比索汇率'],
|
1615
|
+
['BRLUSD=X','CCY巴西雷亚尔兑美元汇率'],['BRL=X','CCY美元兑巴西雷亚尔汇率'],
|
1616
|
+
['EURUSD=X','CCY欧元兑美元汇率'],['EUR=X','CCY美元兑欧元汇率'],
|
1617
|
+
['GBPUSD=X','CCY英镑兑美元汇率'],['GBP=X','CCY美元兑英镑汇率'],
|
1618
|
+
['CHFUSD=X','CCY瑞士法郎兑美元汇率'],['CHF=X','CCY美元兑瑞士法郎汇率'],
|
1619
|
+
['HUFUSD=X','CCY匈牙利福林兑美元汇率'],['HUF=X','CCY美元兑匈牙利福林汇率'],
|
1620
|
+
['SEKUSD=X','CCY瑞典克朗兑美元汇率'],['SEK=X','CCY美元兑瑞典克朗汇率'],
|
1621
|
+
['DKKUSD=X','CCY丹麦克朗兑美元汇率'],['DKK=X','CCY美元兑丹麦克朗汇率'],
|
1622
|
+
['NOKUSD=X','CCY挪威克朗兑美元汇率'],['NOK=X','CCY美元兑挪威克朗汇率'],
|
1623
|
+
['RUBUSD=X','CCY俄罗斯卢布兑美元汇率'],['RUB=X','CCY美元兑俄罗斯卢布汇率'],
|
1624
|
+
['PLNUSD=X','CCY波兰兹罗提兑美元汇率'],['PLN=X','CCY美元兑波兰兹罗提汇率'],
|
1625
|
+
['RONUSD=X','CCY罗马尼亚列伊兑美元汇率'],['RON=X','CCY美元兑罗马尼亚列伊汇率'],
|
1626
|
+
['BGNUSD=X','CCY保加利亚列弗兑美元汇率'],['BGN=X','CCY美元兑保加利亚列弗汇率'],
|
1627
|
+
['ZARUSD=X','CCY南非兰特兑美元汇率'],['ZAR=X','CCY美元兑南非兰特汇率'],
|
1628
|
+
['EGPUSD=X','CCY埃及镑兑美元汇率'],['EGP=X','CCY美元兑埃及镑汇率'],
|
1629
|
+
['MADUSD=X','CCY摩洛哥迪拉姆兑美元汇率'],
|
1630
|
+
['NGNUSD=X','CCY尼日利亚奈拉兑美元汇率'],
|
1631
|
+
['XOFUSD=X','CCY西非法郎兑美元汇率'],
|
1632
|
+
['XAFUSD=X','CCY中非法郎兑美元汇率'],
|
1633
|
+
['XCUUSD=X','CCY安巴东加元兑美元汇率'],
|
1634
|
+
['XDRUSD=X','CCYIMF特别提款权兑美元汇率'],['XDR=X','CCY美元兑IMF特别提款权汇率'],
|
1635
|
+
|
1636
|
+
['USDCNY','美元兑人民币汇率'],['CNYUSD','人民币兑美元汇率'],
|
1637
|
+
['AUDCNY','澳大利亚元兑人民币汇率'],['CNYAUD','人民币兑澳大利亚元汇率'],
|
1638
|
+
['JPYCNY','日元兑人民币汇率'],['CNYJPY','人民币兑日元汇率'],
|
1639
|
+
['USDJPY','美元兑日元汇率'],['JPYUSD','日元兑美元汇率'],
|
1640
|
+
['SGDCNY','新加坡元兑人民币汇率'],['CNYSGD','人民币兑新加坡元汇率'],
|
1641
|
+
['SGDMYR','新加坡元兑马来西亚林吉特汇率'],['MYRSGD','马来西亚林吉特兑新加坡元汇率'],
|
1642
|
+
['EURCNY','欧元兑人民币汇率'],['CNYEUR','人民币兑欧元汇率'],
|
1643
|
+
['GBPCNY','英镑兑人民币汇率'],['CNYGBP','人民币兑英镑汇率'],
|
1644
|
+
['KRWCNY','韩元兑人民币汇率'],['CNYKRW','人民币兑韩元汇率'],
|
1645
|
+
['HKDCNY','港币兑人民币汇率'],['CNYHKD','人民币兑港币汇率'],
|
1646
|
+
['CADCNY','加拿大元兑人民币汇率'],['CNYCAD','人民币兑加拿大元汇率'],
|
1647
|
+
['INRCNY','印度卢比兑人民币汇率'],['CNYINR','人民币兑印度卢比汇率'],
|
1648
|
+
['RUBCNY','俄罗斯卢布兑人民币汇率'],['CNYRUB','人民币兑俄罗斯卢布汇率'],
|
1649
|
+
['MOPCNY','澳门元兑人民币汇率'],['CNYMOP','人民币兑澳门元汇率'],
|
1650
|
+
|
1651
|
+
['AUDJPY','澳大利亚元兑日元汇率'],
|
1652
|
+
|
1653
|
+
['AUDUSD','澳大利亚元兑美元汇率'],
|
1654
|
+
['KRWUSD','韩元兑美元汇率'],
|
1655
|
+
['HKDUSD','港币兑美元汇率'],
|
1656
|
+
['TWDUSD','新台币兑美元汇率'],
|
1657
|
+
['PHPUSD','菲律宾比索兑美元汇率'],
|
1658
|
+
['IDRUSD','印尼盾兑美元汇率'],
|
1659
|
+
['THBUSD','泰铢兑美元汇率'],
|
1660
|
+
['MYRUSD','马来西亚林吉特兑美元汇率'],
|
1661
|
+
['SGDUSD','新加坡币兑美元汇率'],
|
1662
|
+
['INRUSD','印度卢比兑美元汇率'],
|
1663
|
+
['AUDUSD','澳大利亚元兑美元汇率'],
|
1664
|
+
['NZDUSD','新西兰元兑美元汇率'],
|
1665
|
+
['TRYUSD','土耳其里拉兑美元汇率'],
|
1666
|
+
['ILSUSD','新谢克尔兑美元汇率'],
|
1667
|
+
['CADUSD','加拿大元兑美元汇率'],
|
1668
|
+
['MXNUSD','墨西哥比索兑美元汇率'],
|
1669
|
+
['ARSUSD','阿根廷比索兑美元汇率'],
|
1670
|
+
['CLPUSD','智利比索兑美元汇率'],
|
1671
|
+
['BRLUSD','巴西雷亚尔兑美元汇率'],
|
1672
|
+
['EURUSD','欧元兑美元汇率'],
|
1673
|
+
['GBPUSD','英镑兑美元汇率'],
|
1674
|
+
['CHFUSD','瑞士法郎兑美元汇率'],
|
1675
|
+
['HUFUSD','匈牙利福林兑美元汇率'],
|
1676
|
+
['SEKUSD','瑞典克朗兑美元汇率'],
|
1677
|
+
['DKKUSD','丹麦克朗兑美元汇率'],
|
1678
|
+
['NOKUSD','挪威克朗兑美元汇率'],
|
1679
|
+
['RUBUSD','俄罗斯卢布兑美元汇率'],
|
1680
|
+
['PLNUSD','波兰兹罗提兑美元汇率'],
|
1681
|
+
['RONUSD','罗马尼亚列伊兑美元汇率'],
|
1682
|
+
['BGNUSD','保加利亚列弗兑美元汇率'],
|
1683
|
+
['ZARUSD','南非兰特兑美元汇率'],
|
1684
|
+
['EGPUSD','埃及镑兑美元汇率'],
|
1685
|
+
['XDRUSD','IMF特别提款权兑美元汇率'],
|
1578
1686
|
|
1579
|
-
['CNYUSD=X','人民币/美元汇率'],['CNYUSD','人民币/美元汇率'],
|
1580
|
-
['JPYUSD=X','日元/美元汇率'],['JPYUSD','日元/美元汇率'],
|
1581
|
-
['KRWUSD=X','韩元/美元汇率'],['KRWUSD','韩元/美元汇率'],
|
1582
|
-
['HKDUSD=X','港币/美元汇率'],['HKDUSD','港币/美元汇率'],
|
1583
|
-
['TWDUSD=X','新台币/美元汇率'],['TWDUSD','新台币/美元汇率'],
|
1584
|
-
['PHPUSD=X','菲律宾比索/美元汇率'],['PHPUSD','菲律宾比索/美元汇率'],
|
1585
|
-
['IDRUSD=X','印尼盾/美元汇率'],['IDRUSD','印尼盾/美元汇率'],
|
1586
|
-
['THBUSD=X','泰铢/美元汇率'],['THBUSD','泰铢/美元汇率'],
|
1587
|
-
['MYRUSD=X','马来西亚林吉特/美元汇率'],['MYRUSD','马来西亚林吉特/美元汇率'],
|
1588
|
-
['SGDUSD=X','新加坡币/美元汇率'],['SGDUSD','新加坡币/美元汇率'],
|
1589
|
-
['INRUSD=X','印度卢比/美元汇率'],['INRUSD','印度卢比/美元汇率'],
|
1590
|
-
['AUDUSD=X','澳大利亚元/美元汇率'],['AUDUSD','澳大利亚元/美元汇率'],
|
1591
|
-
['NZDUSD=X','新西兰元/美元汇率'],['NZDUSD','新西兰元/美元汇率'],
|
1592
|
-
['TRYUSD=X','土耳其里拉/美元汇率'],['TRYUSD','土耳其里拉/美元汇率'],
|
1593
|
-
['ILSUSD=X','新谢克尔/美元汇率'],['ILSUSD','新谢克尔/美元汇率'],
|
1594
|
-
['VNDUSD=X','越南盾/美元汇率'],
|
1595
|
-
['MOPUSD=X','澳门元/美元汇率'],
|
1596
|
-
['LAKUSD=X','老挝基普/美元汇率'],
|
1597
|
-
['KHRUSD=X','柬埔寨瑞尔/美元汇率'],
|
1598
|
-
['MMKUSD=X','缅甸元/美元汇率'],
|
1599
|
-
['LKRUSD=X','斯里兰卡卢比/美元汇率'],
|
1600
|
-
['PKRUSD=X','巴基斯坦卢比/美元汇率'],
|
1601
|
-
['NPRUSD=X','尼泊尔卢比/美元汇率'],
|
1602
|
-
['AFNUSD=X','阿富汗尼/美元汇率'],
|
1603
|
-
['IRRUSD=X','伊朗里亚尔/美元汇率'],
|
1604
|
-
['IQDUSD=X','伊拉克第纳尔/美元汇率'],
|
1605
|
-
['SYPUSD=X','叙利亚镑/美元汇率'],
|
1606
|
-
['JODUSD=X','约旦第纳尔/美元汇率'],
|
1607
|
-
['SARUSD=X','沙特亚尔/美元汇率'],
|
1608
|
-
['KWDUSD=X','科威特第纳尔/美元汇率'],
|
1609
|
-
['LBPUSD=X','黎巴嫩镑/美元汇率'],
|
1610
|
-
|
1611
|
-
['CADUSD=X','加拿大元/美元汇率'],['CADUSD','加拿大元/美元汇率'],
|
1612
1687
|
['^NYICDX','ICE美元指数'],['DX-Y.NYB','ICE美元指数'],
|
1613
|
-
['MXNUSD=X','墨西哥比索/美元汇率'],['MXNUSD','墨西哥比索/美元汇率'],
|
1614
|
-
['ARSUSD=X','阿根廷比索/美元汇率'],['ARSUSD','阿根廷比索/美元汇率'],
|
1615
|
-
['CLPUSD=X','智利比索/美元汇率'],['CLPUSD','智利比索/美元汇率'],
|
1616
|
-
['BRLUSD=X','巴西雷亚尔/美元汇率'],['BRLUSD','巴西雷亚尔/美元汇率'],
|
1617
|
-
|
1618
|
-
['INRTUS.M','美联储基准利率'],['USDCNY','美元/人民币汇率'],
|
1619
|
-
['AUDCNY','澳大利亚元/人民币汇率'],['JPYCNY','日元/人民币汇率'],
|
1620
|
-
['USDJPY','美元/日元汇率'],['AUDJPY','澳大利亚元/日元汇率'],
|
1621
|
-
|
1622
1688
|
['EUR_I','STOOQ欧元指数'],
|
1623
|
-
|
1624
|
-
|
1625
|
-
['
|
1626
|
-
['
|
1627
|
-
['
|
1628
|
-
['
|
1629
|
-
['
|
1630
|
-
['
|
1631
|
-
['
|
1632
|
-
['
|
1633
|
-
['
|
1634
|
-
|
1635
|
-
['
|
1636
|
-
['
|
1637
|
-
['
|
1638
|
-
['
|
1639
|
-
|
1640
|
-
['
|
1641
|
-
['
|
1642
|
-
['
|
1643
|
-
['
|
1689
|
+
|
1690
|
+
#经济体基准利率
|
1691
|
+
['INRTAU.M','澳大利亚基准利率'],
|
1692
|
+
['INRTBR.M','巴西基准利率'],
|
1693
|
+
['INRTCZ.M','捷克基准利率'],
|
1694
|
+
['INRTCA.M','加拿大基准利率'],
|
1695
|
+
['INRTCH.M','瑞士基准利率'],
|
1696
|
+
['INRTEU.M','欧元区基准利率'],
|
1697
|
+
['INRTHU.M','匈牙利基准利率'],
|
1698
|
+
['INRTIN.M','印度基准利率'],
|
1699
|
+
['INRTIS.M','冰岛基准利率'],
|
1700
|
+
['INRTJP.M','日本基准利率'],
|
1701
|
+
['INRTKR.M','韩国基准利率'],
|
1702
|
+
['INRTMX.M','墨西哥基准利率'],
|
1703
|
+
['INRTMY.M','马来西亚基准利率'],
|
1704
|
+
['INRTNO.M','挪威基准利率'],
|
1705
|
+
['INRTNZ.M','新西兰基准利率'],
|
1706
|
+
['INRTPL.M','波兰基准利率'],
|
1707
|
+
['INRTPH.M','菲律宾基准利率'],
|
1708
|
+
['INRTRO.M','罗马尼亚基准利率'],
|
1709
|
+
['INRTSE.M','瑞典基准利率'],
|
1710
|
+
['INRTTR.M','土耳其基准利率'],
|
1711
|
+
['INRTUS.M','美联储基准利率'],
|
1712
|
+
['INRTUK.M','英国基准利率'],
|
1713
|
+
['INRTZA.M','南非基准利率'],
|
1644
1714
|
|
1645
1715
|
|
1646
1716
|
], columns=['code','codename'])
|
@@ -3186,6 +3256,10 @@ def ticker1_name(ticker,ticker_type='auto'):
|
|
3186
3256
|
#查找证券名称文件:优先股票
|
3187
3257
|
if tt in ['stock']:
|
3188
3258
|
df1=file_position(file='stock_info.pickle',package='siat',mode='read')
|
3259
|
+
|
3260
|
+
#港股
|
3261
|
+
if '.HK' in symbol and len(symbol)==8: symbol=symbol[1:]
|
3262
|
+
|
3189
3263
|
try:
|
3190
3264
|
tname=df1[df1['SYMBOL']==symbol]['CNAME'].values[0]
|
3191
3265
|
except: pass
|
@@ -17,7 +17,7 @@ siat/capm_beta.py,sha256=cxXdRVBQBllhbfz1LeTJAIWvyRYhW54nhtNUXv4HwS0,29063
|
|
17
17
|
siat/capm_beta2.py,sha256=hta-X1iWPjNbG1YYIVlQF-YvKA8An3KuEyLmUEZ3hH8,25562
|
18
18
|
siat/capm_beta_test.py,sha256=ImR0c5mc4hIl714XmHztdl7qg8v1E2lycKyiqnFj6qs,1745
|
19
19
|
siat/cmat_commons.py,sha256=Nj9Kf0alywaztVoMVeVVL_EZk5jRERJy8R8kBw88_Tg,38116
|
20
|
-
siat/common.py,sha256=
|
20
|
+
siat/common.py,sha256=F83kondrh_QRJB5bAw8fKSoh29Vg8AvivdqDDcbg0Hw,142991
|
21
21
|
siat/compare_cross.py,sha256=3iP9TH2h3w27F2ARZc7FjKcErYCzWRc-TPiymOyoVtw,24171
|
22
22
|
siat/compare_cross_test.py,sha256=xra5XYmQGEtfIZL2h-GssdH2hLdFIhG3eoCrkDrL3gY,3473
|
23
23
|
siat/concepts_iwencai.py,sha256=m1YEDtECRT6FqtzlKm91pt2I9d3Z_XoP59BtWdRdu8I,3061
|
@@ -40,8 +40,8 @@ siat/financial_statements_test.py,sha256=FLhx8JD-tVVWSBGux6AMz1jioXX4U4bp9DmgFHY
|
|
40
40
|
siat/financials.py,sha256=mbEZSNeHMMFcnPUryQWvdmNlWQvpnOG9eItgS7IVw3k,80458
|
41
41
|
siat/financials2 - 副本.py,sha256=dKlNjIfKeoSy055fQ6E6TUj9HEoO5Ney9grD84J5kfk,14389
|
42
42
|
siat/financials2.py,sha256=7mnsTncKsgwFu8PP4refh5C5iMIO9P0KOMSF87ZyncY,45736
|
43
|
-
siat/financials_china.py,sha256=
|
44
|
-
siat/financials_china2.py,sha256=
|
43
|
+
siat/financials_china.py,sha256=HdX6YKI4tUC7VnPCTAjtdC3JxGgGepu07wdrpyykxbE,190119
|
44
|
+
siat/financials_china2.py,sha256=mFwWtzwPbantjmXkGsr4CTEj9VRdZe5yITG3VwlJC9E,92655
|
45
45
|
siat/financials_china2_test.py,sha256=Erz5k4LyOplBBvYls2MypuqHpVNJ3daiLdyeJezNPu0,2722
|
46
46
|
siat/financials_china2_test2.py,sha256=C8CuYTMHN4Mhp-sTu-Bmg0zMXRCaYV6ezGDoYartRYQ,3507
|
47
47
|
siat/financials_china2_test3.py,sha256=UXYSA80DNSPRhHpovc2MA9JkpILWMAQaRatbWCHBNPs,3118
|
@@ -85,7 +85,7 @@ siat/option_sina_api_test.py,sha256=dn-k_wrQnAaNKHoROvWJEc7lqlU0bwiV2Aa4usWAFGM,
|
|
85
85
|
siat/proxy_test.py,sha256=erQJrmGs2X46z8Gb1h-7GYQ0rTUcaR8dxHExWoBz2eM,2610
|
86
86
|
siat/quandl_test.py,sha256=EcPoXnLuqzPl5dKyVEZi3j3PJZFpsnU_iNPhLWC9p-A,1552
|
87
87
|
siat/risk_adjusted_return.py,sha256=L5FoeOFzvItT03gNBTCaIo32hUvncOJkbchtHOveSBM,54929
|
88
|
-
siat/risk_adjusted_return2.py,sha256=
|
88
|
+
siat/risk_adjusted_return2.py,sha256=y9Eux9bbQgprFs_a-0J-7pC9P4yEpJHssDbcbFct0K0,64338
|
89
89
|
siat/risk_adjusted_return_test.py,sha256=m_VHL5AtT74cJv5i7taTeTfnkX48y0AFJk5phawyYWg,3416
|
90
90
|
siat/risk_evaluation.py,sha256=I6B3gty-t--AkDCO0tKF-291YfpnF-IkXcFjqNKCt9I,76286
|
91
91
|
siat/risk_evaluation_test.py,sha256=YEXM96gKzTfwN4U61AS4Rr1tV7KgUvn4rRC6f3iMw9s,3731
|
@@ -95,16 +95,16 @@ siat/sector_china.py,sha256=QSNJclhzT6V9NidziMwwAs-Kk6f7nzdK6PiPGkKrBCk,111617
|
|
95
95
|
siat/sector_china_test.py,sha256=1wq7ef8Bb_L8F0h0W6FvyBrIcBTEbrTV7hljtpj49U4,5843
|
96
96
|
siat/security_price.py,sha256=2oHskgiw41KMGfqtnA0i2YjNNV6cYgtlUK0j3YeuXWs,29185
|
97
97
|
siat/security_price2.py,sha256=kuYh0V5cqclkM6MjZUd-N361fv3oxGVVerYINuTzZrE,24622
|
98
|
-
siat/security_prices.py,sha256=
|
98
|
+
siat/security_prices.py,sha256=m_dWQ24Au9WMNOb1o0Igm6Sg1llz7kyIX3vSXrE5Jng,102705
|
99
99
|
siat/security_prices_test.py,sha256=OEphoJ87NPKoNow1QA8EU_5MUYrJF-qKoWKNapVfZNI,10779
|
100
100
|
siat/security_trend.py,sha256=o0vpWdrJkmODCP94X-Bvn-w7efHhj9HpUYBHtLl55D0,17240
|
101
|
-
siat/security_trend2.py,sha256=
|
101
|
+
siat/security_trend2.py,sha256=4yBY3ve0Kddu95JemS02gfLbrHVN2_gl_irr5pA4F6w,24626
|
102
102
|
siat/setup.py,sha256=up65rQGLmTBkhtaMLowjoQXYmIsnycnm4g1SYmeQS6o,1335
|
103
103
|
siat/shenwan index history test.py,sha256=JCVAzOSEldHalhSFa3pqD8JI_8_djPMQOxpkuYU-Esg,1418
|
104
|
-
siat/stock.py,sha256=
|
104
|
+
siat/stock.py,sha256=9w7LzOZzt-gAzfdVfYB8nd73DrG73wLmFpIolJKUCBc,139188
|
105
105
|
siat/stock_advice_linear.py,sha256=-twT7IGP-NEplkL1WPSACcNJjggRB2j4mlAQCkzOAuo,31655
|
106
106
|
siat/stock_base.py,sha256=uISvbRyOGy8p9QREA96CVydgflBkn5L3OXOGKl8oanc,1312
|
107
|
-
siat/stock_china.py,sha256=
|
107
|
+
siat/stock_china.py,sha256=zyUyghIrkkkYWlHRRP7Hoblxzfp-jrck60pTJpwMahg,91553
|
108
108
|
siat/stock_china_test.py,sha256=eO4HWsSvc6qezl0LndjtL24lViEyrBjH_sx2c2Y2Q2M,1294
|
109
109
|
siat/stock_info.pickle,sha256=IGUkPbvwtXbngKBMWAzgYhplE96FucuTfnc26wvBiLQ,1319270
|
110
110
|
siat/stock_info_test.py,sha256=gfG3DbhDACbtD8wnv_R6zhj0t11XaC8NX8uLD9Qv3Fo,6122
|
@@ -126,13 +126,13 @@ siat/transaction_test.py,sha256=Z8g1LJCN4-mnUByXMUMoFmN0t105cbmsz2QmvSuIkbU,1858
|
|
126
126
|
siat/translate-20230125.py,sha256=NPPSXhT38s5t9fzMvl_fvi4ckSB73ThLmZetVI-xGdU,117953
|
127
127
|
siat/translate-20230206.py,sha256=-vtI125WyaJhmPotOpDAmclt_XnYVaWU9ByLWZ6FyYE,118133
|
128
128
|
siat/translate-20230215.py,sha256=TJgtPE3n8IjljmZ4Pefy8dmHoNdFF-1zpML6BhA9FKE,121657
|
129
|
-
siat/translate.py,sha256=
|
129
|
+
siat/translate.py,sha256=dqzySnqC0A0IxFKhY1AUvBbj3RIE5_l_wRMn-ZJNJxs,215034
|
130
130
|
siat/universal_test.py,sha256=CDAOffW1Rvs-TcNN5giWVvHMlch1w4dp-w5SIV9jXL0,3936
|
131
131
|
siat/valuation.py,sha256=NKfeZMdDJOW42oLVHob6eSVBXUqlN1OCnnzwyGAst8c,48855
|
132
132
|
siat/valuation_china.py,sha256=Tde2LzPDQy3Z7xOQQDw4ckQMPdROp_z0-GjFE6Z5_lI,67639
|
133
133
|
siat/valuation_market_china_test.py,sha256=gbJ0ioauuo4koTPH6WKUkqcXiQPafnbhU5eKJ6lpdLA,1571
|
134
134
|
siat/var_model_validation.py,sha256=f-oDewg7bPzyNanz_Y_jLH68NowAA3gXFehW_weKGG0,14898
|
135
|
-
siat-3.0.
|
136
|
-
siat-3.0.
|
137
|
-
siat-3.0.
|
138
|
-
siat-3.0.
|
135
|
+
siat-3.0.43.dist-info/METADATA,sha256=8x9wW6A3GWrxYLw-PKD4UfzcY4MPZby_RNo1socVEyw,1448
|
136
|
+
siat-3.0.43.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
|
137
|
+
siat-3.0.43.dist-info/top_level.txt,sha256=r1cVyL7AIKqeAmEJjNR8FMT20OmEzufDstC2gv3NvEY,5
|
138
|
+
siat-3.0.43.dist-info/RECORD,,
|
File without changes
|