ניהול תיק דיבידנדים: איך לעקוב אחרי 50 מניות בלי להשתגע

refaelsh

Active Member
הצטרף
31/5/25
מובן ומסכים!
תודה רבה לך :)

אני מבין. תודה רבה לך! :)
 

batata

New Member
הצטרף
4/6/25
נניח יש לי כבר תיק עם 50 מניות דיבידנד.
איך אתם יודעים כאשר אחר מהם פשטה את הרגל? או כל דבר אחר? מלא תסריטים אפשריים.
הרי אי אפשר להיכנס לאיזה אתר או משהו בשביל כל מניה? זה יוצא כפול 50!
מה באמת אתם עושים?
אחת לחודש/כמה חודשים מורידה מאתר הבנק פירוט עם כל תנועות הדיווידנד,
יש לי סקריפט פייתון שלוקח את זה ומזין לתוך אקסל שלי עם מעקב דיווידנדים שצובע לי בצבעים יפים אם ההכנסות מאיזו מניה ירדו או עלו וגם משווה את ההכנסות הכוללות לאותו חודש משנה שעברה.
זה בעיקר כייף לראות את התזרים עולה לאורך זמן אבל גם שימושי כדי להבין אם מניה מסוימת מגמגמת.

גם ככה אני לא מאמינה בלמכור מייד, אלא בלהמתין ולראות לאן נושבת הרוח
 

daat99

מייסד
מנהל
הצטרף
22/11/15
אחת לחודש/כמה חודשים מורידה מאתר הבנק פירוט עם כל תנועות הדיווידנד,
יש לי סקריפט פייתון שלוקח את זה ומזין לתוך אקסל שלי עם מעקב דיווידנדים שצובע לי בצבעים יפים אם ההכנסות מאיזו מניה ירדו או עלו וגם משווה את ההכנסות הכוללות לאותו חודש משנה שעברה.
זה בעיקר כייף לראות את התזרים עולה לאורך זמן אבל גם שימושי כדי להבין אם מניה מסוימת מגמגמת.

גם ככה אני לא מאמינה בלמכור מייד, אלא בלהמתין ולראות לאן נושבת הרוח
ברוכה הבאה לפורום.
תודה שבחרת לשתף את גישתך ולהחכים את שאר הנוכחים :)
 

מומו

Well-Known Member
הצטרף
12/2/19
יש לי סקריפט פייתון שלוקח את זה ומזין לתוך אקסל שלי עם מעקב דיווידנדים שצובע לי בצבעים יפים אם ההכנסות מאיזו מניה ירדו או עלו וגם משווה את ההכנסות הכוללות לאותו חודש משנה שעברה.
נשמע מאוד מעניין, יש סיכוי לשיתוף הקוד כדי שנוכל ללמוד ממנו?
 

batata

New Member
הצטרף
4/6/25
נשמע מאוד מעניין, יש סיכוי לשיתוף הקוד כדי שנוכל ללמוד ממנו?
האמת שאני לא חושבת שאפשר ללמוד ממנו הרבה, זה פשוט קריאה של אקסל ועדכון באקסל אחר והעלאה שלו לדרייב.
זה גם תלוי בפורמט של הבנק/בית השקעות שלך.
לא חתיכת הקוד שאני הכי גאה בה אבל עושה את העבודה :)

Python:
import os
import pandas as pd
from datetime import datetime
import openpyxl
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

local_file_name = 'income/output/My Account_updated.xlsx'

# Constants
DIVIDEND_ACTION_TEXT = "דבידנד תשלום"  # Hebrew text for "Dividend Payment"


def read_file(file_name):
    relevant_cols = ["תאריך נכונות", "סוג פעולה", "סכום עיסקה נטו מט\"ח", "סימבול OSI"]

    available_cols = pd.read_excel(file_name, nrows=0).columns
    missing_cols = [col for col in relevant_cols if col not in available_cols]
    if missing_cols:
        raise KeyError(f"The following required columns are missing in the file: {missing_cols}")
    data = pd.read_excel(file_name, usecols=relevant_cols)
    data.rename(columns={'תאריך נכונות': 'date', 'סוג פעולה': 'action', 'סכום עיסקה נטו מט\"ח': 'amount', 'סימבול OSI': 'stock'}, inplace=True)
    # print(data)
    data['date'] = pd.to_datetime(data['date'], format='%d/%m/%Y')

    print('number of rows loaded: ' + str(len(data)))

    data = data[(data.amount > 0) & (data.action == DIVIDEND_ACTION_TEXT) & (data.date >= datetime(2025, 1, 1))]
    print('number of rows after filtering: ' + str(len(data)))

    # print(data)
    return data


# Press the green button in the gutter to run the script.
def update_data(dividends_received, input_file_path):
    # open the Excel file
    workbook = openpyxl.load_workbook(input_file_path)

    # select the sheet to modify
    if 'Dividends' not in workbook.sheetnames:
        raise KeyError("The sheet 'Dividends' is missing in the Excel file.")
    sheet = workbook['Dividends']
    header_row = sheet[1]

    for index, row in dividends_received.iterrows():
        # find column to update
        company_col = None
        month_row = None
        for column_cell in header_row:
            if column_cell.value == row['stock']:
                company_col = column_cell.column
                # print('company: ' + str(row['stock']) + ', column: ' + str(column_cell))
                break

        if company_col is None:
            print('Error: Column not found for company: ' + str(row['stock']))
            continue

        # find row to update
        div_month = pd.to_datetime(row['date'], format='%d/%m/%Y').month_name().lower()
        for rowNumber in range(3, 15):
            if div_month == str(sheet.cell(row=rowNumber, column=1).value).lower():
                month_row = rowNumber
                # print('month: ' + div_month + ', row: ' + str(month_row))
                break

        if month_row is None:
            print('HELP!!! Could not find row for month: ' + div_month)
            continue

        target_cell = sheet.cell(row=month_row, column=company_col)
        prev_value = target_cell.value

        if prev_value is None:
            target_cell.value = row['amount']
            print(row['stock'], "Updated cell", month_row, ":", company_col, "from value: None to new value:", row['amount'])
        elif prev_value != row['amount']:
            print(row['stock'], "ERR: DID NOT Update cell", month_row, ":", company_col, "from value: ", prev_value, "to new value:", row['amount'])
        else:
            pass

    workbook.save(local_file_name)


def upload_to_drive():
    gauth = GoogleAuth()
    # This method opens a local web server for authentication.
    # Ensure that your firewall or network settings allow this operation.
    gauth.LocalWebserverAuth()
    drive = GoogleDrive(gauth)

    drive_file_name = 'My Account_{date}.xlsx'.format(date=datetime.now().strftime('%Y-%m-%d'))

    f = drive.CreateFile({'title': drive_file_name})
    f.SetContentFile(local_file_name)
    f.Upload()

    # Due to a known bug in pydrive if we
    # don't empty the variable used to
    # upload the files to Google Drive the
    # file stays open in memory and causes a
    # Explicitly setting f to None to avoid memory leaks due to a known bug in PyDrive.
    # Check if this bug has been resolved in newer versions of PyDrive.
    f = None
    print('File uploaded successfully to Google Drive as:', drive_file_name)


if __name__ == '__main__':
    dividends_received = read_file('income/input/ביצועים היסטוריים.xlsx')
 
    update_data(dividends_received, 'income/input/My Account.xlsx')
    upload_to_drive()
 

daat99

מייסד
מנהל
הצטרף
22/11/15
האמת שאני לא חושבת שאפשר ללמוד ממנו הרבה
מכל מלמדי השכלתי.
מה שנראה לך טריויאלי ואת לא גאה בו, יכול להיות מאוד מרשים ומועיל למישהו עם פחות ניסיון מקצועי ממך.

תודה רבה שבחרת לשתף את יכולותיך ברבים :)
 

מומו

Well-Known Member
הצטרף
12/2/19
האמת שאני לא חושבת שאפשר ללמוד ממנו הרבה, זה פשוט קריאה של אקסל ועדכון באקסל אחר והעלאה שלו לדרייב.
זה גם תלוי בפורמט של הבנק/בית השקעות שלך.
לא חתיכת הקוד שאני הכי גאה בה אבל עושה את העבודה :)
קטונתי בלתת ציונים ושבחים אבל מבחינתי מדהים, שאפו ענק על הרעיון !!!

עד היום בכל חודש-חודשיים הייתי מוציא את הסטייטמנט מהברוקר ומדביק את החלקים של Dividneds וה-Withholding Tax לגיליון בצורה ידנית.
לא צעדים שאני הכי גאה בהם אבל עושה את העבודה ;)

תודה רבה, שיתוף הקוד נותן רעיונות לאחרים, בע"ה אנסה ללמוד מהקוד שלך את הטכניקה כדי ליישם עבור IB
 
למעלה תחתית