精選文章

資產配置>>推薦好用的ETF網站

2022年4月11日 星期一

元晶6443 - 太陽能模組廠

2022/4/11 本日成交值前五大股票:台積電、長榮、智原、元晶、聯電



其中 元晶(6443) 來簡介一下:

近期躍升為台灣第一大太陽能模組廠。英文名字TSEC


2015年掛牌,剛開始產能不到50MW(百萬瓦),現在已來到1.5GW(十億瓦)(after今年四月跟七月擴廠後的產能)



CEO 廖國賢說:台灣已經是全球第二大太陽能產業領導者。


若台灣要在25年達到太陽能發電容量20GW,其實只需要2.5萬公頃的土地就好,而台灣目前有20萬公頃的土地休耕跟廢耕,台陽能裝置量應該達標沒問題


科普時間:發電容量20GW= 在100%效率下,一小時可以發20百萬度,一天24*20=480百萬度。


目前太陽能模組可以分成 G1 M6 M10 G12四種,台灣多數模組廠是G1舊型模組。


但元晶投資的是M10 G12這種新式模組,預計每片電池模組的發電功率可以達到舊模組兩倍


目前年成長80%,業績能見度到第三季。法人預估年營收年增率6成。


特斯拉的太陽能事業solar city因設計的屋頂太陽能板必須外觀看起來像屋瓦,電池必須有不反光的效果。日本廠商難以配合 讓這個機會給了元晶。


相關訊息可留意下半年有可能定案。


此外市場也期待SpaceX的低軌衛星太陽能模組商機,元晶也有機會爭取。


本年度EPS上看2元 收盤股價44元



知識點:


台灣整體年均日照接近1,800小時,發展條件良好[1]。政府目標於2025年,太陽光電累計安裝容量達2,000萬瓩(20GW),其中屋頂型太陽光電目標300萬瓩(3GW),包括水域面積在內的地面型太陽光電1,700萬瓩(17GW)



若以台灣2025年裝置容量20GW、平均容量因數14% 來計算台灣一天太陽能發電度數可達:


20GW*1天*24小時*14% 容量因數 = 67 GWh(百萬度),1GWh = 1百萬度。


全台灣一天使用的量大概是600GWh(百萬度) 。工業用340 GWh、民用250GWh。


名詞解釋:

常見能源單位https://smctw.tw/4223/


台灣電力供應狀況https://www.taipower.com.tw/tc/page.aspx?mid=210&cid=340&cchk=eac92988-526f-44e3-a911-1564395de297



2022年4月9日 星期六

美聯儲2022年4月會議紀要公布後,市場狀況:

 美聯儲利率會議紀要本周末公布後....

1.利率期貨預期年底時候Federal funds rate將會提高至1.7%,相比一月會議時候,這個數字提高了70bps

2.具體量化緊縮計畫,是美聯儲資產負債表每月縮減600億國債與350億MBS。非賣資產而是到期不續作(runoff)

   美聯儲資產負債表上,持有美國國債每月到期狀況:
    4月 約有1200億國債到期 (600億到期不再投資)
    5月 約有1500億國債到期
    6月 約有750億國債到期 
    等於六月後所有到期國債幾乎都不再投資

3. 美國國債對GDP比例上升到137%,自從1800 有52個國家都壞帳了,除了日本,但日本也是唯一個實行長期利率曲線控制的國家

但美國自己發國債還不了錢這是不太可能的,因為美國的美元地位讓自己可以印錢還債。但正因當前時期美國面對高通膨不再選擇印錢甚至是QT量化緊縮。
在這種情形下如何面對高債務的問題?

方法:

2015 IMF 文章提到:金融抑制 Financial repression = Neg Real Interest Rate 就是將利率壓在低於通膨的位置,這種藉著負實質利率的概念,就是藉由通膨來增加GDP,降低債務負擔(國債/GDP比例),也是透過通膨讓債務變得不值錢。(軟壞帳的概念)

這種方式懲罰了持債者或是存款者,就像是對這些人徵稅一樣。
巨大的通膨會讓債券持有者最終被還賬的時候所收到的錢在通膨調整後比起當初被借出去的錢少一大段

美國運用類似概念可以回溯到1940年代
一邊利用高通膨來充帳GDP,一邊也維持住不讓利息跟通貨膨脹差太遠;利息太高會導致消費者減少消費衝擊GDP,低息太低可能會讓通膨失控造成經濟危機跟股災,因為這也同時會影響未來消費信心; 



結論:

美國FED正在有計畫的走鋼絲,實行金融抑制(軟壞帳),同時不能讓通膨失控(造成經濟危機)。

現金投資報酬率為負,抗通膨的資產配置是什麼? 股票(高殖利率、高成長股)




2022年2月20日 星期日

[Backtrader 量化投資平台] 一次多商品 cerebro.adddata()

import yfinance as yf
import pandas as pd
import backtrader as bt

cerebro = bt.Cerebro(stdstats=False)

stock_tw_ticker = ['2330.TW','2454.TW','2884.TW']
for symbol in stock_tw_ticker:

   使用yfinance套件抓取股價開高低收資料
  df=yf.download(symbol,start='2019-12-01',end='2022-2-18')
   df = df[['Open','High','Low','Close','Volume']]
   df.index= pd.to_datetime(df.index)
   df.columns=['open','high','low','close','volume']
   
    #順便output 方便觀察rawdata
   df.to_csv(f'{symbol}.csv')
   datafeed = bt.feeds.PandasData(dataname=df,name=symbol)

   cerebro.adddata(datafeed)

    

[Backtrader 量化投資平台] Strategy 策略類中 呼叫時間點的方法 self.data.datetime.datetime(0)

class MyStrategy(bt.Strategy):
    ...
    next(self):
      
        tday = self.datas[0].datetime.datetime(0).day
        tday = self.datas[0].datetime.date(0).day
        #以上兩者都可以呼叫到當天交易日是哪一天,datetime可以細到時分秒,date只到日期

        如果要取前一天日期的話 可以在最後一個datetime(-1) -1就是前一天概念
        previous_day = self.datas[0].datetime.datetime(-1).day
        previous_day = self.datas[0].datetime.date(-1).day


輸出結果:
self.datas[0].datetime.datetime(0) = 2020-12-22 00:00:00
self.datas[0].datetime.datetime(0).day =22
self.datas[0].datetime.date(0).day =22
self.datas[0].datetime.datetime(-1) = 21

2022年2月19日 星期六

[Backtrader 量化投資平台] 運用python量化投資平台backtrader 實現ETF動量資產配置回測

 策略發想:

運用 兩檔兩檔台灣ETF 006208與00895 來進行投資組合建構
該策略使用 商品的短均與長均進行情境判讀,兩種商品 共有四種情境
依照四種情境不同,給予不同投資權重
策略名稱: sma_double_line
當兩個ETF短均都在長均之上,則進行 50% 50%的權重配置
當兩個ETF 短均都在長均之下,則進行15% 15% 的權重配置,剩下放現金
當一個ETF短均在長均上、一個短均在長均下時候,則進行50% 15%的權重配置

輸出結果:


**策略最新狀態
-------data1----------------
TW006208 持有股數: 5623
TW006208 持有成本: 79.28
-------data2----------------
TW00895 持有股數: 27456
TW00895 持有成本: 17.41
**

Backtrader : sma_double_line 程式碼



import yfinance as yf
import backtrader as bt
import datetime as dt
import matplotlib.pyplot as plt
import pandas as pd

#輸入資料
tw006208 = yf.Ticker('006208.TW')
df1=yf.download('006208.TW',start='2021-08-12',end='2022-2-14')
df1 = df1[['Open','High','Low','Close','Volume']]
df1.index= pd.to_datetime(df1.index)
df1.columns=['open','high','low','close','volume']
df1.fillna(0)
df1.to_csv('TW006208.csv')

tw00895 = yf.Ticker('00895.TW')
df2=yf.download('00895.TW',start='2021-08-12',end='2022-2-14')
df2 = df2[['Open','High','Low','Close','Volume']]
df2.index= pd.to_datetime(df2.index)
df2.columns=['open','high','low','close','volume']
df2.fillna(0)
df2.to_csv('TW00895.csv')


#創建策略:
class Sma_double_line(bt.SignalStrategy):
    # list of parameters which are configurable for the strategy
    params = dict(
        pfast=10,  # period for the fast moving average
        pslow=30   # period for the slow moving average
    )

    def __init__(self):
        self.d0_sma1 = bt.ind.SMA(self.data0.close,period=self.p.pfast)  
        # data0 fast moving average
        self.d0_sma2 = bt.ind.SMA(self.data0.close,period=self.p.pslow)  
        # data0 slow moving average
       
        self.d1_sma1 = bt.ind.SMA(self.data1.close,period=self.p.pfast)  
        # data1 fast moving average
        self.d1_sma2 = bt.ind.SMA(self.data1.close,period=self.p.pslow)  
        # data1 slow moving average      
       
        #crossover = bt.ind.CrossOver(sma1, sma2)  # crossover signal
       

    def next(self):
             
        if  self.d0_sma1[0] > self.d0_sma2[0] and  self.d1_sma1 > self.d1_sma2[0] :
            self.order_target_percent(target=0.5,data='TW006208')
            self.order_target_percent(target=0.5,data='TW00895')            
                   
        if  self.d0_sma1[0] < self.d0_sma2[0] and  self.d1_sma1 < self.d1_sma2[0] :
            self.order_target_percent(target=0.15,data='TW006208')
            self.order_target_percent(target=0.15,data='TW00895')  
           
        if  self.d0_sma1[0] > self.d0_sma2[0] and  self.d1_sma1 < self.d1_sma2[0] :
            self.order_target_percent(target=0.5,data='TW006208')
            self.order_target_percent(target=0.15,data='TW00895')  
   
        if  self.d0_sma1[0] < self.d0_sma2[0] and  self.d1_sma1 > self.d1_sma2[0] :
            self.order_target_percent(target=0.15,data='TW006208')
            self.order_target_percent(target=0.5,data='TW00895')

# backtrader執行區域:
if __name__ == '__main__':
    cerebro = bt.Cerebro(stdstats=False)
    cerebro.addobserver(bt.observers.Value)
    cerebro.addobserver(bt.observers.DrawDown)
   
    datafeed1 = bt.feeds.PandasData(dataname=df1,name='TW006208')
    datafeed2 = bt.feeds.PandasData(dataname=df2,name='TW00895')
    cerebro.adddata(datafeed1)
    cerebro.adddata(datafeed2)
    cerebro.addstrategy(Sma_double_line)
    cerebro.addsizer(bt.sizers.AllInSizer,percents=99)
   
    cerebro.broker.setcash(3000000)
    cerebro.run()
    pos1 = cerebro.broker.getposition(datafeed1)
    pos2 = cerebro.broker.getposition(datafeed2)
   
    print('-------data1----------------')
    print('TW006208 size:', pos1.size)
    print('TW006208 price:', pos1.price)
   
    print('-------data2----------------')
    print('TW00895 size:', pos2.size)
    print('TW00895 price:', pos2.price)
    cerebro.plot(iplot=False,style='candlestick')
   
    print('value:', cerebro.broker.get_value())
    print('cash:', cerebro.broker.get_cash())


結論:

    這個例子舉了一個實例,放兩個以上的資產到backtrader平台進行策略模擬回測。未來可以隨意依照多個指標的交互關係進行權重配置。

    由此例子就可以看出backtrader的回測彈性很高,可延伸更多應用,例如:加入更多商品,各商品編制不同指標與指標參數來形成訊號調整多個商品的投資比重。